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): |