[譯] fasthttp 文件手冊

davidcai1993發表於2016-10-11

fasthttp 文件手冊

貌似文章有最大長度限制,完整全文地址:https://github.com/DavidCai1993/my-blog/issues/35

常量

const (
    CompressNoCompression      = flate.NoCompression
    CompressBestSpeed          = flate.BestSpeed
    CompressBestCompression    = flate.BestCompression
    CompressDefaultCompression = flate.DefaultCompression
)

所支援的壓縮級別。

const (
    StatusContinue           = 100 // RFC 7231, 6.2.1
    StatusSwitchingProtocols = 101 // RFC 7231, 6.2.2
    StatusProcessing         = 102 // RFC 2518, 10.1

    StatusOK                   = 200 // RFC 7231, 6.3.1
    StatusCreated              = 201 // RFC 7231, 6.3.2
    StatusAccepted             = 202 // RFC 7231, 6.3.3
    StatusNonAuthoritativeInfo = 203 // RFC 7231, 6.3.4
    StatusNoContent            = 204 // RFC 7231, 6.3.5
    StatusResetContent         = 205 // RFC 7231, 6.3.6
    StatusPartialContent       = 206 // RFC 7233, 4.1
    StatusMultiStatus          = 207 // RFC 4918, 11.1
    StatusAlreadyReported      = 208 // RFC 5842, 7.1
    StatusIMUsed               = 226 // RFC 3229, 10.4.1

    StatusMultipleChoices  = 300 // RFC 7231, 6.4.1
    StatusMovedPermanently = 301 // RFC 7231, 6.4.2
    StatusFound            = 302 // RFC 7231, 6.4.3
    StatusSeeOther         = 303 // RFC 7231, 6.4.4
    StatusNotModified      = 304 // RFC 7232, 4.1
    StatusUseProxy         = 305 // RFC 7231, 6.4.5

    StatusTemporaryRedirect = 307 // RFC 7231, 6.4.7
    StatusPermanentRedirect = 308 // RFC 7538, 3

    StatusBadRequest                   = 400 // RFC 7231, 6.5.1
    StatusUnauthorized                 = 401 // RFC 7235, 3.1
    StatusPaymentRequired              = 402 // RFC 7231, 6.5.2
    StatusForbidden                    = 403 // RFC 7231, 6.5.3
    StatusNotFound                     = 404 // RFC 7231, 6.5.4
    StatusMethodNotAllowed             = 405 // RFC 7231, 6.5.5
    StatusNotAcceptable                = 406 // RFC 7231, 6.5.6
    StatusProxyAuthRequired            = 407 // RFC 7235, 3.2
    StatusRequestTimeout               = 408 // RFC 7231, 6.5.7
    StatusConflict                     = 409 // RFC 7231, 6.5.8
    StatusGone                         = 410 // RFC 7231, 6.5.9
    StatusLengthRequired               = 411 // RFC 7231, 6.5.10
    StatusPreconditionFailed           = 412 // RFC 7232, 4.2
    StatusRequestEntityTooLarge        = 413 // RFC 7231, 6.5.11
    StatusRequestURITooLong            = 414 // RFC 7231, 6.5.12
    StatusUnsupportedMediaType         = 415 // RFC 7231, 6.5.13
    StatusRequestedRangeNotSatisfiable = 416 // RFC 7233, 4.4
    StatusExpectationFailed            = 417 // RFC 7231, 6.5.14
    StatusTeapot                       = 418 // RFC 7168, 2.3.3
    StatusUnprocessableEntity          = 422 // RFC 4918, 11.2
    StatusLocked                       = 423 // RFC 4918, 11.3
    StatusFailedDependency             = 424 // RFC 4918, 11.4
    StatusUpgradeRequired              = 426 // RFC 7231, 6.5.15
    StatusPreconditionRequired         = 428 // RFC 6585, 3
    StatusTooManyRequests              = 429 // RFC 6585, 4
    StatusRequestHeaderFieldsTooLarge  = 431 // RFC 6585, 5
    StatusUnavailableForLegalReasons   = 451 // RFC 7725, 3

    StatusInternalServerError           = 500 // RFC 7231, 6.6.1
    StatusNotImplemented                = 501 // RFC 7231, 6.6.2
    StatusBadGateway                    = 502 // RFC 7231, 6.6.3
    StatusServiceUnavailable            = 503 // RFC 7231, 6.6.4
    StatusGatewayTimeout                = 504 // RFC 7231, 6.6.5
    StatusHTTPVersionNotSupported       = 505 // RFC 7231, 6.6.6
    StatusVariantAlsoNegotiates         = 506 // RFC 2295, 8.1
    StatusInsufficientStorage           = 507 // RFC 4918, 11.5
    StatusLoopDetected                  = 508 // RFC 5842, 7.2
    StatusNotExtended                   = 510 // RFC 2774, 7
    StatusNetworkAuthenticationRequired = 511 // RFC 6585, 6
)

與 net/http 相同的 HTTP 狀態嗎。

const DefaultConcurrency = 256 * 1024

DefaultConcurrency 為預設情況下(沒有設定 Server.Concurrency 時)伺服器可以接受的最大併發請求數。

const DefaultDNSCacheDuration = time.Minute

DefaultDNSCacheDuration 是由 Dial* 函式族快取處理過的 TCP 地址的持續時間。

const DefaultDialTimeout = 3 * time.Second

DefaultDialTimeout 是由 DialDialDualStack 使用的用於建立 TCP 連線的超時時間。

const DefaultMaxConnsPerHost = 512

DefaultMaxConnsPerHost 是 http 客戶端在預設情況下(如果沒有設定 Client.MaxConnsPerHost)單個 host 可以建立的最大併發連線數。

const DefaultMaxIdleConnDuration = 10 * time.Second

DefaultMaxIdleConnDuration 是在空閒的 keep-alive 連線被關閉前預設的持續時間。

const DefaultMaxPendingRequests = 1024

DefaultMaxPendingRequestsPipelineClient.MaxPendingRequests 的預設值。

const DefaultMaxRequestBodySize = 4 * 1024 * 1024

DefaultMaxRequestBodySize 是伺服器預設可讀的最大請求體大小。

更多詳情請參閱 Server.MaxRequestBodySize

const FSCompressedFileSuffix = ".fasthttp.gz"

FSCompressedFileSuffix 是當需要使用新檔名儲存被壓縮後的檔案時, FS 在原始檔名上新增的字首。更多詳情請參閱 FS.Compress

const FSHandlerCacheDuration = 10 * time.Second

FSHandlerCacheDuration 是由 FS 所開啟的非活躍檔案控制程式碼的預設失效時間。

變數

