fasthttp是由valyala編寫的聲稱快於Go官方標准庫net/http包十倍的快速HTTP實現。從各方的性能測試結果來看(評測一、評測二),fasthttp作為當下最快的http Go語言包當之無愧。本着學習、交流的目的,筆者近日起將着手該包文檔的翻譯,希望能夠對大家有所幫助。由於個人水平所限,翻譯過程中難免出現疏忽遺漏之處,如發現請及時指出,方便勘誤,謝謝。
原英文文檔請參見:https://godoc.org/github.com/valyala/fasthttp
fasthttp包
import "github.com/valyala/fasthttp"
fasthttp包提供了快速HTTP服務端及客戶端API。
Fasthttp提供的功能如下:
*速度優化。在現代硬件上,可輕松實現處理超過100K qps,超過100萬的keep-alive長連接並發。
*低內存使用優化。
*通過RequestCtx.Hijack,支持易連接升級“Connection:Upgrade”協議。
*服務端支持請求pipelining流水線操作。可以從一個網絡包中讀取多個請求,亦可以從一個網絡包中發送多個響應。這十分利於支撐高負載的REST服務。
*服務端提供以下反Dos攻擊限制:
*並發連接數量限制。
*每個客戶端IP並發連接數量限制。
*每個連接請求數限制。
*請求讀取超時限制。
*響應寫入超時限制。
*最大header請求頭大小限制。
*最大body請求體大小限制。
*最大請求執行時間限制。
*最大keep-alive長連接生命周期限制。
*提供早期過濾掉非GET請求功能。
*諸多額外有用的信息被暴露在請求處理程序handler中:
*服務端及客戶端地址。
*每一個請求的日志。
*唯一的請求id。
*請求開始時間。
*連接開始時間。
*當前連接的請求序列號。
*客戶端支持失敗請求自動重發。
*fasthttp API的設計具有擴展現有客戶端及服務端實現,或重新編寫自定義客戶端及服務端的能力。
func AppendBytesStr(dst []byte, src string) []byte
AppendBytesStr函數用於附加src源字符串至dst目的字節切片中,並返回擴展后的dst目的字節切片結果。
該函數與append(dst, src...)相比並沒有性能優勢。此處保留僅出於向后兼容考慮。
該函數並不推薦使用,未來可能被移除。
func AppendGunzipBytes(dst, src []byte) ([]byte, error)
AppendGunzipBytes函數用於附加gunzip壓縮源src字節切片至dst目的字節切片中,並返回處理后的dst目的字節切片結果及錯誤信息。
func AppendGzipBytes(dst, src []byte) []byte
func AppendGzipBytes函數用於附加gzip壓縮源src字節切片至dst目的字節切片中,並返回處理后的dst目的字節切片。
func AppendGzipBytesLevel(dst, src []byte, level int) []
AppendGzipBytesLevel函數用於以給定壓縮級別附加gzip壓縮源src字節切片至目的字節切片,並返回處理后的dst目的字節切片結果。
支持的壓縮級別:
* compressnocompression 未壓縮
* compressbestspeed 最快速度
* compressbestcompression 最大壓縮比
* compressdefaultcompression 默認壓縮級別
func AppendHTMLEscape(dst []byte, s string) []byte
AppendHTMLEscape函數用於附加含有轉義字符的HTML字符串s至dst目的字節切片中,並返回擴展后的dst目的字節切片結果。
func AppendHTMLEscapeBytes(dst, s []byte) []byte
AppendHTMLEscapeBytes函數用於附加含有轉移字符的HTML字節切片s至dst目的字節切片中,並返回擴展后的dst目的字節切片結果。
func AppendHTTPDate(dst []byte, date time.Time) []byte
AppendHTTPDate函數用於附加符合RFC1123格式的日期time.Time類型date至dst目的字節切片中,並返回擴展后的dst目的字節切片結果。
func AppendIPv4(dst []byte, ip net.IP) []byte
AppendIPv4函數用於附加給定ipv4字符串表達式至dst目的字節切片。並返回擴展后的dst目的字節切片結果。
func AppendNormalizedHeaderKey(dst []byte, key string) []byte
AppendNormalizedHeaderKey函數用於附加正常的header key鍵名字符串至dst目的字節切片,並返回dst目的字節切片結果。
正常的header key以大寫字母開頭,且破折號后的第一個字母同樣為大寫字母,而其他字母則由小寫字母表示。例如:
* coNTENT-TYPe -> Content-Type
* HOST -> Host
* foo-bar-baz -> Foo-Bar-Baz
func AppendNormalizedHeaderKeyBytes(dst, key []byte) []byte
AppendNormalizedHeaderKeyBytes函數用於附加正常的header key鍵名字節切片至dst目的字節切片,並返回dst目的字節切片結果。
正常的header key以大寫字母開頭,且破折號后的第一個字母同樣為大寫字母,而其他字母則由小寫字母表示。例如:
* coNTENT-TYPe -> Content-Type
* HOST -> Host
* foo-bar-baz -> Foo-Bar-
func AppendQuotedArg(dst, src []byte) []byte
AppendQuotedArg函數用於附加編碼過的url src源字節切片至dst目的字節切片中,並返回附加過的dst目的字節切片結果。
func AppendUint(dst []byte, n int) []byte
AppendUint函數用於附加整型變量n至dst目的字節切片中,並返回擴展后的dst目的字節切片。
func Dial(addr string) (net.Conn, error)
Dial函數使用tcp4撥打給定TCP地址。
該函數與net.Dial相比具有以下附加功能:
*利用DefaultDNSCacheDuration緩存解決TCP尋址,降低了DNS解析器負載。
*其會以輪詢方式撥打所有已解決的TCP地址直到連接被建立。如果某些地址暫時無法訪問,其將會起到作用。
*如果在DefaultDialTimeout秒內連接無法被建立,其將會返回ErrDialTimeout錯誤。
此撥號器用於在傳遞給Client.Dial或HostClient.Dial前,包裝自定義代碼。
例如,每個主機計數器或及其限制可能通過此種包裝器實現。
傳遞給該函數的地址必需包含端口號。
例如地址值為:
* foobar.baz:443
* foo.bar:80
* aaa.com:8080
func DialDualStack(addr string) (net.Conn, error)
DialDualStack函數使用tcp4或tcp6撥打給定TCP地址。
該函數與net.Dial相比具有以下附加功能:
*利用DefaultDNSCacheDuration緩存解決TCP尋址,降低了DNS解析器負載。
*其會以輪詢方式撥打所有已解決的TCP地址直到連接被建立。如果某些地址暫時無法訪問,其將會起到作用。
*如果在DefaultDialTimeout秒內連接無法被建立,其將會返回ErrDialTimeout錯誤。使用DialDualStackTimeout自定義撥號超時。
此撥號器用於在傳遞給Client.Dial或HostClient.Dial前,包裝自定義代碼。
例如,每個主機計數器或及其限制可能通過此種包裝器實現。
傳遞給該函數的地址必需包含端口號。
例如地址值為:
* foobar.baz:443
* foo.bar:80
* aaa.com:8080
func DialDualStackTimeout(addr string, timeout time.Duration) (net.Conn, error)
DialDualStackTimeout函數會在給定超時時間內使用tcp4或tcp6撥打給定TCP地址。
該函數與net.Dial相比具有以下附加功能:
*利用DefaultDNSCacheDuration緩存解決TCP尋址,降低了DNS解析器負載。
*其會以輪詢方式撥打所有已解決的TCP地址直到連接被建立。如果某些地址暫時無法訪問,其將會起到作用。
此撥號器用於在傳遞給Client.Dial或HostClient.Dial前,包裝自定義代碼。
例如,每個主機計數器或及其限制可能通過此種包裝器實現。
傳遞給該函數的地址必需包含端口號。
例如地址值為:
* foobar.baz:443
* foo.bar:80
* aaa.com:8080
func DialTimeout(addr string, timeout time.Duration) (net.Conn, error)
DialTimeout函數會在給定超時時間內使用tcp4撥打給定TCP地址。
該函數與net.Dial相比具有以下附加功能:
*利用DefaultDNSCacheDuration緩存解決TCP尋址,降低了DNS解析器負載。
*其會以輪詢方式撥打所有已解決的TCP地址直到連接被建立。如果某些地址暫時無法訪問,其將會起到作用。
此撥號器用於在傳遞給Client.Dial或HostClient.Dial前,包裝自定義代碼。
例如,每個主機計數器或及其限制可能通過此種包裝器實現。
傳遞給該函數的地址必需包含端口號。
例如地址值為:
* foobar.baz:443
* foo.bar:80
func Do(req *Request, resp *Response) error
Do函數用於執行給定HTTP請求,並填充給定HTTP響應。
請求必需是具有完整URL格式(包括scheme及host)且非零的RequestURI,或是非零Host header + RequestURI的形式。
客戶端將根據以下規則決定被請求的服務器:
-若RequestURI包含具有scheme及host的完整URL,將由其決定。
-否則由Host header決定。
該函數不遵循重定向。如需重定向,請使用Get*函數。
若resp為nil,則響應將被忽略。
若DefaultMaxConnsPerHost所連接的請求主機當前出於繁忙狀態,ErrNoFreeConns將被返回。
建議在對性能要求嚴格的代碼中,通過AcquireRequest和AcquireResponse獲取req及resp。
func DoDeadline(req *Request, resp *Response, deadline time.Time) error
DoDeadline函數用於執行給定請求並在規定截止時間deadline前等待響應。
請求必需是具有完整URL格式(包括scheme及host)且非零的RequestURI,或是非零Host header + RequestURI的形式。
客戶端將根據以下規則決定被請求的服務器:
-若RequestURI包含具有scheme及host的完整URL,將由其決定。
-否則由Host header決定。
該函數不遵循重定向。如需重定向,請使用Get*函數。
若resp為nil,則響應將被忽略。
若直到給定截止時間deadline響應仍未被返回,則ErrTimeout將被返回。
建議在對性能要求嚴格的代碼中,通過AcquireRequest和AcquireResponse獲取req及resp。
func DoTimeout(req *Request, resp *Response, timeout time.Duration) error
DoTimeout函數用於執行給定請求並在給定超時持續時間timeout內等待響應。
請求必需是具有完整URL格式(包括scheme及host)且非零的RequestURI,或是非零Host header + RequestURI的形式。
客戶端將根據以下規則決定被請求的服務器:
-若RequestURI包含具有scheme及host的完整URL,將由其決定。
-否則由Host header決定。
該函數不遵循重定向。如需重定向,請使用Get*函數。
若resp為nil,則響應將被忽略。
若直到給定超時時間timeout響應仍未被返回,則ErrTimeout將被返回。
建議在對性能要求嚴格的代碼中,通過AcquireRequest和AcquireResponse獲取req及resp。
func EqualBytesStr(b []byte, s string) bool
若string(b)==成立,則EqualBytesStr函數將會返回true。
該函數與string(b)==s相比不具有性能優勢。此處保留僅出於向后兼容考慮。
該函數並不推薦使用,未來可能被移除。
func FileLastModified(path string) (time.Time, error)
FileLastModified用於返回最近一次修改文件的時間。
func Get(dst []byte, url string) (statusCode int, body []byte, err error)
Get函數用於附加url字符串內容至dst目的字節切片,並將其返回作為body主體。
該函數跟隨重定向。如需手動處理重定向,請使用Do*函數。
若dst目的字節切片為nil,則新body主體緩沖將被分配。
func GetDeadline(dst []byte, url string, deadline time.Time) (statusCode int, body []byte, err error)
GetDeadline函數用於附加url字符串內容至dst目的字節切片中,並將其返回作為body主體。
該函數跟隨重定向。如需手動處理重定向,請使用Do*函數。
若dst目的字節切片為nil,則新body主體緩沖將被分配。
若url內容在給定超時時間timeout內無法被取出,則ErrTimeout將會被返回。
func ListenAndServe(addr string, handler RequestHandler) error
ListenAndServe函數用於服務給定TCP地址addr及給定handler的HTTP請求。
func ListenAndServeTLS(addr, certFile, keyFile string, handler RequestHandler) error
ListenAndServeTLS函數用於服務給定TCP地址addr及給定handler的HTTPS請求。
certFile、keyFile分別為到TLS證書及密鑰文件的路徑。
func ListenAndServeTLSEmbed(addr string, certData, keyData []byte, handler RequestHandler) error
ListenAndServeTLSEmbed函數用於服務給定TCP地址addr及給定handler的HTTPS請求。
certData與keyData必需包含有效的TLS證書及密鑰數據。
func ListenAndServeUNIX(addr string, mode os.FileMode, handler RequestHandler) error
ListenAndServeUNIX函數用於服務給定UNIX地址addr及給定handler的HTTP請求。
該函數在開始服務前會刪除addr地址現有的文件。
UNIX地址addr的服務器將設置為給定文件模式。
func NewStreamReader(sw StreamWriter) io.ReadCloser
NewStreamReader函數將會返回一個由sw生成的重放其所有數據的讀取器。
被返回的讀取器可被傳遞到Response.SetBodyStream中。
Close必須在返回的讀取器中所有所需數據被讀取后調用,否則Go協程可能會發生泄漏。
詳情請參見Response.SetBodyStreamWriter。
func ParseByteRange(byteRange []byte, contentLength int) (startPos, endPos int, err error)
ParseByteRange函數用於解析“Range:bytes=...”格式的header請求頭的值。
其遵從 https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35 。
func ParseHTTPDate(date []byte) (time.Time, error)
ParseHTTPData函數用於解析遵從RFC1123格式的日期。
func ParseIPv4(dst net.IP, ipStr []byte) (net.IP, error)
ParseIPv4函數用於將ipStr字節切片解析到net.IP類型的dst中,並返回擴展后的dst目的net.IP及錯誤信息。
func ParseUfloat(buf []byte) (float64, error)
ParseUfloat函數用於從buf字節切片中解析無符號浮點數。
func ParseUint(buf []byte) (int, error)
ParseUint函數用於從buf字節切片中解析無符號整數。
func Post(dst []byte, url string, postArgs *Args) (statusCode int, body []byte, err error)
Post函數用於發送攜帶給定POST參數的POST請求到給定url。
響應的body主體將會被附加到dst字節切片中並被返回。
該函數跟隨重定向。如需手動處理重定向,請使用Do*函數。
若dst目的字節切片為nil,則新body主體緩沖將被分配。
若postArgs為nil,空POST的body主體將會被發送。
func ReleaseArgs(a *Args)
ReleaseArgs函數經過AquireArgs返回對象的捕捉到池中。
不要訪問釋放的Args對象,否則將可能發生數據競爭。
func ReleaseByteBuffer(b *ByteBuffer)
ReleaseByteBUffer函數用於返回字節緩沖到池中。
不得接觸返回到池中后的ByteBuffer.B,否則數據競爭將會發生。
func ReleaseCookie(c *Cookie)
ReleaseCookie函數經過AcquireCookie返回Cookie對象的捕捉到池中。
不要訪問釋放的Cookie對象,否則可能發生數據競爭。
func ReleaseRequest(req *Request)
ReleaseRequest函數經過AcquireRequest返回req的捕捉到請求池中。
在返回請求到請求池中后,禁止訪問req及其成員。
func ReleaseResponse(resp *Response)
ReleaseResponse函數經過AcquireResponse返回resp的捕捉到響應池中。
在返回響應到響應池中后,禁止訪問resp及其成員。
func ReleaseURI(u *URI)
ReleaseURI函數經過AcquireURI釋放URI。
不得在釋放URI后使用釋放的URI,否則可能發送數據競爭。
func SaveMultipartFile(fh *multipart.FileHeader, path string) error
SaveMultipartFile函數用於在給定的文件路徑下保存多段文件fh。
func Serve(ln net.Listener, handler RequestHandler) error
Serve函數用於從給定的監聽ln中傳入給定handler。
服務將阻塞直到給定監聽返回永久性錯誤。
func ServeConn(c net.Conn, handler RequestHandler)
ServeConn函數利用給定handler從給定連接中服務HTTP請求。
若來此c的所有請求都被成功服務,ServeConn函數將返回nil。否則返回非nil錯誤。
連接c必須立即向Write函數發送所有已通過的數據至客戶端。否則請求的處理可能被掛起。
ServeConn函數在返回前需關閉連接c。
func ServeFile(ctx *RequestCtx, path string)
ServeFile函數用於返回包含在給定路徑的壓縮文件內容的HTTP響應。
HTTP響應可以在下列情況下,包含非壓縮的內容:
*缺少“Accept-Encoding: gzip”請求頭。
*沒有該文件目錄的寫權限。
若路徑指向目錄,則目錄內容將被返回。
使用ServeFileUncompressed時,無需提供壓縮文件內容。
詳情請參見RequestCtx.SendFile。
func ServeFileBytes(ctx *RequestCtx, path []byte)
ServeFileBytes函數用於返回給定路徑下包含壓縮文件內容的HTTP響應。
HTTP響應可以在下列情況下,包含非壓縮的內容:
*缺少“Accept-Encoding: gzip”請求頭。
*沒有該文件目錄的寫權限。
若路徑指向目錄,則目錄內容將被返回。
使用ServeFileUncompressed時,無需提供壓縮文件內容。
詳情請參見RequestCtx.SendFileBytes。
func ServeFileBytesUncompressed(ctx *RequestCtx, path []byte)
ServeFileBytesUncompressed函數用於返回給定路徑下包含文件內容的HTTP響應。
若路徑指向目錄,則目錄內容被返回。
當服務文件具有良好的壓縮比時,ServeFileBytes可節約網絡流量。
詳情請參見RequestCtx.SendFileBytes。
func ServeFileUncompressed(ctx *RequestCtx, path string)
ServeFileUncompressed函數用於返回給定路徑下包含文件內容的HTTP響應。
若路徑指向目錄,則目錄內容被返回。
當服務文件具有良好的壓縮比時,ServeFile可節約網絡流量。
詳情請參見RequestCtx.SendFile。
func ServeTLS(ln net.Listener, certFile, keyFile string, handler RequestHandler) error
ServeTLS函數利用給定handler服務給定net.Listener中HTTPS請求。
certFile、keyFile分別為到TLS證書及密鑰文件的路徑。
func ServeTLSEmbed(ln net.Listener, certData, keyData []byte, handler RequestHandler) error
ServeTLSEmbed函數利用給定handler服務給定net.Listner中的HTTS請求。
certData與keyData必需包含有效的TLS證書及密鑰數據。
func StatusMessage(statusCode int) string
StatusMessage函數用於返回給定狀態碼的HTTP狀態信息。
func WriteGunzip(w io.Writer, p []byte) (int, error)
WriteGunzip函數用於寫入未壓縮的字節切片p至寫入器w中,並返回寫入到w中的非壓縮的字節數及錯誤信息。
func WriteGzip(w io.Writer, p []byte) (int, error)
WriteGzip函數用於寫入gzip壓縮的字節切片p至寫入器w中,並返回寫入到w中的壓縮過的字節數及錯誤信息。
func WriteGzipLevel(w io.Writer, p []byte, level int) (int, error)
WriteGzipLevel函數使用給定壓縮級別寫入gzip壓縮的字節切片p至寫入器w中,並返回寫入到w中的壓縮過的字節數及錯誤信息。
支持的壓縮級別:
* compressnocompression 未壓縮
* compressbestspeed 最快速度
* compressbestcompression 最大壓縮比
* compressdefaultcompression 默認壓縮級別
func WriteInflate(w io.Writer, p []byte) (int, error)
WriteInflate函數用於inflate方式寫字節切片p至寫入器w中,並返回寫入到w中非壓縮的字節數及錯誤信息。
func WriteMultipartForm(w io.Writer, f *multipart.Form, boundary string) error
WriteMultipartForm函數用於將給定的多部分表格f的給定邊界boundary中的內容寫入至寫入器w。
type Args
type Args Struct {
// 包含過濾掉的或未導出的內容
}
Args代表查詢參數。
嚴禁復制Args實例。請新建新實例代替並使用CopyTo函數。
Args實例不得從並發運行的Go協程中使用。
func AcquireArgs() *Args
AcquireArgs函數用於從池中返回一個空的Args對象。
當不再需要時,返回的Args可能會通過ReleaseArgs被返回到池中。這將會降低GC負載。
func (a *Args) Add(key, value string)
Add函數用於添加“key=value”鍵值對參數。
同一個鍵可允許添加多個值。
func (a *Args) AddBytesK(key []byte, value string)
AddBytesK函數用於添加“key=value”參數。
同一個鍵可允許添加多個值。
func (a *Args) AddBytesKV(key, value []byte)
AddBytesKV函數用於添加“key=value”參數。
同一個鍵可允許添加多個值。
func (a *Args) AddBytesV(key string, value []byte)
AddBytesV函數用於添加“key=value”參數。
同一個鍵可允許添加多個值。
func (a *Args) AppendBytes(dst []byte) []byte
AppendBytes函數用於附加查詢字符串到dst目的字節切片,並返回擴展后的dst目的字符切片結果。
func (a *Args) CopyTo(dst *Args)
CopyTo函數用於賦值所有args到dst目的字符切片中。
func (a *Args) Del(key string)
Del函數通過給定鍵key從查詢參數args中刪除參數。
func (a *Args) DelBytes(key []byte)
DelBytes函數通過給定鍵key從查詢參數args中刪除參數。
func (a *Args) GetUfloat(key string) (float64, error)
GetUfloat函數通過給定鍵key返回無符號浮點數。
func (a *Args) GetUfloatOrZero(key string) float64
GetUfloatOrZero函數通過給定鍵key返回無符號浮點數。
當發生錯誤時,零值被返回。
func (a *Args) GetUint(key string) (int, error)
GetUint函數通過給定鍵key返回無符號整數。
func (a *Args) GetUintOrZero(key string) int
GetUintOrZero函數通過給定鍵key返回無符號整數。
當發生錯誤時,零值被返回。
func (a *Args) Has(key string) bool
若給定鍵key存在於Args中,則Has函數返回ture。
func (a *Args) HasBytes(key []byte) bool
若給定鍵key存在於Args中,則HasBytes函數返回true。
func (a *Args) Len() int
Len函數用於返回查詢參數args的數量。
func (a *Args) Parse(s string)
Parse函數用於解析包含查詢參數的給定字符串string。
func (a *Args) ParseBytes(b []byte)
ParseBytes函數用於解析包含查詢參數的給定字節切片b。
func (a *Args) Peek(key string) []byte
Peek函數用於返回給定鍵key的產訊參數值。
返回值在下一次調用Args前有效。
func (a *Args) PeekBytes(key []byte) []byte
PeekBytes函數用於返回給定鍵key的查詢參數值。
返回值在下一次調用Args前有效。
func (a *Args) PeekMulti(key string) [][]byte
PeekMulti函數用於返回給定鍵key的所有參數值。
func (a *Args) PeekMultiBytes(key []byte) [][]byte
PeekMultiBytes函數用於返回給定鍵key的所有參數值。
func (a *Args) QueryString() []byte
QueryString函數用於返回args的查詢字符串。
返回值在下一次調用Args方法前有效。
func (a *Args) Reset()
Reset函數用於情況查詢參數args。
func (a *Args) Set(key, value string)
Set函數用於設置“key=value”鍵值對參數。
func (a *Args) SetBytesK(key []byte, value string)
SetBytesK函數用於設置“key=value”鍵值對參數。
func (a *Args) SetBytesKV(key, value []byte)
SetBytesKV函數用於設置“key=value”鍵值對參數。
func (a *Args) SetBytesV(key string, value []byte)
SetBytesV函數用於設置“key=value”鍵值對參數。
func (a *Args) SetUint(key string, value int)
SetUint函數通過給定鍵key設置無符號整數值。
func (a *Args) SetUintBytes(key []byte, value int)
SetUintBytes函數通過給定鍵key設置無符號整數值。
func (a *Args) String() string
String函數用於返回查詢參數args的字符串表示。
func (a *Args) VisitAll(f func(key, value []byte))
VisitAll函數會對於每一個存在的arg參數調用函數f。
f函數不得在返回后保留鍵、值的引用。如果你需要在返回后存儲他們,請創建鍵、值的副本。
func (a *Args) WriteTo(w io.Writer) (int64, error)
WriteTo函數用於吸入查詢字符串到寫入器w中。
WriteTo實現了io.WriteTo接口。
type BalancingClient
type BalancingClient interface {
DoDeadline(req *Request, resp *Response, deadline time.Time) error
PendingRequests() int
}
BalancingClient是一個客戶端接口,其可被傳遞給LBClient.Client。
type ByteBuffer
type ByteBuffer bytebufferpool.ByteBuffer
ByteBuffer提供字節緩沖器,其可以於fasthttp API中以減少內存分配。
使用AcquireByteBuffer可獲得一個空的字節緩沖器。
不推薦使用ByteBuffer。請使用 github.com/valyala/bytebufferpool 替代。
例程:
// 該請求handler用於設置“Your-IP”你的IP響應頭
// “Your IP is <ip>”信息利用ByteBuffer構建響應。
// header將分配為零值。
yourIPRequestHandler := func(ctx *fasthttp.RequestCtx) {
b := fasthttp.AcquireByteBuffer()
b.B = append(b.B, "Your IP is <"...)
b.B = fasthttp.AppendIPv4(b.B, ctx.RemoteIP())
b.B = append(b.B, ">"...)
ctx.Response.Header.SetBytesV("Your-IP", b.B)
fmt.Fprintf(ctx, "Check response headers - they must contain 'Your-IP: %s'", b.B)
// 現在便可以安全地釋放字節緩沖器了。
// 不再使用。
fasthttp.ReleaseByteBuffer(b)
}
// 啟動fasthttp服務,並在響應頭中返回你的IP。
fasthttp.ListenAndServe(":8080", yourIPRequestHandler)
func AcquireByteBuffer() *ByteBuffer
AcquireByteBuffer用於從池中返回一個空的字節緩沖器。
獲取字節緩沖器可能會通過調用ReleaseByteBuffer函數而被返回到池中。這會減少字節緩沖器管理所需的內存分配數量。
func (b *ByteBuffer) Reset()
Reset函數用於清空字節緩沖器ByteBuffer.B。
func (b *ByteBuffer) Set(p []byte)
Set函數用於設置字節緩沖器ByteBuffer.B至字節切片p中。
func (b *ByteBuffer) SetString(s string)
SetString函數用於設置字節緩沖器ByteBuffer.B至字符串s中。
func (b *ByteBuffer) Write(p []byte) (int, error)
Write函數用於實現io.Writer寫入器,其用於附加字節切片p至字節緩沖器ByteBuffer.B中。
func (b *ByteBuffer) WriteString(s string) (int, error)
WriteString函數用於附加字符串s至字節緩沖器ByteBuffer.B中。
type Client
type Client struct {
// 客戶端名稱。用於請求頭User-Agent中。
//
// 如果未設置,將使用默認客戶端名稱。
Name string
// 通過回調建立到主機的新連接。
//
// 如果未設置,將使用默認的Dial函數。
Dial DialFunc
// 若設置為true,會嘗試連接到IPv4和IPv6地址。
//
// 僅當默認TCP dialer被使用時,此選項被使用,即Dial為空白時。
//
// 由於在很多地方IPv6網絡仍未普及,默認情況下客戶端只連接到IPv4地址。
//
DialDualStack bool
// 用於https連接的TLS配置。
//
// 若未設置,將使用默認TLS配置。
TLSConfig *tls.Config
// 在每個主機上可能被建立的最大連接數。
//
// 若未設置,將使用DefaultMaxConnsPerHost。
MaxConnsPerHost int
// 在此持續時間后,空閑的keep-alive連接將被關閉。
//
// 在默認空閑連接被關閉前,DefaultMaxIdleConnDuration之后。
MaxIdleConnDuration time.Duration
// 用於響應讀取的每個連接緩沖區大小。
// 其也限制了最大header大小。
//
// 若該值為0,則使用默認緩沖區大小。
ReadBufferSize int
// 用於響應寫入的每個連接緩沖區大小。
//
// 若該值為0,則使用默認緩沖區大小。
WriteBufferSize int
// 用於(包括body體在內)完整響應讀取的最大持續時間。
//
// 默認響應讀取超時時間是無限的。
ReadTimeout time.Duration
// 用於(包括body體在內)完整請求寫入的最大持續時間。
//
// 默認請求寫入超時時間是無限的。
WriteTimeout time.Duration
// 最大響應body體大小。
//
// 若該值大於0且響應body體大於該限制,則客戶端返回ErrBodyTooLarge。
//
// 默認響應body體大小是無限的。
MaxResponseBodySize int
// 若此選項被設置,則Header名以現狀傳遞不進行規范化處理。
//
// 禁用header名規范化可能僅用於代理響應其他客戶端期望大小寫敏感的header名。
// 詳情請見 https://github.com/valyala/fasthttp/issues/57
//
// 默認請求和響應header將被規范化,
//即單詞首字母及帶有破折號的單詞首字母被大寫,而其他字母被小寫。
// 例如:
//
// * HOST -> Host
// * content-type -> Content-Type
// * cONTENT-lenGTH -> Content-Length
DisableHeaderNamesNormalizing bool
// 包含過濾掉的或未導出的內容
}