changeset: 101368:52a7f580580c branch: 3.5 parent: 101365:37d03507e9e9 user: Martin Panter date: Mon May 16 01:07:13 2016 +0000 files: Lib/test/test_urllib.py Lib/test/test_urllib2.py Lib/urllib/request.py Misc/NEWS description: Issue #14132: Fix redirect handling when target is just a query string diff -r 37d03507e9e9 -r 52a7f580580c Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py Mon May 16 10:11:47 2016 +0300 +++ b/Lib/test/test_urllib.py Mon May 16 01:07:13 2016 +0000 @@ -1,4 +1,4 @@ -"""Regresssion tests for urllib""" +"""Regresssion tests for what was in Python 2's "urllib" module""" import urllib.parse import urllib.request @@ -86,10 +86,11 @@ # buffer to store data for verification in urlopen tests. buf = None - fakesock = FakeSocket(fakedata) def connect(self): - self.sock = self.fakesock + self.sock = FakeSocket(self.fakedata) + type(self).fakesock = self.sock + FakeHTTPConnection.fakedata = fakedata return FakeHTTPConnection diff -r 37d03507e9e9 -r 52a7f580580c Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py Mon May 16 10:11:47 2016 +0300 +++ b/Lib/test/test_urllib2.py Mon May 16 01:07:13 2016 +0000 @@ -462,7 +462,7 @@ self.requests = [] def http_open(self, req): - import email, http.client, copy + import email, copy self.requests.append(copy.deepcopy(req)) if self._count == 0: self._count = self._count + 1 @@ -1208,6 +1208,22 @@ fp = o.open('http://www.example.com') self.assertEqual(fp.geturl(), redirected_url.strip()) + def test_redirect_no_path(self): + # Issue 14132: Relative redirect strips original path + real_class = http.client.HTTPConnection + response1 = b"HTTP/1.1 302 Found\r\nLocation: ?query\r\n\r\n" + http.client.HTTPConnection = test_urllib.fakehttp(response1) + self.addCleanup(setattr, http.client, "HTTPConnection", real_class) + urls = iter(("/path", "/path?query")) + def request(conn, method, url, *pos, **kw): + self.assertEqual(url, next(urls)) + real_class.request(conn, method, url, *pos, **kw) + # Change response for subsequent connection + conn.__class__.fakedata = b"HTTP/1.1 200 OK\r\n\r\nHello!" + http.client.HTTPConnection.request = request + fp = urllib.request.urlopen("http://python.org/path") + self.assertEqual(fp.geturl(), "http://python.org/path?query") + def test_proxy(self): o = OpenerDirector() ph = urllib.request.ProxyHandler(dict(http="proxy.example.com:3128")) diff -r 37d03507e9e9 -r 52a7f580580c Lib/urllib/request.py --- a/Lib/urllib/request.py Mon May 16 10:11:47 2016 +0300 +++ b/Lib/urllib/request.py Mon May 16 01:07:13 2016 +0000 @@ -652,7 +652,7 @@ "%s - Redirection to url '%s' is not allowed" % (msg, newurl), headers, fp) - if not urlparts.path: + if not urlparts.path and urlparts.netloc: urlparts = list(urlparts) urlparts[2] = "/" newurl = urlunparse(urlparts) diff -r 37d03507e9e9 -r 52a7f580580c Misc/NEWS --- a/Misc/NEWS Mon May 16 10:11:47 2016 +0300 +++ b/Misc/NEWS Mon May 16 01:07:13 2016 +0000 @@ -118,6 +118,9 @@ Library ------- +- Issue #14132: Fix urllib.request redirect handling when the target only has + a query string. Original fix by Ján Janech. + - Issue #26892: Honor debuglevel flag in urllib.request.HTTPHandler. Patch contributed by Chi Hsuan Yen.