]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: support https_proxy in ProxyFromEnvironment
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 24 Sep 2014 23:55:39 +0000 (16:55 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 24 Sep 2014 23:55:39 +0000 (16:55 -0700)
Fixes #6181

LGTM=adg
R=adg
CC=golang-codereviews
https://golang.org/cl/148980043

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

index 2c87353554a13276c0c8784b179261655c1d3028..f8cc835b250180ba92526c83e2648dd7319635a5 100644 (file)
@@ -66,6 +66,7 @@ func NewTestTimeoutHandler(handler Handler, ch <-chan time.Time) Handler {
 
 func ResetCachedEnvironment() {
        httpProxyEnv.reset()
+       httpsProxyEnv.reset()
        noProxyEnv.reset()
 }
 
index f1aab8587c1a47255156f8b54a86899e8abad915..6be341faa9227baaf6d9eba56e46de8af9e375d5 100644 (file)
@@ -124,7 +124,13 @@ type Transport struct {
 // As a special case, if req.URL.Host is "localhost" (with or without
 // a port number), then a nil URL and nil error will be returned.
 func ProxyFromEnvironment(req *Request) (*url.URL, error) {
-       proxy := httpProxyEnv.Get()
+       var proxy string
+       if req.URL.Scheme == "https" {
+               proxy = httpsProxyEnv.Get()
+       }
+       if proxy == "" {
+               proxy = httpProxyEnv.Get()
+       }
        if proxy == "" {
                return nil, nil
        }
@@ -276,6 +282,9 @@ var (
        httpProxyEnv = &envOnce{
                names: []string{"HTTP_PROXY", "http_proxy"},
        }
+       httpsProxyEnv = &envOnce{
+               names: []string{"HTTPS_PROXY", "https_proxy"},
+       }
        noProxyEnv = &envOnce{
                names: []string{"NO_PROXY", "no_proxy"},
        }
index bdfeba3626fccefebed4b186b5382211fcb37462..2ffd3597945cffb2dad4dd922c24cc775bec3701 100644 (file)
@@ -1701,26 +1701,40 @@ Content-Length: %d
 }
 
 type proxyFromEnvTest struct {
-       req     string // URL to fetch; blank means "http://example.com"
-       env     string
-       noenv   string
+       req string // URL to fetch; blank means "http://example.com"
+
+       env      string // HTTP_PROXY
+       httpsenv string // HTTPS_PROXY
+       noenv    string // NO_RPXY
+
        want    string
        wanterr error
 }
 
 func (t proxyFromEnvTest) String() string {
        var buf bytes.Buffer
+       space := func() {
+               if buf.Len() > 0 {
+                       buf.WriteByte(' ')
+               }
+       }
        if t.env != "" {
                fmt.Fprintf(&buf, "http_proxy=%q", t.env)
        }
+       if t.httpsenv != "" {
+               space()
+               fmt.Fprintf(&buf, "https_proxy=%q", t.httpsenv)
+       }
        if t.noenv != "" {
-               fmt.Fprintf(&buf, " no_proxy=%q", t.noenv)
+               space()
+               fmt.Fprintf(&buf, "no_proxy=%q", t.noenv)
        }
        req := "http://example.com"
        if t.req != "" {
                req = t.req
        }
-       fmt.Fprintf(&buf, " req=%q", req)
+       space()
+       fmt.Fprintf(&buf, "req=%q", req)
        return strings.TrimSpace(buf.String())
 }
 
@@ -1731,7 +1745,15 @@ var proxyFromEnvTests = []proxyFromEnvTest{
        {env: "https://cache.corp.example.com", want: "https://cache.corp.example.com"},
        {env: "http://127.0.0.1:8080", want: "http://127.0.0.1:8080"},
        {env: "https://127.0.0.1:8080", want: "https://127.0.0.1:8080"},
+
+       // Don't use secure for http
+       {req: "http://insecure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://http.proxy.tld"},
+       // Use secure for https.
+       {req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "secure.proxy.tld", want: "http://secure.proxy.tld"},
+       {req: "https://secure.tld/", env: "http.proxy.tld", httpsenv: "https://secure.proxy.tld", want: "https://secure.proxy.tld"},
+
        {want: "<nil>"},
+
        {noenv: "example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
        {noenv: ".example.com", req: "http://example.com/", env: "proxy", want: "<nil>"},
        {noenv: "ample.com", req: "http://example.com/", env: "proxy", want: "http://proxy"},
@@ -1743,6 +1765,7 @@ func TestProxyFromEnvironment(t *testing.T) {
        ResetProxyEnv()
        for _, tt := range proxyFromEnvTests {
                os.Setenv("HTTP_PROXY", tt.env)
+               os.Setenv("HTTPS_PROXY", tt.httpsenv)
                os.Setenv("NO_PROXY", tt.noenv)
                ResetCachedEnvironment()
                reqURL := tt.req