var (
    // ErrNoFreeConns 在當特定的 host 沒有可用的連線時返回。
    //
    // 如果你看到了這個錯誤,你可以選擇調高每個 host 可用的連線數。
    ErrNoFreeConns = errors.New("no free connections available to host")

    // ErrTimeout 在呼叫超時時返回。
    ErrTimeout = errors.New("timeout")

    // ErrConnectionClosed 會在當服務端在返回第一個相應位元組前被關閉時,
    // 於客戶端方法中返回。
    //
    // 如果你看到了這個錯誤,你可以在服務端關閉連線前通過 `'Connection: close'` 相應頭
    // 來修復這個錯誤,或者在客戶端傳送請求前新增 `'Connection: close'` 請求頭。
    ErrConnectionClosed = errors.New("the server closed connection before returning the first response byte. " +
        "Make sure the server returns 'Connection: close' response header before closing the connection")
)
var (
    // CookieExpireDelete 可以會被支援於 `Cookie.Expire` 中,用於為指定
    // cookie 新增過期。
    CookieExpireDelete = time.Date(2009, time.November, 10, 23, 0, 0, 0, time.UTC)

    // CookieExpireUnlimited 用於表明該 cookie 不會過期。
    CookieExpireUnlimited = zeroTime
)
var (
    // ErrPerIPConnLimit 會在任一 ip 連線數超過 Server.MaxConnsPerIP 時
    // 由 ServeConn 返回。
    ErrPerIPConnLimit = errors.New("too many connections per ip")

    // ErrConcurrencyLimit 會在併發連線數超過 Server.Concurrency 時由
    // ServeConn 返回。
    ErrConcurrencyLimit = errors.New("canot serve the connection because Server.Concurrency concurrent connections are served")

    // ErrKeepaliveTimeout 會在連線的時長超過 MaxKeepaliveDuration 時
    // 由 ServeConn 返回。
    ErrKeepaliveTimeout = errors.New("exceeded MaxKeepaliveDuration")
)
var ErrBodyTooLarge = errors.New("body size exceeds the given limit")

ErrBodyTooLarge 會在請求體或者響應體超過指定限制時返回。

var ErrDialTimeout = errors.New("dialing to the given TCP address timed out")

ErrDialTimeout 會在 TCP 握手超時時觸發。

var ErrMissingFile = errors.New("there is no uploaded file associated with the given key")

ErrMissingFile 會在沒有與指定的 multipart 表單鍵相關聯的被上傳檔案時由 FormFile 返回。

var ErrNoArgValue = errors.New("no Args value for the given key")

ErrNoArgValue 會在指定 Args 鍵缺少值時返回。

var ErrNoMultipartForm = errors.New("request has no multipart/form-data Content-Type")

ErrNoMultipartForm 意味著請求的 Content-Type 不是 'multipart/form-data'

var ErrPipelineOverflow = errors.New("pipelined requests' queue has been overflown. Increase MaxConns and/or MaxPendingRequests")

ErrPipelineOverflow 會在請求的佇列溢位時,由 PipelineClient.Do* 函式族返回。

func AppendBytesStr

func AppendBytesStr(dst []byte, src string) []byte

AppendBytesStrdst 追加 src ,並且返回追加後的 dst

這個函式與 append(dst, src...) 的效能沒有差別。目前它僅用於向後相容。

這個函式已經棄用並且可能很快被移除。

func AppendGunzipBytes

func AppendGunzipBytes(dst, src []byte) ([]byte, error)

AppendGunzipBytesdst 追加 gunzip 壓縮後的 src ,並且返回追加後的 dst

func AppendGzipBytes

func AppendGzipBytes(dst, src []byte) []byte

AppendGzipBytesdst 追加 gzip 壓縮後的 src ,並且返回追加後的 dst

func AppendGzipBytesLevel

func AppendGzipBytesLevel(dst, src []byte, level int) []byte

AppendGzipBytesLeveldst 追加指定級別的 gzip 壓縮後的 src ,並且返回追加後的 dst

支援的壓縮級別有:

  • CompressNoCompression
  • CompressBestSpeed
  • CompressBestCompression
  • CompressDefaultCompression

func AppendHTMLEscape

func AppendHTMLEscape(dst []byte, s string) []byte

AppendHTMLEscapedst 追加 HTML 轉義後的 src ,並且返回追加後的 dst

func AppendHTMLEscapeBytes

func AppendHTMLEscapeBytes(dst, s []byte) []byte

AppendHTMLEscapeBytesdst 追加 HTML 轉義後的 src ,並且返回追加後的 dst

func AppendHTTPDate

func AppendHTTPDate(dst []byte, date time.Time) []byte

AppendHTTPDatedst 追加符合 HTTP-compliant (RFC1123) 表示的時間 ,並且返回追加後的 dst

func AppendIPv4

func AppendIPv4(dst []byte, ip net.IP) []byte

AppendIPv4dst 追加表示 ip v4 的字串 ,並且返回追加後的 dst

func AppendNormalizedHeaderKey

func AppendNormalizedHeaderKey(dst []byte, key string) []byte

AppendNormalizedHeaderKeydst 追加標準化後的 HTTP 頭鍵(名),並且返回追加後的 dst

標準化後的頭鍵由一個大寫字母開頭。在 - 後的第一個字母也為大寫。其他的所有字母則都為小寫。例子:

  • coNTENT-TYPe -> Content-Type
  • HOST -> Host
  • foo-bar-baz -> Foo-Bar-Baz

func AppendNormalizedHeaderKeyBytes

func AppendNormalizedHeaderKeyBytes(dst, key []byte) []byte

AppendNormalizedHeaderKeyBytesdst 追加標準化後的 HTTP 頭鍵(名),並且返回追加後的 dst

標準化後的頭鍵由一個大寫字母開頭。在 - 後的第一個字母也為大寫。其他的所有字母則都為小寫。例子:

  • coNTENT-TYPe -> Content-Type
  • HOST -> Host
  • foo-bar-baz -> Foo-Bar-Baz

func AppendQuotedArg

func AppendQuotedArg(dst, src []byte) []byte

AppendQuotedArgdst 追加經過 url 加密的 src ,並且返回追加後的 dst

func AppendUint

func AppendUint(dst []byte, n int) []byte

AppendUintdst 追加 n,並且返回追加後的 dst

func Dial

func Dial(addr string) (net.Conn, error)

Dial 使用 tcp4 連線指定的 TCP 地址 addr

net.Dial 相比,該函式有以下這些額外的特性:

  • 它通過以 DefaultDNSCacheDuration 持續時間快取解析後的 TCP 地址來減少 DNS 解析器的負載。
  • 它通過輪詢來連線所有被解析後的 TCP 連線,直至第一個連線被建立。這在當其中的某一個 TCP 地址臨時性不可用時相當有用。
  • DefaultDialTimeout 秒之後若連線還沒有被建立,它會返回 ErrDialTimeout ,可以使用 DialTimeout 來自定義這個超時。

addr 引數必須包含埠,例如:

  • foobar.baz:443
  • foo.bar:80
  • aaa.com:8080

func DialDualStack

func DialDualStack(addr string) (net.Conn, error)

DialDualStack 使用 tcp4 和 tcp6 連線指定的 TCP 地址 addr

net.Dial 相比,該函式有以下這些額外的特性:

  • 它通過以 DefaultDNSCacheDuration 持續時間快取解析後的 TCP 地址來減少 DNS 解析器的負載。
  • 它通過輪詢來連線所有被解析後的 TCP 連線,直至第一個連線被建立。這在當其中的某一個 TCP 地址臨時性不可用時相當有用。
  • DefaultDialTimeout 秒之後若連線還沒有被建立,它會返回 ErrDialTimeout ,可以使用 DialTimeout 來自定義這個超時。

