Cloud Foundry中的Golang Dialer

时间:2017-05-19 10:41:11

标签: go proxy vpn cloudfoundry beego

我正在尝试访问一个给我一个JSON响应的URL,并且只有当我连接到我公司的VPN时才能访问该URL。

使用标准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()

我的问题是:

  1. 为什么第二个标准库代码在本地运行正常,但在推送到Cloud Foundry时却没有?

  2. Beego框架在幕后做什么,让它可以通过Cloud Foundry连接到我公司的VPN,也可以使用标准库完成同样的工作?

  3. 我有一种感觉,Beego正在对其代理/端口设置做一些事情,使其能够连接到我们公司的VPN。

    我真的不想将我们的后端代码与Beego框架集成,只是为了连接到我们公司的VPN。我必须遗漏一些非常简单的东西,可以通过标准库完成。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我终于设法仅使用beego/httplib包来使其工作,因此无需整合整个Beego框架(谢天谢地)。这是我的代码:

import (
    "github.com/astaxie/beego/httplib"
)

-----------------------------------------------------

req := httplib.Post("https://mysite/getJSONResponse")
req.Header("myHeader", "myHeaderValue")

str, err := req.String()

if err == nil {
    strBytes := []byte(str)
    // Do something with the JSON response.
}

我没有时间调查使httplib包工作的原因,尽管我已经看到它只使用标准库来拨打相应的连接以进行请求。有人可以帮忙解释一下吗?

编辑:我看到它使用crypto/tls包的*tls.Config来设置与相应证书的连接。这可能是它如何使请求连接到我们的VPN。