diff -r 1ebefb6ae9a9 Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py Tue Mar 26 17:48:28 2013 +0100 +++ b/Lib/test/test_urllib2.py Tue Mar 26 15:00:15 2013 -0700 @@ -932,6 +932,39 @@ p_ds_req = h.do_request_(ds_req) self.assertEqual(p_ds_req.unredirected_hdrs["Host"],"example.com") + def test_full_url_setter(self): + # Checks to ensure that components are set correctly after setting the + # full_url of a Request object + + def assertEqual(parsed, req, orig): + self.assertEqual(parsed.scheme, req.type) + self.assertEqual(req.full_url, orig) + self.assertEqual(req.get_full_url(), orig) + self.assertEqual(parsed.netloc, req.origin_req_host) + self.assertEqual(parsed.fragment, req.fragment or '') + self.assertEqual(parsed.query, req.selector.replace('/?', '')) + + urls = [ + 'http://example.com?foo=bar#baz', + 'http://example.com?foo=bar&spam=eggs#bash', + 'http://example.com', + ] + + r = Request(urls[0]) + assertEqual(urllib.parse.urlparse(urls[0]), r, urls[0]) + + for url in urls[1:]: + parts = urllib.parse.urlparse(url) + r.full_url = url + assertEqual(parts, r, url) + + def test_full_url_deleter(self): + r = Request('http://www.example.com') + del r.full_url + self.assertIsNone(r.full_url) + self.assertIsNone(r.fragment) + self.assertEqual(r.selector, '') + def test_fixpath_in_weirdurls(self): # Issue4493: urllib2 to supply '/' when to urls where path does not # start with'/' diff -r 1ebefb6ae9a9 Lib/urllib/request.py --- a/Lib/urllib/request.py Tue Mar 26 17:48:28 2013 +0100 +++ b/Lib/urllib/request.py Tue Mar 26 15:00:15 2013 -0700 @@ -263,9 +263,7 @@ def __init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None): - # unwrap('') --> 'type://host/path' - self.full_url = unwrap(url) - self.full_url, self.fragment = splittag(self.full_url) + self.full_url = url self.headers = {} self.unredirected_hdrs = {} self._data = None @@ -278,8 +276,27 @@ self.origin_req_host = origin_req_host self.unverifiable = unverifiable self.method = method + + @property + def full_url(self): + if self.fragment: + return '%s#%s' % (self._full_url, self.fragment) + else: + return self._full_url + + @full_url.setter + def full_url(self, url): + # unwrap('') --> 'type://host/path' + self._full_url = unwrap(url) + self._full_url, self.fragment = splittag(self._full_url) self._parse() + @full_url.deleter + def full_url(self): + self._full_url = None + self.fragment = None + self.selector = '' + @property def data(self): return self._data @@ -299,7 +316,7 @@ self.data = None def _parse(self): - self.type, rest = splittype(self.full_url) + self.type, rest = splittype(self._full_url) if self.type is None: raise ValueError("unknown url type: %s" % self.full_url) self.host, self.selector = splithost(rest) @@ -316,10 +333,7 @@ return "GET" def get_full_url(self): - if self.fragment: - return '%s#%s' % (self.full_url, self.fragment) - else: - return self.full_url + return self.full_url def set_proxy(self, host, type): if self.type == 'https' and not self._tunnel_host: diff -r 1ebefb6ae9a9 Misc/ACKS --- a/Misc/ACKS Tue Mar 26 17:48:28 2013 +0100 +++ b/Misc/ACKS Tue Mar 26 15:00:15 2013 -0700 @@ -153,6 +153,7 @@ Sven Brauch Erik Bray Brian Brazil +Demian Brecht Dave Brennan Tom Bridgman Anthony Briggs