]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: document setting of Proxy-Authorization header
authorDamien Neil <dneil@google.com>
Mon, 24 Jul 2023 15:24:40 +0000 (11:24 -0400)
committerDamien Neil <dneil@google.com>
Mon, 28 Aug 2023 16:42:28 +0000 (16:42 +0000)
Add a test for setting a proxy username/password in
the HTTP_PROXY environment variable as well.

Fixes #61505

Change-Id: I31c3fa94c7bc463133321e9af9289fd47da75b46
Reviewed-on: https://go-review.googlesource.com/c/go/+/512555
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/net/http/transport.go
src/net/http/transport_test.go

index 35dfe908d825f47a302f2b92b9d25c6ad960fea4..ac7477ea1d8d939ad021f5fb0c48831d94e503fa 100644 (file)
@@ -117,6 +117,10 @@ type Transport struct {
        // "https", and "socks5" are supported. If the scheme is empty,
        // "http" is assumed.
        //
+       // If the proxy URL contains a userinfo subcomponent,
+       // the proxy request will pass the username and password
+       // in a Proxy-Authorization header.
+       //
        // If Proxy is nil or returns a nil *URL, no proxy is used.
        Proxy func(*Request) (*url.URL, error)
 
index bcc26aa58e03fa491cb0c15b9c8c09ddcac56848..9f086172d3c4c303bbf56d325744429c48cadba4 100644 (file)
@@ -6810,3 +6810,36 @@ func testRequestSanitization(t *testing.T, mode testMode) {
                resp.Body.Close()
        }
 }
+
+func TestProxyAuthHeader(t *testing.T) {
+       // Not parallel: Sets an environment variable.
+       run(t, testProxyAuthHeader, []testMode{http1Mode}, testNotParallel)
+}
+func testProxyAuthHeader(t *testing.T, mode testMode) {
+       const username = "u"
+       const password = "@/?!"
+       cst := newClientServerTest(t, mode, HandlerFunc(func(rw ResponseWriter, req *Request) {
+               // Copy the Proxy-Authorization header to a new Request,
+               // since Request.BasicAuth only parses the Authorization header.
+               var r2 Request
+               r2.Header = Header{
+                       "Authorization": req.Header["Proxy-Authorization"],
+               }
+               gotuser, gotpass, ok := r2.BasicAuth()
+               if !ok || gotuser != username || gotpass != password {
+                       t.Errorf("req.BasicAuth() = %q, %q, %v; want %q, %q, true", gotuser, gotpass, ok, username, password)
+               }
+       }))
+       u, err := url.Parse(cst.ts.URL)
+       if err != nil {
+               t.Fatal(err)
+       }
+       u.User = url.UserPassword(username, password)
+       t.Setenv("HTTP_PROXY", u.String())
+       cst.tr.Proxy = ProxyURL(u)
+       resp, err := cst.c.Get("http://_/")
+       if err != nil {
+               t.Fatal(err)
+       }
+       resp.Body.Close()
+}