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

参考にしたもの

このエントリーをはてなブックマークに追加
<< Hugoに移行しました。
ISUCON5の予選に参加した話 >>
@yudppp
Web engineer.