httpclientでredirectの自動追従は次のオプションで出来る。
client = HTTPClient.new() |
※httpbinのredirectが404になるので、代わりのサイトで検証。
しかし、httpsからhttpへのredirectはBadResponseError
になります。
client = HTTPClient.new() |
ライブラリのコードはこんな感じでif https?(uri) && !https?(newuri)
このコードで弾かれています。
def default_redirect_uri_callback(uri, res)
newuri = urify(res.header['location'][0])
if !http?(newuri) && !https?(newuri)
warn("#{newuri}: a relative URI in location header which is not recommended")
warn("'The field value consists of a single absolute URI' in HTTP spec")
newuri = uri + newuri
end
if https?(uri) && !https?(newuri)
raise BadResponseError.new("redirecting to non-https resource")
end
puts "redirect to: #{newuri}" if $DEBUG
newuri
end
HTTPClient::BadResponseError (redirecting to non-https resource)
これはこれで正しいのですが、クローラーを書くときは無視したいことが多いです。そんな時は、clientのredirect_uri_callback
を自前のロジックに変更します。
client = HTTPClient.new() |