2017-04-25

golangのnet/httpで自動リダイレクトしない方法

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
}
このエントリーをはてなブックマークに追加