addr 引數必須包含埠,例如:

  • foobar.baz:443
  • foo.bar:80
  • aaa.com:8080

func DialDualStackTimeout

func DialDualStackTimeout(addr string, timeout time.Duration) (net.Conn, error)

DialDualStackTimeout 使用 tcp4 和 tcp6 連線指定的 TCP 地址 addr ,並且會在指定時間後超時。

net.Dial 相比,該函式有以下這些額外的特性:

  • 它通過以 DefaultDNSCacheDuration 持續時間快取解析後的 TCP 地址來減少 DNS 解析器的負載。
  • 它通過輪詢來連線所有被解析後的 TCP 連線,直至第一個連線被建立。這在當其中的某一個 TCP 地址臨時性不可用時相當有用。
  • DefaultDialTimeout 秒之後若連線還沒有被建立,它會返回 ErrDialTimeout ,可以使用 DialTimeout 來自定義這個超時。

addr 引數必須包含埠,例如:

  • foobar.baz:443
  • foo.bar:80
  • aaa.com:8080

func DialTimeout

func DialTimeout(addr string, timeout time.Duration) (net.Conn, error)

DialTimeout 使用 tcp4 和 tcp6 連線指定的 TCP 地址 addr ,並且會在指定時間後超時。

net.Dial 相比,該函式有以下這些額外的特性:

  • 它通過以 DefaultDNSCacheDuration 持續時間快取解析後的 TCP 地址來減少 DNS 解析器的負載。
  • 它通過輪詢來連線所有被解析後的 TCP 連線,直至第一個連線被建立。這在當其中的某一個 TCP 地址臨時性不可用時相當有用。
  • DefaultDialTimeout 秒之後若連線還沒有被建立,它會返回 ErrDialTimeout ,可以使用 DialTimeout 來自定義這個超時。

addr 引數必須包含埠,例如:

  • foobar.baz:443
  • foo.bar:80
  • aaa.com:8080

func Do

func Do(req *Request, resp *Response) error

Do 發出指定的 http 請求,在得到響應後並且填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func DoDeadline

func DoDeadline(req *Request, resp *Response, deadline time.Time) error

DoDeadline 發出指定的 http 請求,並且在指定的 deadline 之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func DoTimeout

func DoTimeout(req *Request, resp *Response, timeout time.Duration) error

DoTimeout 發出指定的 http 請求,並且在指定的超時之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func EqualBytesStr

func EqualBytesStr(b []byte, s string) bool

EqualBytesStr,在 string(b) == s 時返回 true

這個函式與 string(b) == s 的效能沒有差別。目前它僅用於向後相容。

這個函式已經棄用並且可能很快被移除。

func FileLastModified

func FileLastModified(path string) (time.Time, error)

FileLastModified 返回檔案的最後修改時間。

func Get

func Get(dst []byte, url string) (statusCode int, body []byte, err error)

Getdst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

func GetDeadline

func GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)

GetDeadlinedst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

若在指定的 deadline 之前沒能獲取到響應,那麼會返回 ErrTimeout

func GetTimeout

func GetTimeout(dst []byte, url string, timeout time.Duration) (statusCode int, body []byte, err error)

GetTimeoutdst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

若在指定的超時之前沒能獲取到響應,那麼會返回 ErrTimeout

func ListenAndServe

func ListenAndServe(addr string, handler RequestHandler) error

ListenAndServe 使用指定的 handler 處理來自指定 TCP 地址 addr 的 HTTP 請求。

例子:

// 這個伺服器會監聽所有來自該地址的請求
listenAddr := "127.0.0.1:80"

// 當每個請求到來時,這個函式都將被呼叫。
// RequestCtx 提供了很多有用的處理 http 請求的方法。更多詳情請參閱 RequestCtx 說明。
requestHandler := func(ctx *fasthttp.RequestCtx) {
    fmt.Fprintf(ctx, "Hello, world! Requested path is %q", ctx.Path())
}

// 使用預設設定啟動伺服器。
// 建立伺服器例項。
//
// ListenAndServe 只返回一個錯誤,所以它通常是永久阻塞的。
if err := fasthttp.ListenAndServe(listenAddr, requestHandler); err != nil {
    log.Fatalf("error in ListenAndServe: %s", err)
}

func ListenAndServeTLS

func ListenAndServeTLS(addr, certFile, keyFile string, handler RequestHandler) error

ListenAndServeTLS 使用指定的 handler 處理來自指定 TCP 地址 addr 的 HTTPS 請求。

certFilekeyFile 是 TLS 證書和金鑰檔案的路徑。

func ListenAndServeTLSEmbed

func ListenAndServeTLSEmbed(addr string, certData, keyData []byte, handler RequestHandler) error

ListenAndServeTLSEmbed 使用指定的 handler 處理來自指定 TCP 地址 addr 的 HTTPS 請求。

certDatakeyData 必須包含合法的 TLS 證書和金鑰資料。

func ListenAndServeUNIX

func ListenAndServeUNIX(addr string, mode os.FileMode, handler RequestHandler) error

ListenAndServeUNIX 使用指定的 handler 處理來自指定 UNIX 地址 addr 的 HTTP 請求。

這個函式會在開始接受請求前刪除所有 addr 下的檔案。

該函式會為制定 UNIX 地址 addr 設定引數中指定的 mode

func NewStreamReader

func NewStreamReader(sw StreamWriter) io.ReadCloser

NewStreamReader 返回一個 reader ,用於獲取所有由 sw 生成的資料。

返回的 reader 可以被傳遞至 Response.SetBodyStream

在返回的 reader 中所有的資料都被讀取完畢之後,必須呼叫 Close 。否則可能會造成 goroutine 洩露。

更多詳情可參閱 Response.SetBodyStreamWriter

func ParseByteRange

func ParseByteRange(byteRange []byte, contentLength int) (startPos, endPos int, err error)

ParseByteRange 用於解釋 'Range: bytes=...' 頭的值。

依據的規範是 https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35

func ParseHTTPDate

func ParseHTTPDate(date []byte) (time.Time, error)

ParseHTTPDate 用於解釋符合 HTTP-compliant (RFC1123) 規範的時間。

func ParseIPv4

func ParseIPv4(dst net.IP, ipStr []byte) (net.IP, error)

ParseIPv4 解釋 ipStr 提供的 ip 地址,並填充 dst ,然後返回填充後的 dst

func ParseUfloat

func ParseUfloat(buf []byte) (float64, error)

ParseUfloat 解釋 buf 提供的無符號浮點數。

func ParseUint

func ParseUint(buf []byte) (int, error)

ParseUint 解釋 buf 提供的無符號整型數。

func Post

func Post(dst []byte, url string, postArgs *Args) (statusCode int, body []byte, err error)

Post 使用指定 POST 引數向指定 url 發出 POST 請求。

請求體會追加值 dst ,並且通過 body 返回。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

dstnil ,那麼新的 body 緩衝會被分配。

如果 postArgsnil ,則傳送空 POST 請求體。

func ReleaseArgs

func ReleaseArgs(a *Args)

ReleaseArgs 向池中釋放通過 AquireArgs 取得的物件。

