]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: fix Server.ConnContext modifying context for all new connections
authorRoman Kollár <roman.kollar.0@gmail.com>
Thu, 21 Nov 2019 22:25:52 +0000 (22:25 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 21 Nov 2019 23:15:28 +0000 (23:15 +0000)
Fixes #35750

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>

src/net/http/serve_test.go
src/net/http/server.go

index 9077c0c1220db11e0e15884619e4435ab6a9bb53..a2ab52b82900a5871cc4715d0ed77bc97a402438 100644 (file)
@@ -6126,6 +6126,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) {
index 4f1c73dbdfc6656fcf8ce5fa4a18585f0d3f0e0a..58aff08424db84ce73a44a3dc536403830c7779e 100644 (file)
@@ -2920,16 +2920,17 @@ func (srv *Server) Serve(l net.Listener) error {
                        }
                        return err
                }
+               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)
        }
 }