Index: Lib/urllib2.py =================================================================== --- Lib/urllib2.py (revision 65715) +++ Lib/urllib2.py (working copy) @@ -560,8 +560,13 @@ newurl = headers.getheaders('uri')[0] else: return - newurl = urlparse.urljoin(req.get_full_url(), newurl) + + # parsing and unparsing the url to correct malformed urls + # then urljoin with req.get_full_url() + newurl = urlparse.urljoin(req.get_full_url(), + urlparse.urlunparse(urlparse.urlparse(newurl))) + # XXX Probably want to forget about the state of the current # request, although that might interact poorly with other # handlers that also use handler-specific request attributes Index: Lib/urlparse.py =================================================================== --- Lib/urlparse.py (revision 65715) +++ Lib/urlparse.py (working copy) @@ -5,7 +5,7 @@ """ __all__ = ["urlparse", "urlunparse", "urljoin", "urldefrag", - "urlsplit", "urlunsplit"] + "urlsplit", "urlunsplit", "parse_qs", "parse_qsl"] # A classification of schemes ('' means apply by default) uses_relative = ['ftp', 'http', 'gopher', 'nntp', 'imap', @@ -155,6 +155,8 @@ url, fragment = url.split('#', 1) if '?' in url: url, query = url.split('?', 1) + if not url: url = '/' + v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return v @@ -169,6 +171,8 @@ url, fragment = url.split('#', 1) if scheme in uses_query and '?' in url: url, query = url.split('?', 1) + if not url: url = '/' + v = SplitResult(scheme, netloc, url, query, fragment) _parse_cache[key] = v return v