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
+
+