不要試圖訪問釋放的 Args 物件,可能會產生資料競爭。

func ReleaseByteBuffer

func ReleaseByteBuffer(b *ByteBuffer)

ReleaseByteBuffer 返回池中釋放指定位元組緩衝。

在釋放回池之後, ByteBuffer.B 不能再被訪問,可能會產生資料競爭。

func ReleaseCookie

func ReleaseCookie(c *Cookie)

ReleaseCookie 向池中釋放由 AcquireCookie 返回的物件。

不要試圖訪問釋放的 Cookie 物件,可能會產生資料競爭。

func ReleaseRequest

func ReleaseRequest(req *Request)

ReleaseRequest 向池中釋放由 AcquireRequest 返回的物件。

在釋放回池之後,禁止再訪問 req 物件以及它的任何成員。

func ReleaseResponse

func ReleaseResponse(resp *Response)

ReleaseResponse 向池中釋放由 AcquireResponse 返回的物件。

在釋放回池之後,禁止再訪問 resp 物件以及它的任何成員。

func ReleaseURI

func ReleaseURI(u *URI)

ReleaseURI 向池中釋放由 AcquireURI 返回的物件。

不要試圖訪問釋放的 URI 物件,可能會產生資料競爭。

func SaveMultipartFile

func SaveMultipartFile(fh *multipart.FileHeader, path string) error

SaveMultipartFile 在指定的 path 下儲存檔案 fh

func Serve

func Serve(ln net.Listener, handler RequestHandler) error

Serve 使用指定的 handler 來處理來自 listener 的連線。

listener 返回永久性的錯誤之前, Serve 都會一直保持阻塞。

例子:

// 建立一個接受請求的 listener
//
// 你不僅可以建立 TCP listener - 任意的 net.Listener 都可以。
// 例如 UNIX Socket 或 TLS listener 。

ln, err := net.Listen("tcp4", "127.0.0.1:8080")
if err != nil {
    log.Fatalf("error in net.Listen: %s", err)
}

// 當每個請求到來時,這個函式都將被呼叫。
// RequestCtx 提供了很多有用的處理 http 請求的方法。更多詳情請參閱 RequestCtx 說明。
requestHandler := func(ctx *fasthttp.RequestCtx) {
    fmt.Fprintf(ctx, "Hello, world! Requested path is %q", ctx.Path())
}

// 使用預設設定啟動伺服器。
// 建立伺服器例項。
//
// Serve 在 ln.Close() 或發生錯誤時返回,所以它通常是永久阻塞的。
if err := fasthttp.Serve(ln, requestHandler); err != nil {
    log.Fatalf("error in Serve: %s", err)
}

func ServeConn

func ServeConn(c net.Conn, handler RequestHandler) error

ServeConn 使用指定的 handler 處理來自指定連線的 HTTP 請求。

如果所有來自 c 的請求都被成功處理,ServeConn 會返回 nil 。否則返回一個非空錯誤。

連線 c 必須立刻將所有資料通過 Write() 傳送至客戶端,否則請求的處理可能會被掛起。

ServeConn 在返回之前會關閉 c

func ServeFile

func ServeFile(ctx *RequestCtx, path string)

ServeFile 返回來自指定 path 的壓縮後檔案內容的 HTTP 響應。

在以下情況下,HTTP 響應可能會包含未壓縮檔案內容:

  • 缺少 'Accept-Encoding: gzip' 請求頭。
  • 沒有對檔案目錄的寫許可權。

如果 path 指向一個目錄,那麼目錄的內容會被返回。

如果你不需要響應壓縮後的檔案內容,請使用 ServeFileUncompressed

更多詳情可參閱 RequestCtx.SendFile

func ServeFileBytes

func ServeFileBytes(ctx *RequestCtx, path []byte)

ServeFileBytes 返回來自指定 path 的壓縮後檔案內容的 HTTP 響應。

在以下情況下,HTTP 響應可能會包含未壓縮檔案內容:

  • 缺少 'Accept-Encoding: gzip' 請求頭。
  • 沒有對檔案目錄的寫許可權。

如果 path 指向一個目錄,那麼目錄的內容會被返回。

如果你不需要響應壓縮後的檔案內容,請使用 ServeFileUncompressed

更多詳情可參閱 RequestCtx.SendFile

func ServeFileBytesUncompressed

func ServeFileBytesUncompressed(ctx *RequestCtx, path []byte)

ServeFileBytesUncompressed 返回來自指定 path 檔案內容的 HTTP 響應。

如果 path 指向一個目錄,那麼目錄的內容會被返回。

若需要處理壓縮後的檔案,請使用 ServeFileBytes

更多詳情可參閱 RequestCtx.SendFileBytes

func ServeFileUncompressed

func ServeFileUncompressed(ctx *RequestCtx, path string)

ServeFileUncompressed 返回來自指定 path 檔案內容的 HTTP 響應。

如果 path 指向一個目錄,那麼目錄的內容會被返回。

若需要處理壓縮後的檔案,請使用 ServeFile

更多詳情可參閱 RequestCtx.SendFile

func ServeTLS

func ServeTLS(ln net.Listener, certFile, keyFile string, handler RequestHandler) error

ServeTLS 使用指定的 handler 來處理來自指定 net.Listener 的 HTTPS 請求。

certFilekeyFile 是 TLS 證書和金鑰檔案的路徑。

func ServeTLSEmbed

func ServeTLSEmbed(ln net.Listener, certData, keyData []byte, handler RequestHandler) error

ServeTLSEmbed 使用指定的 handler 來處理來自指定 net.Listener 的 HTTPS 請求。

certDatakeyData 必須包含合法的 TLS 證書和金鑰資料。

func StatusMessage

func StatusMessage(statusCode int) string

StatusMessage 根據指定的狀態碼返回 HTTP 狀態資訊。

func WriteGunzip

func WriteGunzip(w io.Writer, p []byte) (int, error)

WriteGunzipw 寫入經 gunzip 壓縮的 p ,並且返回未壓縮的位元組數。

func WriteGzip

func WriteGzip(w io.Writer, p []byte) (int, error)

WriteGunzipw 寫入經 gzip 壓縮的 p ,並且返回未壓縮的位元組數。

func WriteGzipLevel

func WriteGzipLevel(w io.Writer, p []byte, level int) (int, error)

WriteGunzipw 寫入經指定級別 gzip 壓縮的 p ,並且返回未壓縮的位元組數。

支援的壓縮級別有:

  • CompressNoCompression
  • CompressBestSpeed
  • CompressBestCompression
  • CompressDefaultCompression

func WriteInflate

func WriteInflate(w io.Writer, p []byte) (int, error)

WriteGunzipw 寫入壓縮後的 p ,並且返回未壓縮的位元組數。

func WriteMultipartForm

func WriteMultipartForm(w io.Writer, f *multipart.Form, boundary string) error

WriteMultipartForm 使用指定的 w 寫入指定的表單 f

type Args

type Args struct {
    // 包含被過濾或未匯出的屬性
}

Args 代表查詢字串引數。

拷貝 Args 例項是禁止的。你需要使用 CopyTo() 函式或建立一個新例項。

Args 例項必須不能在併發執行的 goroutine 間使用。

