[譯] fasthttp 文件手冊
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
是由 Dial
和 DialDualStack
使用的用於建立 TCP 連線的超時時間。
const DefaultMaxConnsPerHost = 512
DefaultMaxConnsPerHost
是 http 客戶端在預設情況下(如果沒有設定 Client.MaxConnsPerHost
)單個 host 可以建立的最大併發連線數。
const DefaultMaxIdleConnDuration = 10 * time.Second
DefaultMaxIdleConnDuration
是在空閒的 keep-alive 連線被關閉前預設的持續時間。
const DefaultMaxPendingRequests = 1024
DefaultMaxPendingRequests
是 PipelineClient.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
AppendBytesStr
向 dst
追加 src
,並且返回追加後的 dst
。
這個函式與 append(dst, src...)
的效能沒有差別。目前它僅用於向後相容。
這個函式已經棄用並且可能很快被移除。
func AppendGunzipBytes
func AppendGunzipBytes(dst, src []byte) ([]byte, error)
AppendGunzipBytes
向 dst
追加 gunzip 壓縮後的 src
,並且返回追加後的 dst
。
func AppendGzipBytes
func AppendGzipBytes(dst, src []byte) []byte
AppendGzipBytes
向 dst
追加 gzip 壓縮後的 src
,並且返回追加後的 dst
。
func AppendGzipBytesLevel
func AppendGzipBytesLevel(dst, src []byte, level int) []byte
AppendGzipBytesLevel
向 dst
追加指定級別的 gzip 壓縮後的 src
,並且返回追加後的 dst
。
支援的壓縮級別有:
CompressNoCompression
CompressBestSpeed
CompressBestCompression
CompressDefaultCompression
func AppendHTMLEscape
func AppendHTMLEscape(dst []byte, s string) []byte
AppendHTMLEscape
向 dst
追加 HTML 轉義後的 src
,並且返回追加後的 dst
。
func AppendHTMLEscapeBytes
func AppendHTMLEscapeBytes(dst, s []byte) []byte
AppendHTMLEscapeBytes
向 dst
追加 HTML 轉義後的 src
,並且返回追加後的 dst
。
func AppendHTTPDate
func AppendHTTPDate(dst []byte, date time.Time) []byte
AppendHTTPDate
向 dst
追加符合 HTTP-compliant (RFC1123) 表示的時間 ,並且返回追加後的 dst
。
func AppendIPv4
func AppendIPv4(dst []byte, ip net.IP) []byte
AppendIPv4
向 dst
追加表示 ip v4 的字串 ,並且返回追加後的 dst
。
func AppendNormalizedHeaderKey
func AppendNormalizedHeaderKey(dst []byte, key string) []byte
AppendNormalizedHeaderKey
向 dst
追加標準化後的 HTTP 頭鍵(名),並且返回追加後的 dst
。
標準化後的頭鍵由一個大寫字母開頭。在 -
後的第一個字母也為大寫。其他的所有字母則都為小寫。例子:
- coNTENT-TYPe -> Content-Type
- HOST -> Host
- foo-bar-baz -> Foo-Bar-Baz
func AppendNormalizedHeaderKeyBytes
func AppendNormalizedHeaderKeyBytes(dst, key []byte) []byte
AppendNormalizedHeaderKeyBytes
向 dst
追加標準化後的 HTTP 頭鍵(名),並且返回追加後的 dst
。
標準化後的頭鍵由一個大寫字母開頭。在 -
後的第一個字母也為大寫。其他的所有字母則都為小寫。例子:
- coNTENT-TYPe -> Content-Type
- HOST -> Host
- foo-bar-baz -> Foo-Bar-Baz
func AppendQuotedArg
func AppendQuotedArg(dst, src []byte) []byte
AppendQuotedArg
向 dst
追加經過 url 加密的 src
,並且返回追加後的 dst
。
func AppendUint
func AppendUint(dst []byte, n int) []byte
AppendUint
向 dst
追加 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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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)
Get
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 body
緩衝。
func GetDeadline
func GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)
GetDeadline
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 body
緩衝。
若在指定的 deadline 之前沒能獲取到響應,那麼會返回 ErrTimeout
。
func GetTimeout
func GetTimeout(dst []byte, url string, timeout time.Duration) (statusCode int, body []byte, err error)
GetTimeout
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 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 請求。
certFile
和 keyFile
是 TLS 證書和金鑰檔案的路徑。
func ListenAndServeTLSEmbed
func ListenAndServeTLSEmbed(addr string, certData, keyData []byte, handler RequestHandler) error
ListenAndServeTLSEmbed
使用指定的 handler
處理來自指定 TCP 地址 addr
的 HTTPS 請求。
certData
和 keyData
必須包含合法的 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*
。
若 dst
是 nil
,那麼新的 body
緩衝會被分配。
如果 postArgs
是 nil
,則傳送空 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 請求。
certFile
和 keyFile
是 TLS 證書和金鑰檔案的路徑。
func ServeTLSEmbed
func ServeTLSEmbed(ln net.Listener, certData, keyData []byte, handler RequestHandler) error
ServeTLSEmbed
使用指定的 handler
來處理來自指定 net.Listener
的 HTTPS 請求。
certData
和 keyData
必須包含合法的 TLS 證書和金鑰資料。
func StatusMessage
func StatusMessage(statusCode int) string
StatusMessage
根據指定的狀態碼返回 HTTP 狀態資訊。
func WriteGunzip
func WriteGunzip(w io.Writer, p []byte) (int, error)
WriteGunzip
向 w
寫入經 gunzip 壓縮的 p
,並且返回未壓縮的位元組數。
func WriteGzip
func WriteGzip(w io.Writer, p []byte) (int, error)
WriteGunzip
向 w
寫入經 gzip 壓縮的 p
,並且返回未壓縮的位元組數。
func WriteGzipLevel
func WriteGzipLevel(w io.Writer, p []byte, level int) (int, error)
WriteGunzip
向 w
寫入經指定級別 gzip 壓縮的 p
,並且返回未壓縮的位元組數。
支援的壓縮級別有:
CompressNoCompression
CompressBestSpeed
CompressBestCompression
CompressDefaultCompression
func WriteInflate
func WriteInflate(w io.Writer, p []byte) (int, error)
WriteGunzip
向 w
寫入壓縮後的 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
AppendBytes
像 dst
追加查詢字串,並返回 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)
WriteTo
向 w
寫入查詢字串。
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 頭中取得。
如果 resp
是 nil
,那麼響應會被忽略。
這個函式不會跟隨重定向。若要跟隨重定向,請使用 Get*
。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
func (*Client) Get
func (c *Client) Get(dst []byte, url string) (statusCode int, body []byte, err error)
Get
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 body
緩衝。
func (*Client) GetDeadline
func (c *Client) GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)
GetDeadline
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 body
緩衝。
若在指定的 deadline 之前沒能獲取到響應,那麼會返回 ErrTimeout
。
func (*Client) GetTimeout
func (c *Client) GetTimeout(dst []byte, url string, timeout time.Duration) (statusCode int, body []byte, err error)
GetTimeout
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 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*
。
若 dst
是 nil
,那麼新的 body
緩衝會被分配。
如果 postArgs
是 nil
,則傳送空 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
AppendBytes
向 dst
追加 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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
func (*HostClient) Get
func (c *HostClient) Get(dst []byte, url string) (statusCode int, body []byte, err error)
Get
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 body
緩衝。
func (*HostClient) GetDeadline
func (c *HostClient) GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)
GetDeadline
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 body
緩衝。
若在指定的 deadline 之前沒能獲取到響應,那麼會返回 ErrTimeout
。
func (*HostClient) GetTimeout
func (c *HostClient) GetTimeout(dst []byte, url string, timeout time.Duration) (statusCode int, body []byte, err error)
GetTimeout
向 dst
追加 url 資訊,並且通過 body
返回它。
這個函式會跟隨重定向。若要手動操作重定向,請使用 Do*
。
如果 dst
為 nil
,那麼則會分配一個新的 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*
。
若 dst
是 nil
,那麼新的 body
緩衝會被分配。
如果 postArgs
是 nil
,則傳送空 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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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*
。
如果 resp
是 nil
,那麼響應會被忽略。
如果向指定請求 host 的所有 DefaultMaxConnsPerHost
數量的連線都被佔用,那麼會返回 ErrNoFreeConns
。
在有效能要求的程式碼中,推薦通過 AcquireRequest
和 AcquireResponse
來獲取 req
和 resp
。
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
相關文章
- 函式文件或者手冊函式
- Web開發者文件和手冊Web
- 【譯】JavaScript 完整手冊JavaScript
- [開發文件]bootstrap中文手冊boot
- jdk1.5文件(手冊)JDK
- [譯] Vue Router 實戰手冊Vue
- Laravel6.X 手冊翻譯Laravel
- 翻譯:man getopt(1)中文手冊
- ZooKeeper開發手冊中文翻譯
- javacv教程文件手冊開發指南匯總篇Java
- Turbolinux 各類技術文件和手冊(轉)Linux
- TypeScript 官方手冊翻譯計劃【十三】:模組TypeScript
- TypeScript 官方手冊翻譯計劃【十二】:類TypeScript
- [譯]SearchFragment --Android TV 開發手冊十二FragmentAndroid
- Atom飛行手冊翻譯:3.1~3.2
- Animation (Appkit 中文文件手冊 教程含原始碼)APP原始碼
- LVGL|lvgl中文手冊(lvgl中文文件教程)
- [譯] Swift 網路單元測試完全手冊Swift
- TypeScript 官方手冊翻譯計劃【一】:基礎TypeScript
- [譯] Facilitator 手冊:24 個設計衝刺技巧
- Netty使用者手冊簡單翻譯Netty
- bench fasthttp 和 庫自帶的net.http效能,fasthttp完敗?ASTHTTP
- Drill官網文件翻譯六:儲存外掛的註冊
- 熬夜爆肝整理的一份elasticsearch中文文件手冊Elasticsearch
- 【公益譯文】航空網路安全指導手冊(四)
- 【公益譯文】航空網路安全指導手冊(五)
- 【公益譯文】航空網路安全指導手冊(二)
- 【公益譯文】航空網路安全指導手冊(三)
- 【公益譯文】航空網路安全指導手冊(一)
- TypeScript 官方手冊翻譯計劃【五】:物件型別TypeScript物件型別
- 翻譯:SET Variable(已提交到MariaDB官方手冊)
- 翻譯:window function(已提交到MariaDB官方手冊)Function
- 翻譯:TRUNCATE TABLE(已提交到MariaDB官方手冊)
- 翻譯:INSERT(已提交到MariaDB官方手冊)
- 是操作手冊更是安全手冊
- fasthttp 概述與 Hello World(本文)ASTHTTP
- weex官方文件手冊上問題和踩過的幾個坑。
- Views and Controls (Appkit 中文文件手冊 教程含原始碼)ViewAPP原始碼