net/httpでRedirectさせない

2015-10-26

はじめに

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")
}

参考にしたもの

<< RESTfulなAPIがつらくなってきた話
golangで数字を三桁ごとでカンマ区切りにする >>
@yudppp
Web engineer.