_urlopen: fix python2 http password breakage
authorZac Medico <zmedico@gentoo.org>
Thu, 2 Aug 2012 02:28:01 +0000 (19:28 -0700)
committerZac Medico <zmedico@gentoo.org>
Thu, 2 Aug 2012 02:28:01 +0000 (19:28 -0700)
This broke in commit e06cb6d66db37ac7ab77acf65038b1f770c13c96 since
CompressedResponseProcessor did not include password auth support.

BUG: The if_modified_since parameter appears to be ignored when using
http password authentication.

pym/portage/util/_urlopen.py

index bcd8f7c89e9652a657b222e7cfd9bf2257b9ecaa..768ccb8a482f0712d39f6024f172761677e241be 100644 (file)
@@ -27,14 +27,20 @@ TIMESTAMP_TOLERANCE=5
 
 def urlopen(url, if_modified_since=None):
        parse_result = urllib_parse.urlparse(url)
-       try:
-               if parse_result.scheme not in ("http", "https"):
-                       return _urlopen(url)
+       if parse_result.scheme not in ("http", "https"):
+               return _urlopen(url)
+       else:
+               netloc = urllib_parse_splituser(parse_result.netloc)[1]
+               url = urllib_parse.urlunparse((parse_result.scheme, netloc, parse_result.path, parse_result.params, parse_result.query, parse_result.fragment))
+               password_manager = urllib_request.HTTPPasswordMgrWithDefaultRealm()
                request = urllib_request.Request(url)
                request.add_header('User-Agent', 'Gentoo Portage')
                if if_modified_since:
                        request.add_header('If-Modified-Since', _timestamp_to_http(if_modified_since))
-               opener = urllib_request.build_opener(CompressedResponseProcessor)
+               if parse_result.username is not None:
+                       password_manager.add_password(None, url, parse_result.username, parse_result.password)
+               auth_handler = CompressedResponseProcessor(password_manager)
+               opener = urllib_request.build_opener(auth_handler)
                hdl = opener.open(request)
                if hdl.headers.get('last-modified', ''):
                        try:
@@ -44,30 +50,6 @@ def urlopen(url, if_modified_since=None):
                                add_header = hdl.headers.addheader
                        add_header('timestamp', _http_to_timestamp(hdl.headers.get('last-modified')))
                return hdl
-       except SystemExit:
-               raise
-       except Exception as e:
-               if hasattr(e, 'code') and e.code == 304: # HTTPError 304: not modified
-                       raise
-               if sys.hexversion < 0x3000000:
-                       raise
-               if parse_result.scheme not in ("http", "https") or \
-                       not parse_result.username:
-                       raise
-
-       return _new_urlopen(url)
-
-def _new_urlopen(url):
-       # This is experimental code for bug #413983.
-       parse_result = urllib_parse.urlparse(url)
-       netloc = urllib_parse_splituser(parse_result.netloc)[1]
-       url = urllib_parse.urlunparse((parse_result.scheme, netloc, parse_result.path, parse_result.params, parse_result.query, parse_result.fragment))
-       password_manager = urllib_request.HTTPPasswordMgrWithDefaultRealm()
-       if parse_result.username is not None:
-               password_manager.add_password(None, url, parse_result.username, parse_result.password)
-       auth_handler = urllib_request.HTTPBasicAuthHandler(password_manager)
-       opener = urllib_request.build_opener(auth_handler)
-       return opener.open(url)
 
 def _timestamp_to_http(timestamp):
        dt = datetime.fromtimestamp(float(long(timestamp)+TIMESTAMP_TOLERANCE))
@@ -79,7 +61,7 @@ def _http_to_timestamp(http_datetime_string):
        timestamp = mktime(tuple)
        return str(long(timestamp))
 
-class CompressedResponseProcessor(urllib_request.BaseHandler):
+class CompressedResponseProcessor(urllib_request.HTTPBasicAuthHandler):
        # Handler for compressed responses.
 
        def http_request(self, req):