From 3a300955f5c4aff94f2cb933a12b37c018a1d23f Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Thu, 7 Jun 2018 10:05:42 -0700 Subject: [PATCH] Ensure rack_test driver processes 307/308 redirects correctly --- lib/capybara/rack_test/browser.rb | 8 +++++++- lib/capybara/spec/session/click_button_spec.rb | 5 +++++ lib/capybara/spec/test_app.rb | 8 ++++++++ lib/capybara/spec/views/form.erb | 7 +++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/lib/capybara/rack_test/browser.rb b/lib/capybara/rack_test/browser.rb index f2c3ad68..d5a71fd0 100644 --- a/lib/capybara/rack_test/browser.rb +++ b/lib/capybara/rack_test/browser.rb @@ -44,7 +44,13 @@ class Capybara::RackTest::Browser return unless driver.follow_redirects? driver.redirect_limit.times do - process(:get, last_response["Location"], {}, env) if last_response.redirect? + if last_response.redirect? + if [307, 308].include? last_response.status + process(last_request.request_method, last_response["Location"], last_request.params, env) + else + process(:get, last_response["Location"], {}, env) + end + end end raise Capybara::InfiniteRedirectError, "redirected more than #{driver.redirect_limit} times, check for infinite redirects." if last_response.redirect? end diff --git a/lib/capybara/spec/session/click_button_spec.rb b/lib/capybara/spec/session/click_button_spec.rb index 8a05306f..57d6da9b 100644 --- a/lib/capybara/spec/session/click_button_spec.rb +++ b/lib/capybara/spec/session/click_button_spec.rb @@ -396,6 +396,11 @@ Capybara::SpecHelper.spec '#click_button' do expect(@session.current_url).to match(%r{/landed$}) end + it "should follow redirects that maintain method" do + @session.click_button('Go 307') + expect(@session).to have_content('You post landed: 307') + end + it "should post pack to the same URL when no action given" do @session.visit('/postback') @session.click_button('With no action') diff --git a/lib/capybara/spec/test_app.rb b/lib/capybara/spec/test_app.rb index 60202909..e1cacae0 100644 --- a/lib/capybara/spec/test_app.rb +++ b/lib/capybara/spec/test_app.rb @@ -38,6 +38,10 @@ class TestApp < Sinatra::Base redirect '/landed' end + post '/redirect_307' do + redirect '/landed', 307 + end + get '/referer_base' do 'direct link' \ 'link via redirect' \ @@ -69,6 +73,10 @@ class TestApp < Sinatra::Base "You landed" end + post '/landed' do + "You post landed: #{params.dig(:form, 'data')}" + end + get '/with-quotes' do %q("No," he said, "you can't do that.") end diff --git a/lib/capybara/spec/views/form.erb b/lib/capybara/spec/views/form.erb index 4367a682..68a4b55a 100644 --- a/lib/capybara/spec/views/form.erb +++ b/lib/capybara/spec/views/form.erb @@ -554,6 +554,13 @@ New line after and before textarea tag

+
+ +

+ +

+
+