2013-01-19 15 views
10

我正在爲重定向腳本編寫基準測試。查詢URL無重定向Go

我想我的程序查詢重定向到AppStore的某個URL。但我不想下載AppStore頁面。我只是想記錄重定向URL或錯誤。

如何告知轉到查詢網址而無需第二次重定向查詢?


UPDATE

這兩個答案都是正確的,但:

我嘗試這兩種解決方案。我正在做基準測試。 我使用10-500個例程運行1個或多個go進程。他們在一個循環中查詢URL。 我的服務器也寫在去。它每秒報告一些請求。

  • 第一個解決方案: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。它是如何在現實生活中表現出來的(每一個請求都是一個新的連接)。有沒有辦法確保連接在每個查詢後關閉並不被重新使用?

這就是爲什麼我要標記第二個解決方案,以便回答我的問題。但對於我的研究來說,每個查詢都是一個新連接是非常重要的。我如何確保使用第二種解決方案?

回答

14

爲了完整起見,你可以使用http.Client,而不是跟隨重定向。 http.Client有一個CheckRedirect field這是一個功能。它在跟隨任何重定向之前被調用。

如果這個函數返回一個錯誤,那麼httpClient.Do(...)跟隨重定向(見doFollowingRedirects() function in Go's source code),而是會返回一個錯誤(其具體類型爲url.Error,其URL場將重定向到URL,又名位置標題值,see this code)。

你可以看到我的gocrawl library這個用法的具體例子。

+0

謝謝。在每次請求後是否確保連接已關閉?我希望模擬來自社交網絡的巨大流量,必須在1-5分鐘內根據Agent頭部重新定向。所以每個用戶只查詢一次,並且必須重定向。 (這是連接必須關閉) – Max

+0

我不確定我會爲負載測試/基準測試工具創建自定義客戶端。我會建議使用Apache Bench(ab,http://httpd.apache.org/docs/2.2/programs/ab.html)。 – mna

+0

我知道ab。但我希望更好地瞭解Go網絡。這樣一個微不足道的案例當然有很多問題。謝謝 – Max

19

您需要使用http.Transport而不是http.Client。運輸是較低級別的,不遵循重定向。

req, err := http.NewRequest("GET", "http://example.com/redirectToAppStore", nil) 
// ... 
resp, err := http.DefaultTransport.RoundTrip(req)