[ruby/open-uri] Add :max_redirects option
https://github.com/ruby/open-uri/commit/7fd5ea09a7
This commit is contained in:
parent
7d32830b8c
commit
d97479f9c9
@ -108,6 +108,7 @@ module OpenURI
|
||||
:ftp_active_mode => false,
|
||||
:redirect => true,
|
||||
:encoding => nil,
|
||||
:max_redirects => nil,
|
||||
}
|
||||
|
||||
def OpenURI.check_options(options) # :nodoc:
|
||||
@ -211,6 +212,7 @@ module OpenURI
|
||||
end
|
||||
|
||||
uri_set = {}
|
||||
max_redirects = options[:max_redirects]
|
||||
buf = nil
|
||||
while true
|
||||
redirect = catch(:open_uri_redirect) {
|
||||
@ -238,6 +240,7 @@ module OpenURI
|
||||
uri = redirect
|
||||
raise "HTTP redirection loop: #{uri}" if uri_set.include? uri.to_s
|
||||
uri_set[uri.to_s] = true
|
||||
raise "Too many redirects" if max_redirects && uri_set.size > max_redirects
|
||||
else
|
||||
break
|
||||
end
|
||||
|
@ -558,6 +558,25 @@ class TestOpenURI < Test::Unit::TestCase
|
||||
}
|
||||
end
|
||||
|
||||
def test_max_redirects_success
|
||||
with_http {|srv, dr, url|
|
||||
srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
|
||||
srv.mount_proc("/r2/") {|req, res| res.status = 301; res["location"] = "#{url}/r3"; res.body = "r2" }
|
||||
srv.mount_proc("/r3/") {|req, res| res.body = "r3" }
|
||||
URI.open("#{url}/r1/", max_redirects: 2) { |f| assert_equal("r3", f.read) }
|
||||
}
|
||||
end
|
||||
|
||||
def test_max_redirects_too_many
|
||||
with_http {|srv, dr, url|
|
||||
srv.mount_proc("/r1/") {|req, res| res.status = 301; res["location"] = "#{url}/r2"; res.body = "r1" }
|
||||
srv.mount_proc("/r2/") {|req, res| res.status = 301; res["location"] = "#{url}/r3"; res.body = "r2" }
|
||||
srv.mount_proc("/r3/") {|req, res| res.body = "r3" }
|
||||
exc = assert_raise(RuntimeError) { URI.open("#{url}/r1/", max_redirects: 1) {} }
|
||||
assert_equal("Too many redirects", exc.message)
|
||||
}
|
||||
end
|
||||
|
||||
def test_userinfo
|
||||
assert_raise(ArgumentError) { URI.open("http://user:pass@127.0.0.1/") {} }
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user