diff --git a/modules/caddyhttp/encode/accepted_encodings_bench_test.go b/modules/caddyhttp/encode/accepted_encodings_bench_test.go new file mode 100644 index 00000000000..ff25c3136d2 --- /dev/null +++ b/modules/caddyhttp/encode/accepted_encodings_bench_test.go @@ -0,0 +1,17 @@ +package encode + +import ( + "net/http" + "net/http/httptest" + "testing" +) + +func BenchmarkAcceptedEncodings(b *testing.B) { + r := httptest.NewRequest(http.MethodGet, "/", nil) + r.Header.Set("Accept-Encoding", "gzip, deflate, br;q=0.9, zstd;q=0.8") + prefer := []string{"zstd", "br", "gzip"} + b.ReportAllocs() + for b.Loop() { + _ = AcceptedEncodings(r, prefer) + } +} diff --git a/modules/caddyhttp/encode/encode.go b/modules/caddyhttp/encode/encode.go index 8a4ac2b2363..887c9fc7346 100644 --- a/modules/caddyhttp/encode/encode.go +++ b/modules/caddyhttp/encode/encode.go @@ -504,16 +504,17 @@ func AcceptedEncodings(r *http.Request, preferredOrder []string) []string { return []string{} } - prefs := []encodingPreference{} + prefs := make([]encodingPreference, 0, strings.Count(acceptEncHeader, ",")+1) for accepted := range strings.SplitSeq(acceptEncHeader, ",") { - parts := strings.Split(accepted, ";") - encName := strings.ToLower(strings.TrimSpace(parts[0])) + encName, params, found := strings.Cut(accepted, ";") + encName = strings.ToLower(strings.TrimSpace(encName)) // determine q-factor qFactor := 1.0 - if len(parts) > 1 { - qFactorStr := strings.ToLower(strings.TrimSpace(parts[1])) + if found { + qFactorStr, _, _ := strings.Cut(params, ";") + qFactorStr = strings.ToLower(strings.TrimSpace(qFactorStr)) if strings.HasPrefix(qFactorStr, "q=") { if qFactorFloat, err := strconv.ParseFloat(qFactorStr[2:], 32); err == nil { if qFactorFloat >= 0 && qFactorFloat <= 1 {