]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: reuse http proxy connections for different http requests
authorAlexey Borzenkov <snaury@gmail.com>
Mon, 28 May 2012 17:46:51 +0000 (10:46 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 28 May 2012 17:46:51 +0000 (10:46 -0700)
Comment on cache keys above connectMethod says "http to proxy, http
anywhere after that", however in reality target address was always
included, which prevented http requests to different target
addresses to reuse the same http proxy connection.

R=golang-dev, r, rsc, bradfitz
CC=golang-dev
https://golang.org/cl/5901064

src/pkg/net/http/proxy_test.go
src/pkg/net/http/transport.go

index 9b320b3aa5b9904f26cc5aba7983f60ba5ddd2b7..5ecffaface93de6a145a1f92d1101579ebcaf39b 100644 (file)
@@ -5,6 +5,7 @@
 package http
 
 import (
+       "net/url"
        "os"
        "testing"
 )
@@ -46,3 +47,32 @@ func TestUseProxy(t *testing.T) {
                }
        }
 }
+
+var cacheKeysTests = []struct {
+       proxy  string
+       scheme string
+       addr   string
+       key    string
+}{
+       {"", "http", "foo.com", "|http|foo.com"},
+       {"", "https", "foo.com", "|https|foo.com"},
+       {"http://foo.com", "http", "foo.com", "http://foo.com|http|"},
+       {"http://foo.com", "https", "foo.com", "http://foo.com|https|foo.com"},
+}
+
+func TestCacheKeys(t *testing.T) {
+       for _, tt := range cacheKeysTests {
+               var proxy *url.URL
+               if tt.proxy != "" {
+                       u, err := url.Parse(tt.proxy)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+                       proxy = u
+               }
+               cm := connectMethod{proxy, tt.scheme, tt.addr}
+               if cm.String() != tt.key {
+                       t.Fatalf("{%q, %q, %q} cache key %q; want %q", tt.proxy, tt.scheme, tt.addr, cm.String(), tt.key)
+               }
+       }
+}
index 483af556e46ce0f772429b1ef6c8a1e35aa0961b..dd514386ac1a74cfbc463b7a735db26432d66bac 100644 (file)
@@ -450,10 +450,14 @@ type connectMethod struct {
 
 func (ck *connectMethod) String() string {
        proxyStr := ""
+       targetAddr := ck.targetAddr
        if ck.proxyURL != nil {
                proxyStr = ck.proxyURL.String()
+               if ck.targetScheme == "http" {
+                       targetAddr = ""
+               }
        }
-       return strings.Join([]string{proxyStr, ck.targetScheme, ck.targetAddr}, "|")
+       return strings.Join([]string{proxyStr, ck.targetScheme, targetAddr}, "|")
 }
 
 // addr returns the first hop "host:port" to which we need to TCP connect.