我正在尝试使用具有用户名/密码授权的代理对HTTPS URL发出List<String> CheckedNames(System.Windows.Forms.TreeNodeCollection theNodes)
{
List<String> aResult = new List<String>();
if (theNodes != null)
{
foreach (System.Windows.Forms.TreeNode aNode in theNodes)
{
if (aNode.Checked)
{
string[] itemName = Regex.Split(aNode.Text, " - ");
aResult.Add(itemName[0]);
}
aResult.AddRange(CheckedNames(aNode.Nodes));
}
}
return aResult;
}
请求(代理需要auth,而不是网站)。
这是我的所作所为:
GET
问题是,当我尝试向HTTP(而不是HTTPS)站点发出请求时,它可以正常运行,但是如果我发出HTTPS请求则会失败(请参阅上面的消息)。
我用我的浏览器(FireFox)测试了代理,一切顺利,我通过firebug查找了标题,并添加了与请求相关的所有内容(上图)。我已经对package main
import (
"crypto/tls"
"encoding/base64"
"fmt"
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
ua := "Mozilla/5.0 (Windows NT 6.1"
basic := "Basic " + base64.StdEncoding.EncodeToString([]byte("username:mypass"))
req, err := http.NewRequest("GET", "https://api.ipify.org/", nil)
proxyUrl, _ := url.Parse("http://myproxy.com:9999")
fmt.Println(basic) // Basic dXNlcm5hbWU6bXlwYXNz
req.Header.Add("Proxy-Authorization", basic)
req.Header.Add("User-Agent", ua)
bb, _ := httputil.DumpRequest(req, false)
fmt.Println(string(bb))
/*
Get / HTTP/1.1
Host: api.ipify.org
Proxy-Authorization: Basic dXNlcm5hbWU6bXlwYXNz
User-Agent: Mozilla/5.0 (Windows NT 6.1
*/
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
Proxy: http.ProxyURL(proxyUrl),
},
}
resp, err := client.Do(req)
fmt.Println(err) // Proxy Authentication Required
fmt.Println(resp) // <nil>
}
值和其他所有值进行了三倍检查,但没有任何运气。
那么有人知道为什么会这样,或者至少我如何研究这个问题?
要添加的最后一件事是我可以在这种情况下使用公共HTTP代理(不需要任何身份验证),并且在auth进入此过程时似乎会出现问题(错误也表明)。
P.S。不幸的是,我无法共享代理IP,端口和用户名,因为它违反了他们的政策。
答案 0 :(得分:3)
package main
import (
"crypto/tls"
"fmt"
"net/url"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.ipify.org/", nil)
proxyUrl, _ := url.Parse("http://username:password@127.0.0.1:9999")
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
Proxy: http.ProxyURL(proxyUrl),
},
}
_, err = client.Do(req)
fmt.Println(err)
}