comparison mercurial/urllibcompat.py @ 34468:192f7b126ed2

urllibcompat: move some adapters from pycompat to urllibcompat These are all the httpserver and urllib.* aliases. They seem to make more sense in the slightly-more-specific urllibcompat package than the general-purpose pycompat. Differential Revision: https://phab.mercurial-scm.org/D935
author Augie Fackler <augie@google.com>
date Wed, 04 Oct 2017 11:58:00 -0400
parents 80d4681150b9
children a3d42d1865f1
comparison
equal deleted inserted replaced
34467:1232f7fa00c3 34468:192f7b126ed2
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 from __future__ import absolute_import 7 from __future__ import absolute_import
8 8
9 from . import pycompat 9 from . import pycompat
10 10
11 _sysstr = pycompat.sysstr
12
13 class _pycompatstub(object):
14 def __init__(self):
15 self._aliases = {}
16
17 def _registeraliases(self, origin, items):
18 """Add items that will be populated at the first access"""
19 items = map(_sysstr, items)
20 self._aliases.update(
21 (item.replace(_sysstr('_'), _sysstr('')).lower(), (origin, item))
22 for item in items)
23
24 def _registeralias(self, origin, attr, name):
25 """Alias ``origin``.``attr`` as ``name``"""
26 self._aliases[_sysstr(name)] = (origin, _sysstr(attr))
27
28 def __getattr__(self, name):
29 try:
30 origin, item = self._aliases[name]
31 except KeyError:
32 raise AttributeError(name)
33 self.__dict__[name] = obj = getattr(origin, item)
34 return obj
35
36 httpserver = _pycompatstub()
37 urlreq = _pycompatstub()
38 urlerr = _pycompatstub()
39
11 if pycompat.ispy3: 40 if pycompat.ispy3:
41 import urllib.parse
42 urlreq._registeraliases(urllib.parse, (
43 "splitattr",
44 "splitpasswd",
45 "splitport",
46 "splituser",
47 "urlparse",
48 "urlunparse",
49 ))
50 urlreq._registeralias(urllib.parse, "unquote_to_bytes", "unquote")
51 import urllib.request
52 urlreq._registeraliases(urllib.request, (
53 "AbstractHTTPHandler",
54 "BaseHandler",
55 "build_opener",
56 "FileHandler",
57 "FTPHandler",
58 "ftpwrapper",
59 "HTTPHandler",
60 "HTTPSHandler",
61 "install_opener",
62 "pathname2url",
63 "HTTPBasicAuthHandler",
64 "HTTPDigestAuthHandler",
65 "HTTPPasswordMgrWithDefaultRealm",
66 "ProxyHandler",
67 "Request",
68 "url2pathname",
69 "urlopen",
70 ))
71 import urllib.response
72 urlreq._registeraliases(urllib.response, (
73 "addclosehook",
74 "addinfourl",
75 ))
76 import urllib.error
77 urlerr._registeraliases(urllib.error, (
78 "HTTPError",
79 "URLError",
80 ))
81 import http.server
82 httpserver._registeraliases(http.server, (
83 "HTTPServer",
84 "BaseHTTPRequestHandler",
85 "SimpleHTTPRequestHandler",
86 "CGIHTTPRequestHandler",
87 ))
88
89 # urllib.parse.quote() accepts both str and bytes, decodes bytes
90 # (if necessary), and returns str. This is wonky. We provide a custom
91 # implementation that only accepts bytes and emits bytes.
92 def quote(s, safe=r'/'):
93 s = urllib.parse.quote_from_bytes(s, safe=safe)
94 return s.encode('ascii', 'strict')
95
96 # urllib.parse.urlencode() returns str. We use this function to make
97 # sure we return bytes.
98 def urlencode(query, doseq=False):
99 s = urllib.parse.urlencode(query, doseq=doseq)
100 return s.encode('ascii')
101
102 urlreq.quote = quote
103 urlreq.urlencode = urlencode
12 104
13 def getfullurl(req): 105 def getfullurl(req):
14 return req.full_url 106 return req.full_url
15 107
16 def gethost(req): 108 def gethost(req):
23 return req.data 115 return req.data
24 116
25 def hasdata(req): 117 def hasdata(req):
26 return req.data is not None 118 return req.data is not None
27 else: 119 else:
120 import BaseHTTPServer
121 import CGIHTTPServer
122 import SimpleHTTPServer
123 import urllib2
124 import urllib
125 import urlparse
126 urlreq._registeraliases(urllib, (
127 "addclosehook",
128 "addinfourl",
129 "ftpwrapper",
130 "pathname2url",
131 "quote",
132 "splitattr",
133 "splitpasswd",
134 "splitport",
135 "splituser",
136 "unquote",
137 "url2pathname",
138 "urlencode",
139 ))
140 urlreq._registeraliases(urllib2, (
141 "AbstractHTTPHandler",
142 "BaseHandler",
143 "build_opener",
144 "FileHandler",
145 "FTPHandler",
146 "HTTPBasicAuthHandler",
147 "HTTPDigestAuthHandler",
148 "HTTPHandler",
149 "HTTPPasswordMgrWithDefaultRealm",
150 "HTTPSHandler",
151 "install_opener",
152 "ProxyHandler",
153 "Request",
154 "urlopen",
155 ))
156 urlreq._registeraliases(urlparse, (
157 "urlparse",
158 "urlunparse",
159 ))
160 urlerr._registeraliases(urllib2, (
161 "HTTPError",
162 "URLError",
163 ))
164 httpserver._registeraliases(BaseHTTPServer, (
165 "HTTPServer",
166 "BaseHTTPRequestHandler",
167 ))
168 httpserver._registeraliases(SimpleHTTPServer, (
169 "SimpleHTTPRequestHandler",
170 ))
171 httpserver._registeraliases(CGIHTTPServer, (
172 "CGIHTTPRequestHandler",
173 ))
28 174
29 def gethost(req): 175 def gethost(req):
30 return req.get_host() 176 return req.get_host()
31 177
32 def getselector(req): 178 def getselector(req):