]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httputil: copy response header back to http.ResponseWriter in ReverseProxy...
authorAofei Sheng <aofei@aofeisheng.com>
Sat, 26 Sep 2020 05:21:41 +0000 (13:21 +0800)
committerDamien Neil <dneil@google.com>
Mon, 19 Oct 2020 17:17:28 +0000 (17:17 +0000)
Fixes: #41634
Change-Id: Ib78cc37a4d2ca0753d567eafb616238e4103484e
Reviewed-on: https://go-review.googlesource.com/c/go/+/257777
Reviewed-by: Damien Neil <dneil@google.com>
Trust: Damien Neil <dneil@google.com>
Trust: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Go Bot <gobot@golang.org>

src/net/http/httputil/reverseproxy.go
src/net/http/httputil/reverseproxy_test.go

index 46e5f68a843732beb3e0d779463b46fe6cd0fa49..4e369580ea8a290c39b84ad70b5a48434d1d540e 100644 (file)
@@ -549,8 +549,6 @@ func (p *ReverseProxy) handleUpgradeResponse(rw http.ResponseWriter, req *http.R
                return
        }
 
-       copyHeader(res.Header, rw.Header())
-
        hj, ok := rw.(http.Hijacker)
        if !ok {
                p.getErrorHandler()(rw, req, fmt.Errorf("can't switch protocols using non-Hijacker ResponseWriter type %T", rw))
@@ -581,6 +579,10 @@ func (p *ReverseProxy) handleUpgradeResponse(rw http.ResponseWriter, req *http.R
                return
        }
        defer conn.Close()
+
+       copyHeader(rw.Header(), res.Header)
+
+       res.Header = rw.Header()
        res.Body = nil // so res.Write only writes the headers; we have res.Body in backConn above
        if err := res.Write(brw); err != nil {
                p.getErrorHandler()(rw, req, fmt.Errorf("response write: %v", err))
index ea786864d8ba221c7d9ce8573ce17489482dc1a3..cc05d55d879b131a346de6b9d2f6068396ec496a 100644 (file)
@@ -1157,6 +1157,9 @@ func TestReverseProxyWebSocket(t *testing.T) {
        handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
                rw.Header().Set("X-Header", "X-Value")
                rproxy.ServeHTTP(rw, req)
+               if got, want := rw.Header().Get("X-Modified"), "true"; got != want {
+                       t.Errorf("response writer X-Modified header = %q; want %q", got, want)
+               }
        })
 
        frontendProxy := httptest.NewServer(handler)