From 2fc9705d14a5a5a269482544c032fcc53d696d92 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 19 Nov 2025 11:28:29 +0800 Subject: [PATCH] http3: add a benchmark for header parsing (#5435) --- http3/headers_test.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/http3/headers_test.go b/http3/headers_test.go index ef5ac278..6b00f30d 100644 --- a/http3/headers_test.go +++ b/http3/headers_test.go @@ -1,6 +1,7 @@ package http3 import ( + "bytes" "fmt" "net/http" "testing" @@ -452,3 +453,39 @@ func TestResponseTrailerParsingValidation(t *testing.T) { _, err := parseTrailers(headers) require.EqualError(t, err, "http3: received pseudo header in trailer: :status") } + +func BenchmarkRequestFromHeaders(b *testing.B) { + b.ReportAllocs() + + headers := []qpack.HeaderField{ + {Name: ":path", Value: "/api/v1/users/12345"}, + {Name: ":authority", Value: "quic-go.net"}, + {Name: ":method", Value: http.MethodPost}, + {Name: "content-type", Value: "application/json"}, + {Name: "content-length", Value: "1024"}, + {Name: "user-agent", Value: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15"}, + {Name: "accept", Value: "application/json, text/plain, */*"}, + {Name: "accept-encoding", Value: "gzip, deflate, br"}, + {Name: "accept-language", Value: "en-US,en;q=0.9"}, + {Name: "cache-control", Value: "no-cache"}, + {Name: "cookie", Value: "session_id=abc123"}, + {Name: "cookie", Value: "user_pref=dark_mode"}, + {Name: "referer", Value: "https://quic-go.net/docs/http3/"}, + } + var buf bytes.Buffer + enc := qpack.NewEncoder(&buf) + for _, hf := range headers { + require.NoError(b, enc.WriteField(hf)) + } + + dec := qpack.NewDecoder(func(f qpack.HeaderField) {}) + for b.Loop() { + hfs, err := dec.DecodeFull(buf.Bytes()) + if err != nil { + b.Fatalf("failed to decode headers: %v", err) + } + if _, err := requestFromHeaders(hfs); err != nil { + b.Fatalf("failed to parse request: %v", err) + } + } +} -- 2.43.0