func AcquireArgs

func AcquireArgs() *Args

AcquireArgs 從池中返回一個空的 Args 物件。

返回的 Args 例項在不再需要時可以通過 ReleaseArgs 釋放回池。這可以降低垃圾回收負載。

func (*Args) Add

func (a *Args) Add(key, value string)

Add 新增 'key=value' 引數。

同一個 key 可以新增多個值。

func (*Args) AddBytesK

func (a *Args) AddBytesK(key []byte, value string)

AddBytesK 新增 'key=value' 引數。

同一個 key 可以新增多個值。

func (*Args) AddBytesKV

func (a *Args) AddBytesKV(key, value []byte)

AddBytesKV 新增 'key=value' 引數。

同一個 key 可以新增多個值。

func (*Args) AddBytesV

func (a *Args) AddBytesV(key string, value []byte)

AddBytesV 新增 'key=value' 引數。

同一個 key 可以新增多個值。

func (*Args) AppendBytes

func (a *Args) AppendBytes(dst []byte) []byte

AppendBytesdst 追加查詢字串,並返回 dst

func (*Args) CopyTo

func (a *Args) CopyTo(dst *Args)

CopyTo 將所有的引數複製至 dst

func (*Args) Del

func (a *Args) Del(key string)

Del 刪除鍵為指定 key 的引數。

func (*Args) DelBytes

func (a *Args) DelBytes(key []byte)

Del 刪除鍵為指定 key 的引數。

func (*Args) GetUfloat

func (a *Args) GetUfloat(key string) (float64, error)

GetUfloat 返回指定 key 的無符號浮點數值。

func (*Args) GetUfloatOrZero

func (a *Args) GetUfloatOrZero(key string) float64

GetUfloatOrZero 返回指定 key 的無符號浮點數值。

當出錯時返回 0

func (*Args) GetUint

func (a *Args) GetUint(key string) (int, error)

GetUint 返回指定 key 的無符號整型數值。

func (*Args) GetUintOrZero

func (a *Args) GetUintOrZero(key string) int

GetUintOrZero 返回指定 key 的無符號整型數值。

當出錯時返回 0

func (*Args) Has

func (a *Args) Has(key string) bool

Has 在當 Args 中存在指定 key 時返回 true

func (*Args) HasBytes

func (a *Args) HasBytes(key []byte) bool

HasBytes 在當 Args 中存在指定 key 時返回 true

func (*Args) Len

func (a *Args) Len() int

Len 查詢引數的數量。

func (*Args) Parse

func (a *Args) Parse(s string)

Parse 解析包含查詢引數的字串。

func (*Args) ParseBytes

func (a *Args) ParseBytes(b []byte)

ParseBytes 解析包含查詢引數的 b

func (*Args) Peek

func (a *Args) Peek(key string) []byte

Peek 返回查詢引數中指定 key 的值。

func (*Args) PeekBytes

func (a *Args) PeekBytes(key []byte) []byte

PeekBytes 返回查詢引數中指定 key 的值。

func (*Args) PeekMulti

func (a *Args) PeekMulti(key string) [][]byte

PeekMulti 返回查詢引數中指定 key 的所有值。

func (*Args) PeekMultiBytes

func (a *Args) PeekMultiBytes(key []byte) [][]byte

PeekMultiBytes 返回查詢引數中指定 key 的所有值。

func (*Args) QueryString

func (a *Args) QueryString() []byte

QueryString 返回查詢引數的字串表示。

在下個 Args 方法呼叫之前,返回值都是合法的。

func (*Args) Reset

func (a *Args) Reset()

Reset 清除所有查詢引數。

func (*Args) Set

func (a *Args) Set(key, value string)

Set 設定 'key=value' 引數。

func (*Args) SetBytesK

func (a *Args) SetBytesK(key []byte, value string)

SetBytesK 設定 'key=value' 引數。

func (*Args) SetBytesKV

func (a *Args) SetBytesKV(key, value []byte)

SetBytesKV 設定 'key=value' 引數。

func (*Args) SetBytesV

func (a *Args) SetBytesV(key string, value []byte)

SetBytesV 設定 'key=value' 引數。

func (*Args) SetUint

func (a *Args) SetUint(key string, value int)

SetUint 為指定 key 設定無符號整數值。

func (*Args) SetUintBytes

func (a *Args) SetUintBytes(key []byte, value int)

SetUintBytes 為指定 key 設定無符號整數值。

func (*Args) String

func (a *Args) String() string

String 返回查詢引數的字串表示。

func (*Args) VisitAll

func (a *Args) VisitAll(f func(key, value []byte))

VisitAll 對每一個存在的引數呼叫 f

f 在返回後必須不能保留對鍵和值的引用。若要在返回後扔需要儲存它們,請儲存它們的副本。

func (*Args) WriteTo

func (a *Args) WriteTo(w io.Writer) (int64, error)

WriteTow 寫入查詢字串。

WriteTo 實現了 io.WriterTo 介面。

type Client

type Client struct {

    // 客戶端名字。在 User-Agent 請求頭中會被使用到。
    //
    // 如果未被設定,則會使用預設客戶端名。
    Name string

    // 建立到指定 host 的新連線後的回撥函式。
    //
    // 如果未被設定,則會使用預設 Dial 函式。
    Dial DialFunc

    // 若被設為 true ,則會試圖連線 ipv4 和 ipv6 的地址。
    //
    // 這個選項僅在使用預設 TCP dialer 時有效,
    // 例如:Dial 為空。
    //
    // 預設情況下客戶端僅會連線 ipv4 地址,
    // 因為 ipv6 在世界上的大多數網路中都仍然不可用 :)
    DialDualStack bool

    // HTTPS 連線的 TLS 配置。
    // 如果未被設定,則使用預設的 TLS 配置。
    TLSConfig *tls.Config

    // 每個 host 可以被建立的最大連線數。
    //
    // 如果未被設定,則使用預設的 DefaultMaxConnsPerHost 。
    MaxConnsPerHost int

    // 在這個時間間隔後,空閒的 keep-alive 連線會被關閉。
    // 預設值為 DefaultMaxIdleConnDuration 。
    MaxIdleConnDuration time.Duration

    // 每個連線響應讀取時的緩衝大小。
    // 這個值也限制了最大頭大小。
    //
    // 預設值為 0 。
    ReadBufferSize int

    // 每個連線請求寫入時的緩衝大小。
    //
    // 預設值為 0 。
    WriteBufferSize int

    // 完整的響應讀取(包含響應體)可用的最大時間。
    //
    // 預設為無限制。
    ReadTimeout time.Duration

    // 完整的請求寫入(包含請求體)可用的最大時間。
    //
    // 預設為無限制。
    WriteTimeout time.Duration

    // 相應體的最大大小。
    //
    // 當該值大於 0 ,且相應體超過它時,客戶端返回 ErrBodyTooLarge 。
    // 預設為無限制。
    MaxResponseBodySize int

    DisableHeaderNamesNormalizing bool

    // 包含被過濾或未匯出的屬性
}

Client 實現了 HTTP 客戶端。

不允許按值拷貝 Client ,應該建立一個新的例項。

