はじめに
302がちゃんとかえっているか確認したい。みたいな要件があり、なにも考えず
resp, err := http.Get(url)
のようにするとRedirectしたあとの結果を勝手にとってきてくれていた。
net/http/client.goをみてみるとdoFollowingRedirectsでリダイレクトを考慮して色々やっているようだった。
対応方法
下記のようにCheckRedirect
を実装し、ハンドリングしてあげればよい。
package main
import (
"errors"
"net/http"
"net/url"
)
var RedirectAttemptedError = errors.New("redirect")
func Check(urlApiEndPoint string) error {
client := &http.Client{}
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
return RedirectAttemptedError
}
_, err := client.Get(urlApiEndPoint)
if urlError, ok := err.(*url.Error); ok && urlError.Err == RedirectAttemptedError {
return nil
}
return errors.New("don't redirect")
}