fix POST redirects
authorDavid Bonner <dbonner@gmail.com>
Sun, 23 Dec 2012 05:51:26 +0000 (00:51 -0500)
committerDavid Bonner <dbonner@gmail.com>
Sun, 23 Dec 2012 05:51:26 +0000 (00:51 -0500)
the redirect handling logic compares then method to upper-case strings,
so make sure the method gets upper-cased as well.

add a test to POST to /status/302 on httpbin, which fails against httpbin.org
right now.  i'm submitting a pull request over there to fix that right after
this one.  once that's accepted, the new test verifies that the fix works.

AUTHORS.rst
requests/sessions.py
test_requests.py

index bf79ef4..acc78e8 100644 (file)
@@ -117,3 +117,4 @@ Patches and Suggestions
 - Stephen Zhuang (everbird)
 - Martijn Pieters
 - Jonatan Heyman
+- David Bonner <dbonner@gmail.com> @rascalking
index 982e96f..5947038 100644 (file)
@@ -94,16 +94,13 @@ class SessionRedirectMixin(object):
                 url = urljoin(resp.url, requote_uri(url))
 
             # http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.4
-            if resp.status_code is codes.see_other:
+            if resp.status_code is codes.see_other and req.method != 'HEAD':
                 method = 'GET'
 
             # Do what the browsers do, despite standards...
             if resp.status_code in (codes.moved, codes.found) and req.method == 'POST':
                 method = 'GET'
 
-            if (resp.status_code == 303) and req.method != 'HEAD':
-                method = 'GET'
-
             # Remove the cookie headers that were sent.
             headers = req.headers
             try:
@@ -245,7 +242,7 @@ class Session(SessionRedirectMixin):
 
         # Create the Request.
         req = Request()
-        req.method = method
+        req.method = method.upper()
         req.url = url
         req.headers = headers
         req.files = files
index e55a4cf..84d4e8b 100644 (file)
@@ -86,6 +86,10 @@ class RequestsTestCase(unittest.TestCase):
         r = requests.get(httpbin('redirect', '1'))
         self.assertEqual(r.status_code, 200)
 
+    def test_HTTP_302_ALLOW_REDIRECT_POST(self):
+        r = requests.post(httpbin('status', '302'), data={'some': 'data'})
+        self.assertEqual(r.status_code, 200)
+
     def test_HTTP_200_OK_GET_WITH_PARAMS(self):
         heads = {'User-agent': 'Mozilla/5.0'}