如何通过代理本地测试gae golang urlfetch?

时间:2012-11-08 21:38:25

标签: google-app-engine proxy localhost go urlfetch

我的urlfetch客户端在部署到appspot时工作正常。但是通过代理的本地测试(dev_appserver.py)存在问题。我找不到任何方法来为urlfetch.Transport设置代理。

如何在本地测试代理后面的urlfetch?

4 个答案:

答案 0 :(得分:5)

  

http.DefaultTransport和http.DefaultClient在App Engine中不可用。见https://developers.google.com/appengine/docs/go/urlfetch/overview

在GAE dev_appserver.py上测试PayPal OAuth时出现此错误消息(在编译时在生产中工作)

const url string = "https://api.sandbox.paypal.com/v1/oauth2/token"
const username string = "EOJ2S-Z6OoN_le_KS1d75wsZ6y0SFdVsY9183IvxFyZp"
const password string = "EClusMEUk8e9ihI7ZdVLF5cZ6y0SFdVsY9183IvxFyZp"

client := &http.Client{}        

req, _ := http.NewRequest("POST", url, strings.NewReader("grant_type=client_credentials"))
req.SetBasicAuth(username, password)
req.Header.Set("Accept", "application/json")
req.Header.Set("Accept-Language", "en_US")
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

resp, err := client.Do(req)

如您所见,Go App Engine打破了http.DefaultTransport (GAE_SDK / goroot / src / pkg / appengine_internal / internal.go,第142行,GAE 1.7.5)

type failingTransport struct{}
func (failingTransport) RoundTrip(*http.Request) (*http.Response, error) {
    return nil, errors.New("http.DefaultTransport and http.DefaultClient are not available in App Engine. " +
        "See https://developers.google.com/appengine/docs/go/urlfetch/overview")
}

func init() {
    // http.DefaultTransport doesn't work in production so break it
    // explicitly so it fails the same way in both dev and prod
    // (and with a useful error message)
    http.DefaultTransport = failingTransport{}
}

使用Go App Engine 1.7.5解决了这个问题

    transport := http.Transport{}

    client := &http.Client{
        Transport: &transport,
    }       

    req, _ := http.NewRequest("POST", url, strings.NewReader("grant_type=client_credentials"))
    req.SetBasicAuth(username, password)
    req.Header.Set("Accept", "application/json")
    req.Header.Set("Accept-Language", "en_US")
    req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

答案 1 :(得分:0)

这只是猜测,但您尝试setting the proxy variables

  

在Unix或Windows环境中,设置http_proxy或ftp_proxy   环境变量到之前标识代理服务器的URL   启动Python解释器。例如('%'是命令   提示):

     

%http_proxy =“http://www.someproxy.com:3128”

     

%export http_proxy

答案 2 :(得分:0)

如果您使用的是默认代理,则传输将实现为

var DefaultTransport RoundTripper = &Transport{Proxy: ProxyFromEnvironment} 

启动go时设置环境变量应解决问题。

另见其他问题: How do I configure Go to use a proxy?

答案 3 :(得分:0)

urlfetch包本身不支持代理设置,即使在开发中也是如此,因为它实际上并没有自己进行URL提取:它向(可能是开发的)应用服务器发送请求并要求它进行提取。我没有dev_appserver.py的来源,但它应该遵循标准的代理变量:

export http_proxy='http://user:pass@1.2.3.4:3210/'

如果你在开始dev_appserver.py之前这样做,它可能会起作用。

如果上述方法不起作用,您应该file an issue,然后使用以下解决方法:

func client(ctx *appengine.Context) *http.Client {
    if appengine.IsDevAppServer() {
        return http.DefaultClient
    }
    return urlfetch.Client(ctx)
}

这将使用生产应用服务器上的urlfetch API,但使用标准的net/http客户端,does honor http_proxy环境变量。