[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,
|
:ftp_active_mode => false,
|
||||||
:redirect => true,
|
:redirect => true,
|
||||||
:encoding => nil,
|
:encoding => nil,
|
||||||
|
:max_redirects => nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
def OpenURI.check_options(options) # :nodoc:
|
def OpenURI.check_options(options) # :nodoc:
|
||||||
@ -211,6 +212,7 @@ module OpenURI
|
|||||||
end
|
end
|
||||||
|
|
||||||
uri_set = {}
|
uri_set = {}
|
||||||
|
max_redirects = options[:max_redirects]
|
||||||
buf = nil
|
buf = nil
|
||||||
while true
|
while true
|
||||||
redirect = catch(:open_uri_redirect) {
|
redirect = catch(:open_uri_redirect) {
|
||||||
@ -238,6 +240,7 @@ module OpenURI
|
|||||||
uri = redirect
|
uri = redirect
|
||||||
raise "HTTP redirection loop: #{uri}" if uri_set.include? uri.to_s
|
raise "HTTP redirection loop: #{uri}" if uri_set.include? uri.to_s
|
||||||
uri_set[uri.to_s] = true
|
uri_set[uri.to_s] = true
|
||||||
|
raise "Too many redirects" if max_redirects && uri_set.size > max_redirects
|
||||||
else
|
else
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
@ -558,6 +558,25 @@ class TestOpenURI < Test::Unit::TestCase
|
|||||||
}
|
}
|
||||||
end
|
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
|
def test_userinfo
|
||||||
assert_raise(ArgumentError) { URI.open("http://user:pass@127.0.0.1/") {} }
|
assert_raise(ArgumentError) { URI.open("http://user:pass@127.0.0.1/") {} }
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user