aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_dispatch
diff options
context:
space:
mode:
authorEdouard CHIN <edouard.chin@shopify.com>2018-10-12 02:06:13 -0400
committerEdouard CHIN <edouard.chin@shopify.com>2019-07-25 18:57:07 +0200
commit1969f40a3a0aa7393b4815b7f7227c79f28b343a (patch)
tree6e4ac72d4bc4c9e185c66aa3d229be2c36462231 /actionpack/lib/action_dispatch
parent1d83ab936672790ea3abd407df8c16d696aaef70 (diff)
downloadrails-1969f40a3a0aa7393b4815b7f7227c79f28b343a.tar.gz
rails-1969f40a3a0aa7393b4815b7f7227c79f28b343a.tar.bz2
rails-1969f40a3a0aa7393b4815b7f7227c79f28b343a.zip
fix `follow_redirect!` not using the same HTTP verb on 307 redirection:
- According to the HTTP 1.1 spec, the 307 redirection guarantees that the method and the body will not be changed during redirection. This PR fixes that since follow_redirect! would always follow the redirection my making a GET request. Ref https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/307
Diffstat (limited to 'actionpack/lib/action_dispatch')
-rw-r--r--actionpack/lib/action_dispatch/testing/integration.rb11
1 files changed, 8 insertions, 3 deletions
diff --git a/actionpack/lib/action_dispatch/testing/integration.rb b/actionpack/lib/action_dispatch/testing/integration.rb
index c5f8b816a4..9e7b4301a8 100644
--- a/actionpack/lib/action_dispatch/testing/integration.rb
+++ b/actionpack/lib/action_dispatch/testing/integration.rb
@@ -49,11 +49,16 @@ module ActionDispatch
# Follow a single redirect response. If the last response was not a
# redirect, an exception will be raised. Otherwise, the redirect is
- # performed on the location header. Any arguments are passed to the
- # underlying call to `get`.
+ # performed on the location header. If the redirection is a 307 redirect,
+ # the same HTTP verb will be used when redirecting, otherwise a GET request
+ # will be performed. Any arguments are passed to the
+ # underlying request.
def follow_redirect!(**args)
raise "not a redirect! #{status} #{status_message}" unless redirect?
- get(response.location, **args)
+
+ method = response.status == 307 ? request.method.downcase : :get
+ public_send(method, response.location, **args)
+
status
end
end