在多個執行的 goroutine 間呼叫 Client 方法是安全的。

func (*Client) Do

func (c *Client) Do(req *Request, resp *Response) error

Do 發出指定的 http 請求,在得到響應後並且填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

如果 respnil ,那麼響應會被忽略。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*Client) DoDeadline

func (c *Client) DoDeadline(req *Request, resp *Response, deadline time.Time) error

DoDeadline 發出指定的 http 請求,並且在指定的 deadline 之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*Client) DoTimeout

func (c *Client) DoTimeout(req *Request, resp *Response, timeout time.Duration) error

DoTimeout 發出指定的 http 請求,並且在指定的超時之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*Client) Get

func (c *Client) Get(dst []byte, url string) (statusCode int, body []byte, err error)

Getdst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

func (*Client) GetDeadline

func (c *Client) GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)

GetDeadlinedst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

若在指定的 deadline 之前沒能獲取到響應,那麼會返回 ErrTimeout

func (*Client) GetTimeout

func (c *Client) GetTimeout(dst []byte, url string, timeout time.Duration) (statusCode int, body []byte, err error)

GetTimeoutdst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

若在指定的超時之前沒能獲取到響應,那麼會返回 ErrTimeout

func (*Client) Post

func (c *Client) Post(dst []byte, url string, postArgs *Args) (statusCode int, body []byte, err error)

Post 使用指定 POST 引數向指定 url 發出 POST 請求。

請求體會追加值 dst ,並且通過 body 返回。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

dstnil ,那麼新的 body 緩衝會被分配。

如果 postArgsnil ,則傳送空 POST 請求體。

type Cookie

type Cookie struct {
    // 包含被過濾或未匯出的屬性
}

Cookie 代表 HTTP 相應的 cookie 。

不允許按值拷貝 Cookie ,應該建立一個新的例項。

在多個執行的 goroutine 間使用 Cookie 例項是禁止的。

func AcquireCookie

func AcquireCookie() *Cookie

AcquireCookie 從池中返回一個空的 Cookie 物件。

返回的 Cookie 例項在不再需要時可以通過 ReleaseCookie 釋放回池。這可以降低垃圾回收負載。

func (*Cookie) AppendBytes

func (c *Cookie) AppendBytes(dst []byte) []byte

AppendBytesdst 追加 cookie ,並且返回追加後的 dst

func (*Cookie) Cookie

func (c *Cookie) Cookie() []byte

Cookie 返回 cookie 的表示。

直到下次呼叫 Cookie 方法前,返回值都是合法的。

func (*Cookie) CopyTo

func (c *Cookie) CopyTo(src *Cookie)

CopyTo 拷貝 src cookie 至 c

func (*Cookie) Domain

func (c *Cookie) Domain() []byte

Domain 返回 cookie 的 domain 值。

直到下次呼叫會改變 Cookie 的方法前,返回值都是合法的。

func (*Cookie) Expire

func (c *Cookie) Expire() time.Time

Expire 返回 cookie 的過期時間。

若沒設定過期,則返回 CookieExpireUnlimited

func (*Cookie) HTTPOnly

func (c *Cookie) HTTPOnly() bool

HTTPOnly 在 cookie 為 http only 時返回 true

func (*Cookie) Key

func (c *Cookie) Key() []byte

Key 返回 cookie 名字。

直到下次呼叫會改變 Cookie 的方法前,返回值都是合法的。

func (*Cookie) Parse

func (c *Cookie) Parse(src string) error

Parse 解析 Set-Cookie 頭。

func (*Cookie) ParseBytes

func (c *Cookie) ParseBytes(src []byte) error

ParseBytes 解析 Set-Cookie 頭。

func (*Cookie) Path

func (c *Cookie) Path() []byte

Path 返回 cookie path 。

func (*Cookie) Reset

func (c *Cookie) Reset()

Reset 清空該 cookie 。

func (*Cookie) Secure

func (c *Cookie) Secure() bool

Secure 在當 cookie 為 secure 時返回 true

func (*Cookie) SetDomain

func (c *Cookie) SetDomain(domain string)

SetDomain 設定 cookie 的 domain 。

func (*Cookie) SetDomainBytes

func (c *Cookie) SetDomainBytes(domain []byte)

SetDomainBytes 設定 cookie 的 domain 。

func (*Cookie) SetExpire

func (c *Cookie) SetExpire(expire time.Time)

SetExpire 設定 cookie 的過期時間。

若要使該 cookie 在客戶端過期,則將值設定為 CookieExpireDelete

預設情況下 cookie 的壽命由瀏覽器會話限制。

func (*Cookie) SetHTTPOnly

func (c *Cookie) SetHTTPOnly(httpOnly bool)

SetHTTPOnly 將 cookie 的 httpOnly 標識設定為指定值。

func (*Cookie) SetKey

func (c *Cookie) SetKey(key string)

SetKey 設定 cookie 名。

func (*Cookie) SetKeyBytes

func (c *Cookie) SetKeyBytes(key []byte)

SetKeyBytes 設定 cookie 名。

func (*Cookie) SetPath

func (c *Cookie) SetPath(path string)

SetPath 設定 cookie 路徑。

func (*Cookie) SetPathBytes

func (c *Cookie) SetPathBytes(path []byte)

SetPathBytes 設定 cookie 路徑。

func (*Cookie) SetSecure

func (c *Cookie) SetSecure(secure bool)

SetSecure 將 cookie 的 secure 標識設定為指定值。

func (*Cookie) SetValue

func (c *Cookie) SetValue(value string)

SetValue 設定 cookie 的值。

func (*Cookie) SetValueBytes

func (c *Cookie) SetValueBytes(value []byte)

SetValueBytes 設定 cookie 的值。

func (*Cookie) String

func (c *Cookie) String() string

String 返回 cookie 的字串表示。

func (*Cookie) Value

func (c *Cookie) Value() []byte

Value 返回 cookie 的值。

直到下次呼叫會改變 Cookie 的方法前,返回值都是合法的。

func (*Cookie) WriteTo

func (c *Cookie) WriteTo(w io.Writer) (int64, error)

WriteTo 將 cookie 的字串表示寫入 w

WriteTo 實現了 io.WriterTo 介面。

type DialFunc

type DialFunc func(addr string) (net.Conn, error)

DialFunc 必須建立到 addr 的連線。

沒有必要為 HTTPS 建立到 TLS(SSL)的連線。若 HostClient.IsTLS 被設定,則客戶端會自動轉換連線至 TLS 。

TCP address passed to DialFunc always contains host and port. Example TCP addr values: 傳遞至 DialFunc 的 TCP 地址總是包含 host 和埠。例子:

  • foobar.com:80
  • foobar.com:443
  • foobar.com:8080

type FS

