Handle 301s 'properly'.
authorCory Benfield <lukasaoz@gmail.com>
Sun, 24 Nov 2013 11:09:00 +0000 (11:09 +0000)
committerCory Benfield <lukasaoz@gmail.com>
Sun, 24 Nov 2013 11:09:00 +0000 (11:09 +0000)
requests/sessions.py

index 8aff591..c0a0e85 100644 (file)
@@ -112,10 +112,16 @@ class SessionRedirectMixin(object):
                 method = 'GET'
 
             # Do what the browsers do, despite standards...
-            if (resp.status_code in (codes.moved, codes.found) and
+            # First, turn 302s into GETs.
+            if (resp.status_code == codes.found and
                     method not in ('GET', 'HEAD')):
                 method = 'GET'
 
+            # Second, if a POST is responded to with a 301, turn it into a GET.
+            # This bizarre behaviour is explained in Issue 1704.
+            if (resp.status_code == codes.moved) and (method == 'POST'):
+                method = 'GET'
+
             prepared_request.method = method
 
             # https://github.com/kennethreitz/requests/issues/1084