From 5b72525a96f3df229fd876671884e81be99e82fd Mon Sep 17 00:00:00 2001 From: Myron Marston Date: Tue, 29 Jun 2010 14:11:24 -0700 Subject: [PATCH] Detect infinite redirection (i.e. more than 5 redirects). This originally worked with a timeout. Jonas fixed it so that it follows 5 redirects, but the infinite redirect error was not raised. --- lib/capybara/driver/rack_test_driver.rb | 6 ++++-- lib/capybara/spec/driver.rb | 15 ++++++++++++++- lib/capybara/spec/test_app.rb | 9 +++++++++ spec/driver/rack_test_driver_spec.rb | 1 + 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/capybara/driver/rack_test_driver.rb b/lib/capybara/driver/rack_test_driver.rb index 728acdad..ca03b90c 100644 --- a/lib/capybara/driver/rack_test_driver.rb +++ b/lib/capybara/driver/rack_test_driver.rb @@ -256,8 +256,10 @@ private 5.times do follow_redirect! if response.redirect? end - rescue Capybara::TimeoutError - raise Capybara::InfiniteRedirectError, "infinite redirect detected!" + + if response.redirect? + raise Capybara::InfiniteRedirectError, "infinite redirect detected!" + end end def env diff --git a/lib/capybara/spec/driver.rb b/lib/capybara/spec/driver.rb index 1f80a6b5..0a01bd5a 100644 --- a/lib/capybara/spec/driver.rb +++ b/lib/capybara/spec/driver.rb @@ -193,4 +193,17 @@ shared_examples_for "driver with cookies support" do @driver.body.should_not include('test_cookie') end end -end \ No newline at end of file +end + +shared_examples_for "driver with infinite redirect detection" do + it "should follow 5 redirects" do + @driver.visit('/redirect/5/times') + @driver.body.should include('redirection complete') + end + + it "should not follow more than 5 redirects" do + running do + @driver.visit('/redirect/6/times') + end.should raise_error(Capybara::InfiniteRedirectError) + end +end diff --git a/lib/capybara/spec/test_app.rb b/lib/capybara/spec/test_app.rb index 609743fd..2a659390 100644 --- a/lib/capybara/spec/test_app.rb +++ b/lib/capybara/spec/test_app.rb @@ -22,6 +22,15 @@ class TestApp < Sinatra::Base redirect '/landed' end + get '/redirect/:times/times' do + times = params[:times].to_i + if times.zero? + "redirection complete" + else + redirect "/redirect/#{times - 1}/times" + end + end + get '/landed' do "You landed" end diff --git a/spec/driver/rack_test_driver_spec.rb b/spec/driver/rack_test_driver_spec.rb index 81cdff42..8af8fa65 100644 --- a/spec/driver/rack_test_driver_spec.rb +++ b/spec/driver/rack_test_driver_spec.rb @@ -15,4 +15,5 @@ describe Capybara::Driver::RackTest do it_should_behave_like "driver with header support" it_should_behave_like "driver with status code support" it_should_behave_like "driver with cookies support" + it_should_behave_like "driver with infinite redirect detection" end