mercurial/urllibcompat.py
changeset 43076 2372284d9457
parent 40159 5774fc623a18
child 43077 687b865b95ad
equal deleted inserted replaced
43075:57875cf423c9 43076:2372284d9457
     8 
     8 
     9 from . import pycompat
     9 from . import pycompat
    10 
    10 
    11 _sysstr = pycompat.sysstr
    11 _sysstr = pycompat.sysstr
    12 
    12 
       
    13 
    13 class _pycompatstub(object):
    14 class _pycompatstub(object):
    14     def __init__(self):
    15     def __init__(self):
    15         self._aliases = {}
    16         self._aliases = {}
    16 
    17 
    17     def _registeraliases(self, origin, items):
    18     def _registeraliases(self, origin, items):
    18         """Add items that will be populated at the first access"""
    19         """Add items that will be populated at the first access"""
    19         items = map(_sysstr, items)
    20         items = map(_sysstr, items)
    20         self._aliases.update(
    21         self._aliases.update(
    21             (item.replace(r'_', r'').lower(), (origin, item))
    22             (item.replace(r'_', r'').lower(), (origin, item)) for item in items
    22             for item in items)
    23         )
    23 
    24 
    24     def _registeralias(self, origin, attr, name):
    25     def _registeralias(self, origin, attr, name):
    25         """Alias ``origin``.``attr`` as ``name``"""
    26         """Alias ``origin``.``attr`` as ``name``"""
    26         self._aliases[_sysstr(name)] = (origin, _sysstr(attr))
    27         self._aliases[_sysstr(name)] = (origin, _sysstr(attr))
    27 
    28 
    31         except KeyError:
    32         except KeyError:
    32             raise AttributeError(name)
    33             raise AttributeError(name)
    33         self.__dict__[name] = obj = getattr(origin, item)
    34         self.__dict__[name] = obj = getattr(origin, item)
    34         return obj
    35         return obj
    35 
    36 
       
    37 
    36 httpserver = _pycompatstub()
    38 httpserver = _pycompatstub()
    37 urlreq = _pycompatstub()
    39 urlreq = _pycompatstub()
    38 urlerr = _pycompatstub()
    40 urlerr = _pycompatstub()
    39 
    41 
    40 if pycompat.ispy3:
    42 if pycompat.ispy3:
    41     import urllib.parse
    43     import urllib.parse
    42     urlreq._registeraliases(urllib.parse, (
    44 
    43         "splitattr",
    45     urlreq._registeraliases(
    44         "splitpasswd",
    46         urllib.parse,
    45         "splitport",
    47         (
    46         "splituser",
    48             "splitattr",
    47         "urlparse",
    49             "splitpasswd",
    48         "urlunparse",
    50             "splitport",
    49     ))
    51             "splituser",
       
    52             "urlparse",
       
    53             "urlunparse",
       
    54         ),
       
    55     )
    50     urlreq._registeralias(urllib.parse, "parse_qs", "parseqs")
    56     urlreq._registeralias(urllib.parse, "parse_qs", "parseqs")
    51     urlreq._registeralias(urllib.parse, "parse_qsl", "parseqsl")
    57     urlreq._registeralias(urllib.parse, "parse_qsl", "parseqsl")
    52     urlreq._registeralias(urllib.parse, "unquote_to_bytes", "unquote")
    58     urlreq._registeralias(urllib.parse, "unquote_to_bytes", "unquote")
    53     import urllib.request
    59     import urllib.request
    54     urlreq._registeraliases(urllib.request, (
    60 
    55         "AbstractHTTPHandler",
    61     urlreq._registeraliases(
    56         "BaseHandler",
    62         urllib.request,
    57         "build_opener",
    63         (
    58         "FileHandler",
    64             "AbstractHTTPHandler",
    59         "FTPHandler",
    65             "BaseHandler",
    60         "ftpwrapper",
    66             "build_opener",
    61         "HTTPHandler",
    67             "FileHandler",
    62         "HTTPSHandler",
    68             "FTPHandler",
    63         "install_opener",
    69             "ftpwrapper",
    64         "pathname2url",
    70             "HTTPHandler",
    65         "HTTPBasicAuthHandler",
    71             "HTTPSHandler",
    66         "HTTPDigestAuthHandler",
    72             "install_opener",
    67         "HTTPPasswordMgrWithDefaultRealm",
    73             "pathname2url",
    68         "ProxyHandler",
    74             "HTTPBasicAuthHandler",
    69         "Request",
    75             "HTTPDigestAuthHandler",
    70         "url2pathname",
    76             "HTTPPasswordMgrWithDefaultRealm",
    71         "urlopen",
    77             "ProxyHandler",
    72     ))
    78             "Request",
       
    79             "url2pathname",
       
    80             "urlopen",
       
    81         ),
       
    82     )
    73     import urllib.response
    83     import urllib.response
    74     urlreq._registeraliases(urllib.response, (
    84 
    75         "addclosehook",
    85     urlreq._registeraliases(urllib.response, ("addclosehook", "addinfourl",))
    76         "addinfourl",
       
    77     ))
       
    78     import urllib.error
    86     import urllib.error
    79     urlerr._registeraliases(urllib.error, (
    87 
    80         "HTTPError",
    88     urlerr._registeraliases(urllib.error, ("HTTPError", "URLError",))
    81         "URLError",
       
    82     ))
       
    83     import http.server
    89     import http.server
    84     httpserver._registeraliases(http.server, (
    90 
    85         "HTTPServer",
    91     httpserver._registeraliases(
    86         "BaseHTTPRequestHandler",
    92         http.server,
    87         "SimpleHTTPRequestHandler",
    93         (
    88         "CGIHTTPRequestHandler",
    94             "HTTPServer",
    89     ))
    95             "BaseHTTPRequestHandler",
       
    96             "SimpleHTTPRequestHandler",
       
    97             "CGIHTTPRequestHandler",
       
    98         ),
       
    99     )
    90 
   100 
    91     # urllib.parse.quote() accepts both str and bytes, decodes bytes
   101     # urllib.parse.quote() accepts both str and bytes, decodes bytes
    92     # (if necessary), and returns str. This is wonky. We provide a custom
   102     # (if necessary), and returns str. This is wonky. We provide a custom
    93     # implementation that only accepts bytes and emits bytes.
   103     # implementation that only accepts bytes and emits bytes.
    94     def quote(s, safe=r'/'):
   104     def quote(s, safe=r'/'):
   100         return s.encode('ascii', 'strict')
   110         return s.encode('ascii', 'strict')
   101 
   111 
   102     # urllib.parse.urlencode() returns str. We use this function to make
   112     # urllib.parse.urlencode() returns str. We use this function to make
   103     # sure we return bytes.
   113     # sure we return bytes.
   104     def urlencode(query, doseq=False):
   114     def urlencode(query, doseq=False):
   105             s = urllib.parse.urlencode(query, doseq=doseq)
   115         s = urllib.parse.urlencode(query, doseq=doseq)
   106             return s.encode('ascii')
   116         return s.encode('ascii')
   107 
   117 
   108     urlreq.quote = quote
   118     urlreq.quote = quote
   109     urlreq.urlencode = urlencode
   119     urlreq.urlencode = urlencode
   110 
   120 
   111     def getfullurl(req):
   121     def getfullurl(req):
   120     def getdata(req):
   130     def getdata(req):
   121         return req.data
   131         return req.data
   122 
   132 
   123     def hasdata(req):
   133     def hasdata(req):
   124         return req.data is not None
   134         return req.data is not None
       
   135 
       
   136 
   125 else:
   137 else:
   126     import BaseHTTPServer
   138     import BaseHTTPServer
   127     import CGIHTTPServer
   139     import CGIHTTPServer
   128     import SimpleHTTPServer
   140     import SimpleHTTPServer
   129     import urllib2
   141     import urllib2
   130     import urllib
   142     import urllib
   131     import urlparse
   143     import urlparse
   132     urlreq._registeraliases(urllib, (
   144 
   133         "addclosehook",
   145     urlreq._registeraliases(
   134         "addinfourl",
   146         urllib,
   135         "ftpwrapper",
   147         (
   136         "pathname2url",
   148             "addclosehook",
   137         "quote",
   149             "addinfourl",
   138         "splitattr",
   150             "ftpwrapper",
   139         "splitpasswd",
   151             "pathname2url",
   140         "splitport",
   152             "quote",
   141         "splituser",
   153             "splitattr",
   142         "unquote",
   154             "splitpasswd",
   143         "url2pathname",
   155             "splitport",
   144         "urlencode",
   156             "splituser",
   145     ))
   157             "unquote",
   146     urlreq._registeraliases(urllib2, (
   158             "url2pathname",
   147         "AbstractHTTPHandler",
   159             "urlencode",
   148         "BaseHandler",
   160         ),
   149         "build_opener",
   161     )
   150         "FileHandler",
   162     urlreq._registeraliases(
   151         "FTPHandler",
   163         urllib2,
   152         "HTTPBasicAuthHandler",
   164         (
   153         "HTTPDigestAuthHandler",
   165             "AbstractHTTPHandler",
   154         "HTTPHandler",
   166             "BaseHandler",
   155         "HTTPPasswordMgrWithDefaultRealm",
   167             "build_opener",
   156         "HTTPSHandler",
   168             "FileHandler",
   157         "install_opener",
   169             "FTPHandler",
   158         "ProxyHandler",
   170             "HTTPBasicAuthHandler",
   159         "Request",
   171             "HTTPDigestAuthHandler",
   160         "urlopen",
   172             "HTTPHandler",
   161     ))
   173             "HTTPPasswordMgrWithDefaultRealm",
   162     urlreq._registeraliases(urlparse, (
   174             "HTTPSHandler",
   163         "urlparse",
   175             "install_opener",
   164         "urlunparse",
   176             "ProxyHandler",
   165     ))
   177             "Request",
       
   178             "urlopen",
       
   179         ),
       
   180     )
       
   181     urlreq._registeraliases(urlparse, ("urlparse", "urlunparse",))
   166     urlreq._registeralias(urlparse, "parse_qs", "parseqs")
   182     urlreq._registeralias(urlparse, "parse_qs", "parseqs")
   167     urlreq._registeralias(urlparse, "parse_qsl", "parseqsl")
   183     urlreq._registeralias(urlparse, "parse_qsl", "parseqsl")
   168     urlerr._registeraliases(urllib2, (
   184     urlerr._registeraliases(urllib2, ("HTTPError", "URLError",))
   169         "HTTPError",
   185     httpserver._registeraliases(
   170         "URLError",
   186         BaseHTTPServer, ("HTTPServer", "BaseHTTPRequestHandler",)
   171     ))
   187     )
   172     httpserver._registeraliases(BaseHTTPServer, (
   188     httpserver._registeraliases(SimpleHTTPServer, ("SimpleHTTPRequestHandler",))
   173         "HTTPServer",
   189     httpserver._registeraliases(CGIHTTPServer, ("CGIHTTPRequestHandler",))
   174         "BaseHTTPRequestHandler",
       
   175     ))
       
   176     httpserver._registeraliases(SimpleHTTPServer, (
       
   177         "SimpleHTTPRequestHandler",
       
   178     ))
       
   179     httpserver._registeraliases(CGIHTTPServer, (
       
   180         "CGIHTTPRequestHandler",
       
   181     ))
       
   182 
   190 
   183     def gethost(req):
   191     def gethost(req):
   184         return req.get_host()
   192         return req.get_host()
   185 
   193 
   186     def getselector(req):
   194     def getselector(req):