Bug #413983: Add portage.util.urlopen(), which transparently
authorArfrever Frehtes Taifersar Arahesis <Arfrever@Apache.Org>
Tue, 1 May 2012 19:51:16 +0000 (21:51 +0200)
committerArfrever Frehtes Taifersar Arahesis <Arfrever@Apache.Org>
Tue, 1 May 2012 19:51:16 +0000 (21:51 +0200)
handles authentication in the way compatible with Python 3.

bin/repoman
pym/portage/dbapi/bintree.py
pym/portage/glsa.py
pym/portage/util/__init__.py

index 1cdfcf67426e8c1bd90f8ac2c1128dd55cb429df..cfe4b8e01c6ae7688694ad078ff6e8ec91659c9d 100755 (executable)
@@ -25,11 +25,6 @@ import textwrap
 import time
 import platform
 
-try:
-       from urllib.request import urlopen as urllib_request_urlopen
-except ImportError:
-       from urllib import urlopen as urllib_request_urlopen
-
 from itertools import chain
 from stat import S_ISDIR
 
@@ -75,7 +70,7 @@ from portage.process import find_binary, spawn
 from portage.output import bold, create_color_func, \
        green, nocolor, red
 from portage.output import ConsoleStyleFile, StyleWriter
-from portage.util import cmp_sort_key, writemsg_level
+from portage.util import cmp_sort_key, urlopen, writemsg_level
 from portage.util._desktop_entry import validate_desktop_entry
 from portage.package.ebuild.digestgen import digestgen
 from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use
@@ -1051,7 +1046,7 @@ def fetch_metadata_dtd():
                        "needs to be refetched, doing that now")
                print()
                try:
-                       url_f = urllib_request_urlopen(metadata_dtd_uri)
+                       url_f = urlopen(metadata_dtd_uri)
                        msg_info = url_f.info()
                        last_modified = msg_info.get('last-modified')
                        if last_modified is not None:
index 2295b9f59f93ddc4c86a6cbd370508f5135470d1..810163d0fa14490447ac2b8e44cf8943c390acc0 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 1998-2011 Gentoo Foundation
+# Copyright 1998-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 __all__ = ["bindbapi", "binarytree"]
@@ -26,6 +26,7 @@ from portage.dep import Atom, use_reduce, paren_enclose
 from portage.exception import AlarmSignal, InvalidPackageName, \
        PermissionDenied, PortageException
 from portage.localization import _
+from portage.util import urlopen
 from portage import _movefile
 from portage import os
 from portage import _encodings
@@ -45,10 +46,8 @@ import warnings
 from itertools import chain
 try:
        from urllib.parse import urlparse
-       from urllib.request import urlopen as urllib_request_urlopen
 except ImportError:
        from urlparse import urlparse
-       from urllib import urlopen as urllib_request_urlopen
 
 if sys.hexversion >= 0x3000000:
        basestring = str
@@ -843,7 +842,7 @@ class binarytree(object):
                                # slash, so join manually...
                                url = base_url.rstrip("/") + "/Packages"
                                try:
-                                       f = urllib_request_urlopen(url)
+                                       f = urlopen(url)
                                except IOError:
                                        path = parsed_url.path.rstrip("/") + "/Packages"
 
index 2df7ec3a7dd3bca834fbdf3496158b002ce9686b..16f662f0d5ba98cbdf2267e6abd790b46be466c0 100644 (file)
@@ -1,14 +1,10 @@
-# Copyright 2003-2011 Gentoo Foundation
+# Copyright 2003-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 from __future__ import absolute_import
 
 import io
 import sys
-try:
-       from urllib.request import urlopen as urllib_request_urlopen
-except ImportError:
-       from urllib import urlopen as urllib_request_urlopen
 import re
 import xml.dom.minidom
 
@@ -18,7 +14,7 @@ from portage import _encodings
 from portage import _unicode_decode
 from portage import _unicode_encode
 from portage.versions import pkgsplit, catpkgsplit, pkgcmp, best
-from portage.util import grabfile
+from portage.util import grabfile, urlopen
 from portage.const import CACHE_PATH
 from portage.localization import _
 from portage.dep import _slot_separator
@@ -476,7 +472,7 @@ class Glsa:
                        myurl = "file://"+self.nr
                else:
                        myurl = repository + "glsa-%s.xml" % str(self.nr)
-               self.parse(urllib_request_urlopen(myurl))
+               self.parse(urlopen(myurl))
                return None
 
        def parse(self, myfile):
index d6ac46c83ee3f1d823b2a77862da841681455ba3..2b50733c5393c7ac3b4542bae2e06e30e37e2926 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2004-2011 Gentoo Foundation
+# Copyright 2004-2012 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
 
 __all__ = ['apply_permissions', 'apply_recursive_permissions',
@@ -26,6 +26,14 @@ import string
 import sys
 import traceback
 import glob
+try:
+       import urllib.parse as urllib_parse
+       import urllib.request as urllib_request
+       from urllib.parse import splituser as urllib_parse_splituser
+except ImportError:
+       import urlparse as urllib_parse
+       import urllib2 as urllib_request
+       from urllib import splituser as urllib_parse_splituser
 
 import portage
 portage.proxy.lazyimport.lazyimport(globals(),
@@ -1640,3 +1648,14 @@ def getlibpaths(root, env=None):
        rval.append("/lib")
 
        return [normalize_path(x) for x in rval if x]
+
+def urlopen(url):      
+       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)