net/httpライブラリのhttp.ClientでHTTPレスポンスが3系だとデフォルトで自動リダイレクトする仕様になっている。リダイレクトしたくない場合は、CheckRedirect関数をオーバーライドしてhttp.ErrUseLastResponseを返せばOK。
client := &http.Client{}
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
return http.ErrUseLastResponse
}
req, _ := http.NewRequest("GET", s.url, nil)
req.Header.Set("User-Agent", s.useragent)
resp, _ := client.Do(req)
net/httpのコードを読んでみると確かにCheckRedirectで判定して、ErrUseLastResponseを返したらResponseを返却するようになっている。
func (c *Client) Do(req *Request) (*Response, error) {
...
err = c.checkRedirect(req, reqs)
// Sentinel error to let users select the
// previous response, without closing its
// body. See Issue 10069.
if err == ErrUseLastResponse {
return resp, nil
}
...
}
ちなみに、デフォルトのCheckRedirectでは10回リダイレクトしたらエラーを返すようになっている。
func defaultCheckRedirect(req *Request, via []*Request) error {
if len(via) >= 10 {
return errors.New("stopped after 10 redirects")
}
return nil
}