diff -r 1a5aab273332 Lib/test/test_urllib.py --- a/Lib/test/test_urllib.py Tue Mar 29 01:21:48 2011 +0100 +++ b/Lib/test/test_urllib.py Tue Mar 29 12:07:42 2011 -0700 @@ -148,6 +148,16 @@ finally: self.unfakehttp() + def test_url_fragment(self): + # Issue #11703: geturl() omits fragments in the original URL. + url = 'http://docs.python.org/library/urllib.html#OK' + self.fakehttp('Hello!') + try: + fp = urllib.urlopen(url) + self.assertEqual(fp.geturl(), url) + finally: + self.unfakehttp() + def test_read_bogus(self): # urlopen() should raise IOError for many error codes. self.fakehttp('''HTTP/1.1 401 Authentication Required diff -r 1a5aab273332 Lib/test/test_urllib2.py --- a/Lib/test/test_urllib2.py Tue Mar 29 01:21:48 2011 +0100 +++ b/Lib/test/test_urllib2.py Tue Mar 29 12:07:42 2011 -0700 @@ -1270,12 +1270,16 @@ req = Request("") self.assertEqual("www.python.org", req.get_host()) - def test_urlwith_fragment(self): + def test_url_fragment(self): req = Request("http://www.python.org/?qs=query#fragment=true") self.assertEqual("/?qs=query", req.get_selector()) req = Request("http://www.python.org/#fun=true") self.assertEqual("/", req.get_selector()) + # Issue 11703: geturl() omits fragment in the original URL. + url = 'http://docs.python.org/library/urllib2.html#OK' + req = Request(url) + self.assertEqual(req.get_full_url(), url) def test_main(verbose=None): from test import test_urllib2 diff -r 1a5aab273332 Lib/urllib2.py --- a/Lib/urllib2.py Tue Mar 29 01:21:48 2011 +0100 +++ b/Lib/urllib2.py Tue Mar 29 12:07:42 2011 -0700 @@ -190,7 +190,7 @@ origin_req_host=None, unverifiable=False): # unwrap('') --> 'type://host/path' self.__original = unwrap(url) - self.__original, fragment = splittag(self.__original) + self.__original, self.__fragment = splittag(self.__original) self.type = None # self.__r_type is what's left after doing the splittype self.host = None @@ -236,7 +236,10 @@ return self.data def get_full_url(self): - return self.__original + if self.__fragment: + return '%s#%s' % (self.__original, self.__fragment) + else: + return self.__original def get_type(self): if self.type is None: