Don't reuse PreparedRequest on redirects
authorRoman Haritonov <reclosedev@gmail.com>
Fri, 19 Apr 2013 06:13:36 +0000 (10:13 +0400)
committerRoman Haritonov <reclosedev@gmail.com>
Sat, 8 Jun 2013 10:41:34 +0000 (14:41 +0400)
requests/sessions.py
test_requests.py

index 634637f43e9a13e4f46a82ff9a0dcbd2b8da1bd1..6d1000dc524a8df714b7ac2089218654b143aaf1 100644 (file)
@@ -71,15 +71,13 @@ class SessionRedirectMixin(object):
         """Receives a Response. Returns a generator of Responses."""
 
         i = 0
-        prepared_request = PreparedRequest()
-        prepared_request.body = req.body
-        prepared_request.headers = req.headers.copy()
-        prepared_request.hooks = req.hooks
-        prepared_request.method = req.method
-        prepared_request.url = req.url
 
         # ((resp.status_code is codes.see_other))
         while (('location' in resp.headers and resp.status_code in REDIRECT_STATI)):
+            prepared_request = PreparedRequest()
+            prepared_request.body = req.body
+            prepared_request.headers = req.headers.copy()
+            prepared_request.hooks = req.hooks
 
             resp.content  # Consume socket so it can be released
 
@@ -90,7 +88,7 @@ class SessionRedirectMixin(object):
             resp.close()
 
             url = resp.headers['location']
-            method = prepared_request.method
+            method = req.method
 
             # Handle redirection without scheme (see: RFC 1808 Section 4)
             if url.startswith('//'):
@@ -114,12 +112,12 @@ class SessionRedirectMixin(object):
 
             # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
             if (resp.status_code == codes.see_other and
-                    prepared_request.method != 'HEAD'):
+                    method != 'HEAD'):
                 method = 'GET'
 
             # Do what the browsers do, despite standards...
             if (resp.status_code in (codes.moved, codes.found) and
-                    prepared_request.method not in ('GET', 'HEAD')):
+                    method not in ('GET', 'HEAD')):
                 method = 'GET'
 
             prepared_request.method = method
index fed70d8d7de7e1bba514560c48daad75b8023685..7ad10ee9b010e1a3cef0decddcb07b5d240ebd11 100755 (executable)
@@ -169,7 +169,6 @@ class RequestsTestCase(unittest.TestCase):
             }
         )
         assert 'foo' not in s.cookies
-<<<<<<< HEAD
 
     def test_request_cookie_overrides_session_cookie(self):
         s = requests.session()