【发布时间】:2017-10-19 11:03:03
【问题描述】:
我正在尝试访问一个提供 JSON 响应的 URL,并且该 URL 仅在我连接到我公司的 VPN 时才可访问。
使用标准 Golang 库,即使我连接到公司的 VPN,以下代码也会出错:
myClient := &http.Client{}
req, err := http.NewRequest("POST", "https://mysite/getJSONResponse", nil)
req.Header.Add("myHeader", "myHeaderValue")
resp, err := myClient.Do(req)
这是我得到的错误:
502 Bad Gateway: Registered endpoint failed to handle the request.
但是,当我连接到公司的 VPN 时,此代码(也来自标准库)能够获得 JSON 响应:
envDialer := proxy.FromEnvironment()
myTransport := &http.Transport{Dial: envDialer.Dial}
myClient := &http.Client{Transport: myTransport}
req, err := http.NewRequest("POST", "https://mysite/getJSONResponse", nil)
req.Header.Add("myHeader", "myHeaderValue")
resp, err := myClient.Do(req)
我的问题是,当我将工作代码推送到 Cloud Foundry(也连接到我公司的 VPN)时,我的代码出现以下错误:
Post https://mysite/getJSONResponse: read tcp 10.254.2.182:45320->165.156.25.94:443:
read: connection reset by peer
即使代码已经推送到 Cloud Foundry,就好像代码无法连接到我公司的 VPN,这就是 URL 拒绝提供 JSON 响应的原因。
但是,当我尝试使用使用 Beego 框架的测试 Web 应用程序访问 Cloud Foundry 中的相同 URL 时,它能够很好地获得 JSON 响应。
我应该提一下,即使没有设置 http_proxy、https_proxy 和 no_proxy 环境变量,Beego 版本也可以工作:
req := httplib.Post("https://mysite/getJSONResponse")
req.Header("myHeader", "myHeaderValue")
str, err := req.String()
if err != nil {
fmt.Println(err)
}
beego.Info(str)
u.Data["json"] = str
u.ServeJSON()
我的问题是:
为什么第二个标准库代码在本地运行良好,但推送到 Cloud Foundry 时却不行?
Beego 框架在幕后做了什么,让它连接到我公司在 Cloud Foundry 的 VPN,标准库也能做到这一点吗?
我感觉 Beego 正在对其代理/端口设置做一些事情,以使其能够连接到我们公司的 VPN。
我真的不想为了连接到我们公司的 VPN 而将我们的后端代码与 Beego 框架集成。我一定错过了一些可以通过标准库完成的非常简单的事情。有什么想法吗?
【问题讨论】:
-
当你说
unable to get the JSON response时,你得到了什么回应? HTTP 错误代码/消息?还是来自 golang 拨号器的 TLS 错误?你的端点的域真的是https://getJSONResponse吗? -
当您使用 https 时,将对其证书进行验证。 Golang 默认使用特定于平台的信任库来查找 CA 证书。在本地它可能拥有正确的 CA 证书,但在 CF 容器中却没有,Beego 可能会跳过 SSL 验证?
-
它给了我一个 502 Bad Gateway 错误消息,就好像我正在访问我公司 VPN 之外的 URL。此外,
https://getJSONResponse只是一个占位符 URL,因为客户端保护等等。 (编辑:我还添加了我遇到的问题的错误消息。) -
我将占位符 URL 更改为
https://mysite/getJSONResponse以避免混淆。谢谢!
标签: go proxy vpn cloud-foundry beego