1// Copyright 2009 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package http 6 7import ( 8 "net/url" 9 "os" 10 "testing" 11) 12 13// TODO(mattn): 14// test ProxyAuth 15 16var UseProxyTests = []struct { 17 host string 18 match bool 19}{ 20 // Never proxy localhost: 21 {"localhost", false}, 22 {"127.0.0.1", false}, 23 {"127.0.0.2", false}, 24 {"[::1]", false}, 25 {"[::2]", true}, // not a loopback address 26 27 {"barbaz.net", false}, // match as .barbaz.net 28 {"foobar.com", false}, // have a port but match 29 {"foofoobar.com", true}, // not match as a part of foobar.com 30 {"baz.com", true}, // not match as a part of barbaz.com 31 {"localhost.net", true}, // not match as suffix of address 32 {"local.localhost", true}, // not match as prefix as address 33 {"barbarbaz.net", true}, // not match because NO_PROXY have a '.' 34 {"www.foobar.com", false}, // match because NO_PROXY includes "foobar.com" 35} 36 37func TestUseProxy(t *testing.T) { 38 ResetProxyEnv() 39 os.Setenv("NO_PROXY", "foobar.com, .barbaz.net") 40 for _, test := range UseProxyTests { 41 if useProxy(test.host+":80") != test.match { 42 t.Errorf("useProxy(%v) = %v, want %v", test.host, !test.match, test.match) 43 } 44 } 45} 46 47var cacheKeysTests = []struct { 48 proxy string 49 scheme string 50 addr string 51 key string 52}{ 53 {"", "http", "foo.com", "|http|foo.com"}, 54 {"", "https", "foo.com", "|https|foo.com"}, 55 {"http://foo.com", "http", "foo.com", "http://foo.com|http|"}, 56 {"http://foo.com", "https", "foo.com", "http://foo.com|https|foo.com"}, 57} 58 59func TestCacheKeys(t *testing.T) { 60 for _, tt := range cacheKeysTests { 61 var proxy *url.URL 62 if tt.proxy != "" { 63 u, err := url.Parse(tt.proxy) 64 if err != nil { 65 t.Fatal(err) 66 } 67 proxy = u 68 } 69 cm := connectMethod{proxy, tt.scheme, tt.addr} 70 if got := cm.key().String(); got != tt.key { 71 t.Fatalf("{%q, %q, %q} cache key = %q; want %q", tt.proxy, tt.scheme, tt.addr, got, tt.key) 72 } 73 } 74} 75 76func ResetProxyEnv() { 77 for _, v := range []string{"HTTP_PROXY", "http_proxy", "NO_PROXY", "no_proxy"} { 78 os.Unsetenv(v) 79 } 80 ResetCachedEnvironment() 81} 82 83func TestInvalidNoProxy(t *testing.T) { 84 ResetProxyEnv() 85 os.Setenv("NO_PROXY", ":1") 86 useProxy("example.com:80") // should not panic 87} 88