10

我正在为重定向脚本编写基准测试。

我希望我的程序查询重定向到 AppStore 的某些 URL。但我不想下载 AppStore 页面。我只想记录重定向 URL 或错误。

如何在没有第二次重定向查询的情况下告诉 Go 查询 URL?


更新

两个答案都是正确的,但是:

我尝试了两种解决方案。我正在做基准测试。我使用 10 - 500 个 go 例程运行 1 个或多个 go 进程。他们循环查询 URL。我的服务器也是用 go 写的。它每秒报告请求数。

  • 第一个解决方案:http.DefaultTransport.RoundTrip- 工作缓慢,给出错误。前 4 秒工作正常。进行 300-500 次查询然后性能下降到每秒 80 次查询。

然后下降到每秒 0-5 次查询,并且 queryies 脚本开始出现错误,例如

dial tcp IP:80: A connection attempt failed because the connected 
party did not properly respond after a period of time, or established 
connection failed because connected host has failed to respond.

我猜它重用已关闭的连接。

  • 第二种解决方案:CheckRedirect field以恒定的性能工作。我不确定它是重复使用连接还是为每个请求打开一个新连接。我client为循环中的每个请求创建。这就是它在现实生活中的行为方式(每个请求都是一个新连接)。有没有办法确保在每次查询后关闭连接并且不重复使用?

这就是为什么我要标记第二个解决方案来回答我的问题。但是对于我的研究来说,每个查询都是一个新的连接是非常重要的。我如何确保使用第二种解决方案?

4

2 回答 2

20

您需要使用 http.Transport 而不是 http.Client。传输是较低级别的,不遵循重定向。

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil)
// ...
resp, err := http.DefaultTransport.RoundTrip(req)
于 2013-01-20T00:46:52.680 回答
14

为了完整起见,您可以使用http.Client而不遵循重定向。http.Client有一个CheckRedirect字段,它是一个函数。在进行任何重定向之前调用它。

如果此函数返回错误,则httpClient.Do(...)不会遵循重定向(请参阅Go 源代码中的函数),而是会返回错误(其具体类型为,其字段将是重定向到 URL,也就是 Location 标头值,请参阅此代码)。doFollowingRedirects()url.ErrorURL

您可以查看我的gocrawl 库以获取此用法的具体示例。

于 2013-01-20T17:01:53.577 回答