type FS struct {

    // 用於響應檔案的根目錄
    Root string

    // 目錄中的索引檔名。
    //
    // 例子:
    //
    //     * index.html
    //     * index.htm
    //     * my-super-index.xml
    //
    // 預設為空。
    IndexNames []string

    GenerateIndexPages bool

    // 若設為 true ,則壓縮響應。
    //
    // 伺服器會通過快取來最小化 CPU 的使用。
    // 新的快取檔名字會新增 `CompressedFileSuffix` 字首。
    // 所以建議使伺服器對 Root 目錄以及子目錄有寫許可權。
    Compress bool

    // 若被設為 true ,則啟用位元組範圍請求
    //
    // 預設為 false 。
    AcceptByteRange bool

    // 重寫路徑函式。
    //
    // 預設為不改變請求路徑。
    PathRewrite PathRewriteFunc

    // 非活躍的檔案控制程式碼的過期時間間隔。
    //
    // 預設為 `FSHandlerCacheDuration` 。
    CacheDuration time.Duration

    // 為快取的壓縮檔案新增的字首。
    //
    // 這個值僅在 Compress 被設定時才有效。
    //
    // 預設為 FSCompressedFileSuffix 。
    CompressedFileSuffix string

    // 包含被過濾或未匯出的屬性
}

FS 代表了通過本地檔案系統來響應靜態檔案 HTTP 請求的設定。

不允許複製 FS 值,應該建立新的 FS 值。

例子:

fs := &fasthttp.FS{
    // 響應靜態檔案請求的目錄
    Root: "/var/www/static-site",

    // 生成索引
    GenerateIndexPages: true,

    // 開啟壓縮,用於節省頻寬
    Compress: true,
}

// 建立響應靜態檔案的 handler
h := fs.NewRequestHandler()

// 啟動伺服器
if err := fasthttp.ListenAndServe(":8080", h); err != nil {
    log.Fatalf("error in ListenAndServe: %s", err)
}

func (*FS) NewRequestHandler

func (fs *FS) NewRequestHandler() RequestHandler

NewRequestHandler 通過指定的 FS 設定返回新的請求 handler 。

返回的 handler 根據 FS.CacheDuration 來快取請求的檔案控制程式碼。若 FS.Root 目錄包含大量檔案,請確保你的程式通過 'ulimit -n' 來保證有足夠的“可開啟檔案”。

不需要對單個 FS 例項建立多個請求 handler ,只需重用即可。

type HijackHandler

type HijackHandler func(c net.Conn)

HijackHandler 必須處理攔截的連線 c

HijackHandler 返回後連線 c 會被自動關閉。

HijackHandler 返回後連線 c 必須不可再被使用。

type HostClient

type HostClient struct {

    // 以逗號分隔的上游 HTTP 伺服器 host 地址列表,通過輪詢傳遞給 Dial
    //
    // 如果預設的 dialer 被使用,每一個地址都需要包含埠。
    // 例子:
    //
    //    - foobar.com:80
    //    - foobar.com:443
    //    - foobar.com:8080
    Addr string

    // 客戶端名,用於 User-Agent 請求頭。
    Name string

    // 建立到指定 host 的新連線後的回撥函式。
    //
    // 如果未被設定,則會使用預設 Dial 函式。
    Dial DialFunc

    // 若被設為 true ,則會試圖連線 ipv4 和 ipv6 的地址。
    //
    // 這個選項僅在使用預設 TCP dialer 時有效,
    // 例如:Dial 為空。
    //
    // 預設情況下客戶端僅會連線 ipv4 地址,
    // 因為 ipv6 在世界上的大多數網路中都仍然不可用 :)
    DialDualStack bool

    // 是否使用 TLS 。
    IsTLS bool

    // 可選的 TLS 配置。
    TLSConfig *tls.Config

    // 每個 host 可以被建立的最大連線數。
    //
    // 如果未被設定,則使用預設的 DefaultMaxConnsPerHost 。
    MaxConns int

    // 在這個時間間隔後, keep-alive 連線會被關閉。
    // 預設值為無限制。
    MaxConnDuration time.Duration

    // 在這個時間間隔後,空閒的 keep-alive 連線會被關閉。
    // 預設值為 DefaultMaxIdleConnDuration 。
    MaxIdleConnDuration time.Duration

    // 每個連線響應讀取時的緩衝大小。
    // 這個值也限制了最大頭大小。
    //
    // 預設值為 0 。
    ReadBufferSize int

    // 每個連線請求寫入時的緩衝大小。
    //
    // 預設值為 0 。
    WriteBufferSize int

    // 完整的響應讀取(包含響應體)可用的最大時間。
    //
    // 預設為無限制。
    ReadTimeout time.Duration

    // 完整的請求寫入(包含請求體)可用的最大時間。
    //
    // 預設為無限制。
    WriteTimeout time.Duration

    // 相應體的最大大小。
    //
    // 當該值大於 0 ,且相應體超過它時,客戶端返回 ErrBodyTooLarge 。
    // 預設為無限制。
    MaxResponseBodySize int

    DisableHeaderNamesNormalizing bool

    // 包含被過濾或未匯出的屬性
}

HostClient 均衡地向列於 Addr 中的 host 發起請求。

禁止拷貝 HostClient 例項。應使用建立新的例項。

在多個執行的 goroutine 間執行 HostClient 方法是安全的。

例子:

package main

import (
    "log"

    "github.com/valyala/fasthttp"
)

func main() {
    // 準備一個客戶端,用於通過監聽於 localhost:8080 的 HTTP 代理獲取網頁
    c := &fasthttp.HostClient{
        Addr: "localhost:8080",
    }

    // 使用本地代理獲取谷歌頁面。
    statusCode, body, err := c.Get(nil, "http://google.com/foo/bar")
    if err != nil {
        log.Fatalf("Error when loading google page through local proxy: %s", err)
    }
    if statusCode != fasthttp.StatusOK {
        log.Fatalf("Unexpected status code: %d. Expecting %d", statusCode, fasthttp.StatusOK)
    }
    useResponseBody(body)

    // 通過本地代理獲取 foobar 頁面。重用 body 緩衝。
    statusCode, body, err = c.Get(body, "http://foobar.com/google/com")
    if err != nil {
        log.Fatalf("Error when loading foobar page through local proxy: %s", err)
    }
    if statusCode != fasthttp.StatusOK {
        log.Fatalf("Unexpected status code: %d. Expecting %d", statusCode, fasthttp.StatusOK)
    }
    useResponseBody(body)
}

func useResponseBody(body []byte) {
  // 處理 body
}

func (*HostClient) Do

func (c *HostClient) Do(req *Request, resp *Response) error

Do 發出指定的 http 請求,在得到響應後並且填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*HostClient) DoDeadline

func (c *HostClient) DoDeadline(req *Request, resp *Response, deadline time.Time) error

DoDeadline 發出指定的 http 請求,並且在指定的 deadline 之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*HostClient) DoTimeout

func (c *HostClient) DoTimeout(req *Request, resp *Response, timeout time.Duration) error

DoTimeout 發出指定的 http 請求,並且在指定的超時之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*HostClient) Get

func (c *HostClient) Get(dst []byte, url string) (statusCode int, body []byte, err error)

Getdst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

func (*HostClient) GetDeadline

func (c *HostClient) GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)

GetDeadlinedst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

若在指定的 deadline 之前沒能獲取到響應,那麼會返回 ErrTimeout

func (*HostClient) GetTimeout

func (c *HostClient) GetTimeout(dst []byte, url string, timeout time.Duration) (statusCode int, body []byte, err error)

GetTimeoutdst 追加 url 資訊,並且通過 body 返回它。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

