From: Facundo Batista Date: Thu, 7 Feb 2008 19:06:52 +0000 (+0000) Subject: Fixes Issue 1401. When redirected, a possible POST get converted X-Git-Tag: v2.6a1~240 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=86371d61b704958e68bed0f9937c6a1ff5fd766e;p=python Fixes Issue 1401. When redirected, a possible POST get converted to GET, so it loses its payload. So, it also must lose the headers related to the payload (if it has no content any more, it shouldn't indicate content length and type). --- diff --git a/Lib/test/test_urllib2.py b/Lib/test/test_urllib2.py index 90e1771733..a35cbfae84 100644 --- a/Lib/test/test_urllib2.py +++ b/Lib/test/test_urllib2.py @@ -822,6 +822,8 @@ class HandlerTests(unittest.TestCase): method = getattr(h, "http_error_%s" % code) req = Request(from_url, data) req.add_header("Nonsense", "viking=withhold") + if data is not None: + req.add_header("Content-Length", str(len(data))) req.add_unredirected_header("Spam", "spam") try: method(req, MockFile(), code, "Blah", @@ -834,6 +836,13 @@ class HandlerTests(unittest.TestCase): self.assertEqual(o.req.get_method(), "GET") except AttributeError: self.assert_(not o.req.has_data()) + + # now it's a GET, there should not be headers regarding content + # (possibly dragged from before being a POST) + headers = [x.lower() for x in o.req.headers] + self.assertTrue("content-length" not in headers) + self.assertTrue("content-type" not in headers) + self.assertEqual(o.req.headers["Nonsense"], "viking=withhold") self.assert_("Spam" not in o.req.headers) diff --git a/Lib/urllib2.py b/Lib/urllib2.py index 8bf08848b1..d5a539d9db 100644 --- a/Lib/urllib2.py +++ b/Lib/urllib2.py @@ -534,8 +534,11 @@ class HTTPRedirectHandler(BaseHandler): # do the same. # be conciliant with URIs containing a space newurl = newurl.replace(' ', '%20') + newheaders = dict((k,v) for k,v in req.headers.items() + if k.lower() not in ("content-length", "content-type") + ) return Request(newurl, - headers=req.headers, + headers=newheaders, origin_req_host=req.get_origin_req_host(), unverifiable=True) else: