]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httputil: don't insert default User-Agent header in proxied requests
authorDamien Neil <dneil@google.com>
Thu, 19 May 2022 19:33:05 +0000 (12:33 -0700)
committerDamien Neil <dneil@google.com>
Fri, 12 Aug 2022 16:38:52 +0000 (16:38 +0000)
When ReverseProxy forwards a request with no User-Agent header, leave
the header in the forwarded request blank rather than inserting the
default Go HTTP clent User-Agent.

We already did this for NewSingleHostReverseProxy; generalize it to
every ReverseProxy.

Change-Id: Id81a230cb8d384acdfae190b78a4265d80720388
Reviewed-on: https://go-review.googlesource.com/c/go/+/407375
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
src/net/http/httputil/reverseproxy.go
src/net/http/httputil/reverseproxy_test.go

index a5a3900fb37c86cb60621db23b9c72c270118e76..0c5249717728d676de07251ab21877413cb40fbe 100644 (file)
@@ -156,10 +156,6 @@ func NewSingleHostReverseProxy(target *url.URL) *ReverseProxy {
                } else {
                        req.URL.RawQuery = targetQuery + "&" + req.URL.RawQuery
                }
-               if _, ok := req.Header["User-Agent"]; !ok {
-                       // explicitly disable User-Agent so it's not set to default value
-                       req.Header.Set("User-Agent", "")
-               }
        }
        return &ReverseProxy{Director: director}
 }
@@ -321,6 +317,12 @@ func (p *ReverseProxy) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
                }
        }
 
+       if _, ok := outreq.Header["User-Agent"]; !ok {
+               // If the outbound request doesn't have a User-Agent header set,
+               // don't send the default Go HTTP client User-Agent.
+               outreq.Header.Set("User-Agent", "")
+       }
+
        res, err := transport.RoundTrip(outreq)
        if err != nil {
                p.getErrorHandler()(rw, outreq, err)
index 23453c8bdc909e1e5fac8ad65bce94796cbe6dd5..3090e375826c440c98f9a2e0e9cb27a0ca638231 100644 (file)
@@ -614,46 +614,38 @@ func TestNilBody(t *testing.T) {
 
 // Issue 15524
 func TestUserAgentHeader(t *testing.T) {
-       const explicitUA = "explicit UA"
+       var gotUA string
        backend := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-               if r.URL.Path == "/noua" {
-                       if c := r.Header.Get("User-Agent"); c != "" {
-                               t.Errorf("handler got non-empty User-Agent header %q", c)
-                       }
-                       return
-               }
-               if c := r.Header.Get("User-Agent"); c != explicitUA {
-                       t.Errorf("handler got unexpected User-Agent header %q", c)
-               }
+               gotUA = r.Header.Get("User-Agent")
        }))
        defer backend.Close()
        backendURL, err := url.Parse(backend.URL)
        if err != nil {
                t.Fatal(err)
        }
-       proxyHandler := NewSingleHostReverseProxy(backendURL)
+
+       proxyHandler := new(ReverseProxy)
        proxyHandler.ErrorLog = log.New(io.Discard, "", 0) // quiet for tests
+       proxyHandler.Director = func(req *http.Request) {
+               req.URL = backendURL
+       }
        frontend := httptest.NewServer(proxyHandler)
        defer frontend.Close()
        frontendClient := frontend.Client()
 
-       getReq, _ := http.NewRequest("GET", frontend.URL, nil)
-       getReq.Header.Set("User-Agent", explicitUA)
-       getReq.Close = true
-       res, err := frontendClient.Do(getReq)
-       if err != nil {
-               t.Fatalf("Get: %v", err)
-       }
-       res.Body.Close()
-
-       getReq, _ = http.NewRequest("GET", frontend.URL+"/noua", nil)
-       getReq.Header.Set("User-Agent", "")
-       getReq.Close = true
-       res, err = frontendClient.Do(getReq)
-       if err != nil {
-               t.Fatalf("Get: %v", err)
+       for _, sentUA := range []string{"explicit UA", ""} {
+               getReq, _ := http.NewRequest("GET", frontend.URL, nil)
+               getReq.Header.Set("User-Agent", sentUA)
+               getReq.Close = true
+               res, err := frontendClient.Do(getReq)
+               if err != nil {
+                       t.Fatalf("Get: %v", err)
+               }
+               res.Body.Close()
+               if got, want := gotUA, sentUA; got != want {
+                       t.Errorf("got forwarded User-Agent %q, want %q", got, want)
+               }
        }
-       res.Body.Close()
 }
 
 type bufferPool struct {