如果 dstnil ,那麼則會分配一個新的 body 緩衝。

若在指定的超時之前沒能獲取到響應,那麼會返回 ErrTimeout

func (*HostClient) LastUseTime

func (c *HostClient) LastUseTime() time.Time

LastUseTime 返回客戶端最後被使用的時間。

func (*HostClient) PendingRequests

func (c *HostClient) PendingRequests() int

PendingRequests 返回正在執行的請求數。

func (*HostClient) Post

func (c *HostClient) Post(dst []byte, url string, postArgs *Args) (statusCode int, body []byte, err error)

Post 使用指定 POST 引數向指定 url 發出 POST 請求。

請求體會追加值 dst ,並且通過 body 返回。

這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*

dstnil ,那麼新的 body 緩衝會被分配。

如果 postArgsnil ,則傳送空 POST 請求體。

type Logger

type Logger interface {
    // Printf 必須與 log.Printf 有相同的語義。
    Printf(format string, args ...interface{})
}

Logger 被用於記錄格式化資訊日誌。

type PathRewriteFunc

type PathRewriteFunc func(ctx *RequestCtx) []byte

PathRewriteFunc 必須返回基於 ctx.Path() 的新請求路徑。

該函式用於在 FS 中轉義當前請求路徑至相對於 FS.Root 的相對路徑。

處於安全原因,返回的路徑中不允許包含 '/../' 子字串。

func NewPathPrefixStripper

func NewPathPrefixStripper(prefixSize int) PathRewriteFunc

NewPathPrefixStripper 返回重寫路徑函式,返回移除的字首大小。

例子:

  • prefixSize = 0, 原路徑: "/foo/bar", 結果: "/foo/bar"
  • prefixSize = 3, 原路徑: "/foo/bar", 結果: "o/bar"
  • prefixSize = 7, 原路徑: "/foo/bar", 結果: "r"

返回的路徑重寫函式可能會被 FS.PathRewrite 使用。

func NewPathSlashesStripper

func NewPathSlashesStripper(slashesCount int) PathRewriteFunc

NewPathSlashesStripper 返回重寫路徑函式,返回移除的路徑分隔符數量。

例子:

  • slashesCount = 0, 原路徑: "/foo/bar", 結果: "/foo/bar"
  • slashesCount = 1, 原路徑: "/foo/bar", 結果: "/bar"
  • slashesCount = 2, 原路徑: "/foo/bar", 結果: ""

返回的路徑重寫函式可能會被 FS.PathRewrite 使用。

type PipelineClient

type PipelineClient struct {

    // 連線的 host 的地址
    Addr string

    // 連線至 Addr 的最大併發數。
    //
    // 預設為單連線。
    MaxConns int

    // 單個連線至 Addr 的最大等待管道請求數量。
    //
    // 預設為 DefaultMaxPendingRequests 。
    MaxPendingRequests int

    // 在批量傳送管道請求至伺服器前的最大延時。
    //
    // 預設為無延時。
    MaxBatchDelay time.Duration

    /// 建立到指定 host 的新連線後的回撥函式。
    //
    // 如果未被設定,則會使用預設 Dial 函式。
    Dial DialFunc

    // 若被設為 true ,則會試圖連線 ipv4 和 ipv6 的地址。
    //
    // 這個選項僅在使用預設 TCP dialer 時有效,
    // 例如:Dial 為空。
    //
    // 預設情況下客戶端僅會連線 ipv4 地址,
    // 因為 ipv6 在世界上的大多數網路中都仍然不可用 :)
    DialDualStack bool

    // 是否使用 TLS 。
    IsTLS bool

    // 可選的 TLS 配置。
    TLSConfig *tls.Config

    // 在這個時間間隔後,空閒的 keep-alive 連線會被關閉。
    // 預設值為 DefaultMaxIdleConnDuration 。
    MaxIdleConnDuration time.Duration

    // 每個連線響應讀取時的緩衝大小。
    // 這個值也限制了最大頭大小。
    //
    // 預設值為 0 。
    ReadBufferSize int

    // 每個連線請求寫入時的緩衝大小。
    //
    // 預設值為 0 。
    WriteBufferSize int

    // 完整的響應讀取(包含響應體)可用的最大時間。
    //
    // 預設為無限制。
    ReadTimeout time.Duration

    // 完整的請求寫入(包含請求體)可用的最大時間。
    //
    // 預設為無限制。
    WriteTimeout time.Duration

    // 用於記錄客戶端錯誤的日誌記錄器。
    //
    // 預設為標準 log 庫。
    Logger Logger

    // 包含被過濾或未匯出的屬性
}

PipelineClient 通過一個指定的併發連線限制數,來傳送請求。

這個客戶端可能被用於高負載的 RPC 系統。更多詳情參閱 https://en.wikipedia.org/wiki/HTTP_pipelining

禁止拷貝 PipelineClient 例項。應該建立新例項。

在執行的 goroutine 間呼叫 PipelineClient 方法是安全的。

func (*PipelineClient) Do

func (c *PipelineClient) Do(req *Request, resp *Response) error

Do 發出指定的 http 請求,在得到響應後並且填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*PipelineClient) DoDeadline

func (c *PipelineClient) DoDeadline(req *Request, resp *Response, deadline time.Time) error

DoDeadline 發出指定的 http 請求,並且在指定的 deadline 之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*PipelineClient) DoTimeout

func (c *PipelineClient) DoTimeout(req *Request, resp *Response, timeout time.Duration) error

DoTimeout 發出指定的 http 請求,並且在指定的超時之前得到響應後填充指定的 http 響應物件。

請求必須至少包含一個非空的 RequestURI (包含協議和 host)或非空的 Host 頭 + RequestURI。

客戶端以以下順序確定待請求的服務端:

  • 如果 RequestURI 包含完整的帶有協議和 host 的 url ,則從 RequestURI 中取得。
  • 否則就從 Host 頭中取得。

這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*

如果 respnil ,那麼響應會被忽略。

如果向指定請求 host 的所有 DefaultMaxConnsPerHost 數量的連線都被佔用,那麼會返回 ErrNoFreeConns

在有效能要求的程式碼中,推薦通過 AcquireRequestAcquireResponse 來獲取 reqresp

func (*PipelineClient) PendingRequests

func (c *PipelineClient) PendingRequests() int

PendingRequests 返回正在執行的請求數。

type Request

type Request struct {

    // 請求頭
    //
    // 按值拷貝 Header 是禁止的。應使用指標。
    Header RequestHeader

    // 包含被過濾或未匯出的屬性
}

Request 代表一個 HTTP 請求。

禁止拷貝 Request 例項。應該建立新例項或使用 CopyTo

Request 例項必須不能再多個執行的 goroutine 間使用。

func AcquireRequest

func AcquireRequest() *Request

AcquireRequest 從請求池中返回一個空的 Request 例項。

返回的 Request 例項在不再需要時可以通過 ReleaseRequest 釋放回池。這可以降低垃圾回收負載。

func (*Request) AppendBody

func (req *Request) AppendBody(p []byte)

AppendBody 追加 p 至請求體。

在函式返回後重用 p 是安全的。

func (*Request) AppendBodyString

相關文章