我正在为我正在写的代理进行单元测试。我不能为我的生活看到为什么环境被忽略,我的测试直接访问目标服务器acap
。
func TestHandleHTTPS(t *testing.T) {
successfulCalls := 0
proxyPassed := 0
acap := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
successfulCalls++
}))
defer acap.Close()
testproxy := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
proxyPassed++
}))
defer testproxy.Close()
os.Setenv("https_proxy", testproxy.URL)
defer os.Setenv("https_proxy", "")
client := acap.Client()
tmp := client.Transport.(*http.Transport)
tmp.Proxy = http.ProxyFromEnvironment // <--- This should make client use env vars!
req, err := http.NewRequest("GET", acap.URL, nil)
if err != nil {
t.Errorf("Unable to create request: %s", err.Error())
}
resp, err := client.Do(req)
if err != nil {
t.Errorf("Something is wrong with the test: %s", err.Error())
return
}
if resp.StatusCode != 200 {
t.Errorf("Unexpected status code: %d", resp.StatusCode)
body, _ := ioutil.ReadAll(resp.Body)
t.Errorf("Body: %s", string(body))
}
if successfulCalls == 0 {
t.Errorf("No successful call over HTTPS occurred")
}
if proxyPassed == 0 {
t.Errorf("Proxy got ignored")
}
}
我唯一的失败是Proxy got ignored
。我使用Go v1.10,一切都编译。
编辑1:
我做了tmp.Proxy
舞蹈,因为客户已经在Transport
中配置了证书和内容。我不想通过替换整个Transport
结构
答案 0 :(得分:2)
如果你看一下doc for ProxyFromEnvironment,你会发现一个特例:
作为一种特殊情况,如果req.URL.Host是“localhost”(带或不带端口号),则会返回nil URL和nil错误。
这意味着不会使用任何代理。我建议你改用ProxyURL
proxyURL, _ := url.Parse(testproxy.URL)
tmp.Proxy = http.ProxyURL(proxyURL)
它将考虑您的代理,但不会工作,因为您正在尝试进行https调用抛出http代理...