概要
個人的に必要だったので書きました。
コード
# uri_strに示されたURLにおける、リダイレクト後のURLを返す
# 変換途中でエラーが発生した場合は""を返す
# limitはリダイレクト数の上限
def redirect_url(uri_str, limit = 10)
return_url = uri_str
redirect_count = 0
# リダイレクト後のURLを取得するためのwhileループ
while true
# リダイレクト数の上限を超えると例外を返す
if redirect_count >= limit
raise ArgumentError, 'HTTP redirect too deep'
end
# HTTPレスポンスを取得する
response = Net::HTTP.get_response(URI.parse(return_url))
# リダイレクトが発生した場合のみ、whileループを続行する
# 最後がNet::HTTPSuccessじゃない場合は""を返す
case response
when Net::HTTPSuccess
break
when Net::HTTPRedirection
return_url = response['location']
redirect_count += 1
else
return_url = ""
break
end
end
return return_url
end