From 066574eebbd0f5f1b6cd1154a160cc292ac1835e Mon Sep 17 00:00:00 2001 From: jub0bs <52325150+jub0bs@users.noreply.github.com> Date: Wed, 2 Aug 2023 14:35:56 +0200 Subject: [PATCH] Fix skewed middleware benchmarks (#156) * Use constants where possible in benchmarks * Add missing Origin to preflights in benchmarks * Clear headers of shared response in benchmarks --- bench_test.go | 43 ++++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/bench_test.go b/bench_test.go index b6e3721..92815cc 100644 --- a/bench_test.go +++ b/bench_test.go @@ -20,69 +20,90 @@ func (r FakeResponse) Write(b []byte) (n int, err error) { return len(b), nil } +const ( + headerOrigin = "Origin" + headerACRM = "Access-Control-Request-Method" + headerACRH = "Access-Control-Request-Headers" + dummyEndpoint = "http://example.com/foo" + dummyOrigin = "https://somedomain.com" +) + func BenchmarkWithout(b *testing.B) { res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) + req, _ := http.NewRequest(http.MethodGet, dummyEndpoint, nil) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { + clear(res.header) testHandler.ServeHTTP(res, req) } } func BenchmarkDefault(b *testing.B) { res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "somedomain.com") + req, _ := http.NewRequest(http.MethodGet, dummyEndpoint, nil) + req.Header.Add(headerOrigin, dummyOrigin) handler := Default().Handler(testHandler) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { + clear(res.header) handler.ServeHTTP(res, req) } } func BenchmarkAllowedOrigin(b *testing.B) { res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("GET", "http://example.com/foo", nil) - req.Header.Add("Origin", "somedomain.com") + req, _ := http.NewRequest(http.MethodGet, dummyEndpoint, nil) + req.Header.Add(headerOrigin, dummyOrigin) c := New(Options{ - AllowedOrigins: []string{"somedomain.com"}, + AllowedOrigins: []string{dummyOrigin}, }) handler := c.Handler(testHandler) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { + clear(res.header) handler.ServeHTTP(res, req) } } func BenchmarkPreflight(b *testing.B) { res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Access-Control-Request-Method", "GET") + req, _ := http.NewRequest(http.MethodOptions, dummyEndpoint, nil) + req.Header.Add(headerOrigin, dummyOrigin) + req.Header.Add(headerACRM, http.MethodGet) handler := Default().Handler(testHandler) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { + clear(res.header) handler.ServeHTTP(res, req) } } func BenchmarkPreflightHeader(b *testing.B) { res := FakeResponse{http.Header{}} - req, _ := http.NewRequest("OPTIONS", "http://example.com/foo", nil) - req.Header.Add("Access-Control-Request-Method", "GET") - req.Header.Add("Access-Control-Request-Headers", "Accept") + req, _ := http.NewRequest(http.MethodOptions, dummyEndpoint, nil) + req.Header.Add(headerOrigin, dummyOrigin) + req.Header.Add(headerACRM, http.MethodGet) + req.Header.Add(headerACRH, "Accept") handler := Default().Handler(testHandler) b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { + clear(res.header) handler.ServeHTTP(res, req) } } + +func clear(h http.Header) { + for k := range h { + delete(h, k) + } +}