src/net/http/serve_test.go | 10 ++++++++++ src/net/http/server.go | 3 +++ diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 9cbfe872afe0bc53522e32bf95879e4e72f03252..1df319ac1fc571956654ee11f96bccb320a96d43 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -581,6 +581,16 @@ } } } +func TestShouldRedirectConcurrency(t *testing.T) { + setParallel(t) + defer afterTest(t) + + mux := NewServeMux() + ts := httptest.NewServer(mux) + defer ts.Close() + mux.HandleFunc("/", func(w ResponseWriter, r *Request) {}) +} + func BenchmarkServeMux(b *testing.B) { type test struct { diff --git a/src/net/http/server.go b/src/net/http/server.go index 57e1b5dacb3faf3dbecb5bbecba6d242580164d5..88e00a2eddc62efc7c83ec977e22eac98763cdf7 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2233,6 +2233,9 @@ // shouldRedirect reports whether the given path and host should be redirected to // path+"/". This should happen if a handler is registered for path+"/" but // not path -- see comments at ServeMux. func (mux *ServeMux) shouldRedirect(host, path string) bool { + mux.mu.RLock() + defer mux.mu.RUnlock() + p := []string{path, host + path} for _, c := range p {