我需要找到request.Header請求*http.Request型別的大小:
req, err := http.NewRequest("GET", "/", nil)
cookie := &http.Cookie{Name: "foo", Value: "bar"}
req.AddCookie(cookie)
我試過
len(request.Header) # returned the number of elements in the map -- essentially the number of headers
和
for k, v := range req.Header {
bytesSize = len(k) len(v)
}
這也不起作用,因為它v是一張地圖。
我發現計算一個地圖問題的記憶體占用(或位元組長度),但答案似乎很復雜(而且它們的地圖值是整數,這里不是這種情況)。
更新:實際上這是定義type Header map[string][]string所以我們不必使用遞回。
uj5u.com熱心網友回復:
https://pkg.go.dev/net/http#Server.MaxHeaderBytes可以為您處理這個問題。
這個演示在 Playground (dial or connect timeouts) 中不能可靠地作業。不過,它似乎在本地可靠地作業,這讓我猜測這是操場行為的產物。
我們將啟動一個具有低 MaxHeaderBytes 的 http 服務器,然后大大超過它。
package main
import (
"context"
"fmt"
"io"
"net"
"net/http"
"strings"
"time"
)
func main() {
res := make(chan error)
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "% v", r.Header)
})
s := &http.Server{
Addr: "127.0.0.1:8103",
Handler: mux,
ReadTimeout: 1 * time.Second,
WriteTimeout: 1 * time.Second,
MaxHeaderBytes: 2048,
}
if l, err := net.Listen("tcp", "127.0.0.1:8103"); err != nil {
panic(fmt.Errorf("Couldn't listen: %w", err))
} else {
go func() {
res <- s.Serve(l)
}()
}
client := &http.Client{
Timeout: 3 * time.Second,
}
req, err := http.NewRequest("GET", "http://127.0.0.1:8103", nil)
if err != nil {
panic(err)
}
req.Header.Add("X-Long-Header", strings.Repeat("long ", 2048) "header")
resp, err := client.Do(req)
if err != nil {
panic(fmt.Errorf("HTTP Request failed: %w", err))
}
fmt.Println(resp)
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(fmt.Errorf("Could not read response body: %w", err))
}
fmt.Println("Body:", string(body))
s.Shutdown(context.Background())
<-res
}
在這里,我設定MaxHeaderBytes了一個相當小的值。我在我的X-Long-Header: long long long .... header. 如果您可以讓 Playground 作業(只需運行幾次)或在本地運行,您將獲得:
&{431 Request Header Fields Too Large 431 HTTP/1.1 1 1 map[Content-Type:[text/plain; charset=utf-8]] 0xc00001a180 -1 [] true false map[] 0xc000176000 <nil>}
Body: 431 Request Header Fields Too Large
如您所見,如果所有標題都太大,將自動生成 431。
如果特定標頭太長,則您的處理程式本身以 431 回應可能是合適的,但是當您的處理程式被傳遞時http.Request,標頭已被接收。嘗試自己計算標頭的總長度,然后基于此以 431 回應是沒有意義的。
此外,標準標題可能會來來去去,因此過于嚴格地限制整體標題大小是不明智的。
相反,檢查您關心的任何單個標題。
uj5u.com熱心網友回復:
可能這樣的事情會起作用:
for k, vv := range req.Header {
total = len(k)
for _, v := range vv {
total = len(v)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/338474.html
下一篇:在golang中退出stuts1
