]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httputil: don't add User-Agent header by proxy made with NewSingleHostRevers...
authorArtyom Pervukhin <artyom.pervukhin@gmail.com>
Mon, 16 May 2016 12:30:28 +0000 (15:30 +0300)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 16 May 2016 15:03:59 +0000 (15:03 +0000)
If client does not provided User-Agent header, do not set default one
used by net/http package when doing request to backend.

Fixes #15524

Change-Id: I9a46bb3b7ec106bc7c3071e235b872d279994d67
Reviewed-on: https://go-review.googlesource.com/23089
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/http/httputil/reverseproxy.go
src/net/http/httputil/reverseproxy_test.go

index 44d15ff6be7f086fdf98fe35fad4f51bc3716428..49c120afde12fc5f48054a2e7e94fe5887f4e92d 100644 (file)
@@ -90,6 +90,10 @@ 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}
 }
index e9c0658271f06cdf68c754bb7c4e19b2c23f4d40..fe7cdb888f5ced12d4b5aa3831b0dd2d29325090 100644 (file)
@@ -348,6 +348,49 @@ func TestNilBody(t *testing.T) {
        }
 }
 
+// Issue 15524
+func TestUserAgentHeader(t *testing.T) {
+       const explicitUA = "explicit UA"
+       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)
+               }
+       }))
+       defer backend.Close()
+       backendURL, err := url.Parse(backend.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+       proxyHandler := NewSingleHostReverseProxy(backendURL)
+       proxyHandler.ErrorLog = log.New(ioutil.Discard, "", 0) // quiet for tests
+       frontend := httptest.NewServer(proxyHandler)
+       defer frontend.Close()
+
+       getReq, _ := http.NewRequest("GET", frontend.URL, nil)
+       getReq.Header.Set("User-Agent", explicitUA)
+       getReq.Close = true
+       res, err := http.DefaultClient.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 = http.DefaultClient.Do(getReq)
+       if err != nil {
+               t.Fatalf("Get: %v", err)
+       }
+       res.Body.Close()
+}
+
 type bufferPool struct {
        get func() []byte
        put func([]byte)