diff options
author | Roman Kollár <roman.kollar.0@gmail.com> | 2019-11-21 22:25:52 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2019-11-22 21:34:49 +0000 |
commit | 94b6eec5dc639e87f0e2f739cfd257a432160881 (patch) | |
tree | 048ca7635a5cee16d111c76031ecb81d44a14541 | |
parent | abfbc0555bdef683d916dd97c1fb353c6d08bee6 (diff) | |
download | go-94b6eec5dc639e87f0e2f739cfd257a432160881.tar.gz go-94b6eec5dc639e87f0e2f739cfd257a432160881.zip |
[release-branch.go1.13] net/http: fix Server.ConnContext modifying context for all new connections
Updates #35750
Fixes #35765
Change-Id: I65d38cfc5ddd66131777e104c269cc3559b2471d
GitHub-Last-Rev: 953fdfd49b2be665be43f8148d2a6180dae3b91c
GitHub-Pull-Request: golang/go#35751
Reviewed-on: https://go-review.googlesource.com/c/go/+/208318
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
(cherry picked from commit bbbc6589dfbc05be2bfa59f51c20f9eaa8d0c531)
Reviewed-on: https://go-review.googlesource.com/c/go/+/208235
Reviewed-by: Bryan C. Mills <bcmills@google.com>
-rw-r--r-- | src/net/http/serve_test.go | 33 | ||||
-rw-r--r-- | src/net/http/server.go | 7 |
2 files changed, 37 insertions, 3 deletions
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 1d1449aa65..90f112b2ee 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -6121,6 +6121,39 @@ func TestServerContextsHTTP2(t *testing.T) { } } +// Issue 35750: check ConnContext not modifying context for other connections +func TestConnContextNotModifyingAllContexts(t *testing.T) { + setParallel(t) + defer afterTest(t) + type connKey struct{} + ts := httptest.NewUnstartedServer(HandlerFunc(func(rw ResponseWriter, r *Request) { + rw.Header().Set("Connection", "close") + })) + ts.Config.ConnContext = func(ctx context.Context, c net.Conn) context.Context { + if got := ctx.Value(connKey{}); got != nil { + t.Errorf("in ConnContext, unexpected context key = %#v", got) + } + return context.WithValue(ctx, connKey{}, "conn") + } + ts.Start() + defer ts.Close() + + var res *Response + var err error + + res, err = ts.Client().Get(ts.URL) + if err != nil { + t.Fatal(err) + } + res.Body.Close() + + res, err = ts.Client().Get(ts.URL) + if err != nil { + t.Fatal(err) + } + res.Body.Close() +} + // Issue 30710: ensure that as per the spec, a server responds // with 501 Not Implemented for unsupported transfer-encodings. func TestUnsupportedTransferEncodingsReturn501(t *testing.T) { diff --git a/src/net/http/server.go b/src/net/http/server.go index 95a5eabaa2..8252e45aca 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -2915,16 +2915,17 @@ func (srv *Server) Serve(l net.Listener) error { } return e } + connCtx := ctx if cc := srv.ConnContext; cc != nil { - ctx = cc(ctx, rw) - if ctx == nil { + connCtx = cc(connCtx, rw) + if connCtx == nil { panic("ConnContext returned nil") } } tempDelay = 0 c := srv.newConn(rw) c.setState(c.rwc, StateNew) // before Serve can return - go c.serve(ctx) + go c.serve(connCtx) } } |