We had to move the import statements to appease the import checker.
This whole module could probably be deleted as its point in life is to
pave over Python 2/3 differences. But that's for a different commit.
Alphare |
hg-reviewers |
We had to move the import statements to appease the import checker.
This whole module could probably be deleted as its point in life is to
pave over Python 2/3 differences. But that's for a different commit.
Automatic diff as part of commit; lint not applicable. |
Automatic diff as part of commit; unit tests not applicable. |
Path | Packages | |||
---|---|---|---|---|
M | mercurial/urllibcompat.py (288 lines) |
# urllibcompat.py - adapters to ease using urllib2 on Py2 and urllib on Py3 | # urllibcompat.py - adapters to ease using urllib2 on Py2 and urllib on Py3 | ||||
# | # | ||||
# Copyright 2017 Google, Inc. | # Copyright 2017 Google, Inc. | ||||
# | # | ||||
# This software may be used and distributed according to the terms of the | # This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | # GNU General Public License version 2 or any later version. | ||||
import http.server | |||||
import urllib.error | |||||
import urllib.parse | |||||
import urllib.request | |||||
import urllib.response | |||||
from .pycompat import getattr | from .pycompat import getattr | ||||
from . import pycompat | from . import pycompat | ||||
_sysstr = pycompat.sysstr | _sysstr = pycompat.sysstr | ||||
class _pycompatstub(object): | class _pycompatstub(object): | ||||
def __init__(self): | def __init__(self): | ||||
self.__dict__[name] = obj = getattr(origin, item) | self.__dict__[name] = obj = getattr(origin, item) | ||||
return obj | return obj | ||||
httpserver = _pycompatstub() | httpserver = _pycompatstub() | ||||
urlreq = _pycompatstub() | urlreq = _pycompatstub() | ||||
urlerr = _pycompatstub() | urlerr = _pycompatstub() | ||||
if pycompat.ispy3: | |||||
import urllib.parse | |||||
urlreq._registeraliases( | urlreq._registeraliases( | ||||
urllib.parse, | urllib.parse, | ||||
( | ( | ||||
b"splitattr", | b"splitattr", | ||||
b"splitpasswd", | b"splitpasswd", | ||||
b"splitport", | b"splitport", | ||||
b"splituser", | b"splituser", | ||||
b"urlparse", | b"urlparse", | ||||
b"urlunparse", | b"urlunparse", | ||||
), | ), | ||||
) | ) | ||||
urlreq._registeralias(urllib.parse, b"parse_qs", b"parseqs") | urlreq._registeralias(urllib.parse, b"parse_qs", b"parseqs") | ||||
urlreq._registeralias(urllib.parse, b"parse_qsl", b"parseqsl") | urlreq._registeralias(urllib.parse, b"parse_qsl", b"parseqsl") | ||||
urlreq._registeralias(urllib.parse, b"unquote_to_bytes", b"unquote") | urlreq._registeralias(urllib.parse, b"unquote_to_bytes", b"unquote") | ||||
import urllib.request | |||||
urlreq._registeraliases( | urlreq._registeraliases( | ||||
urllib.request, | urllib.request, | ||||
( | ( | ||||
b"AbstractHTTPHandler", | b"AbstractHTTPHandler", | ||||
b"BaseHandler", | b"BaseHandler", | ||||
b"build_opener", | b"build_opener", | ||||
b"FileHandler", | b"FileHandler", | ||||
b"FTPHandler", | b"FTPHandler", | ||||
b"ftpwrapper", | b"ftpwrapper", | ||||
b"HTTPHandler", | b"HTTPHandler", | ||||
b"HTTPSHandler", | b"HTTPSHandler", | ||||
b"install_opener", | b"install_opener", | ||||
b"pathname2url", | b"pathname2url", | ||||
b"HTTPBasicAuthHandler", | b"HTTPBasicAuthHandler", | ||||
b"HTTPDigestAuthHandler", | b"HTTPDigestAuthHandler", | ||||
b"HTTPPasswordMgrWithDefaultRealm", | b"HTTPPasswordMgrWithDefaultRealm", | ||||
b"ProxyHandler", | b"ProxyHandler", | ||||
b"Request", | b"Request", | ||||
b"url2pathname", | b"url2pathname", | ||||
b"urlopen", | b"urlopen", | ||||
), | ), | ||||
) | ) | ||||
import urllib.response | |||||
urlreq._registeraliases( | urlreq._registeraliases( | ||||
urllib.response, | urllib.response, | ||||
( | ( | ||||
b"addclosehook", | b"addclosehook", | ||||
b"addinfourl", | b"addinfourl", | ||||
), | ), | ||||
) | ) | ||||
import urllib.error | |||||
urlerr._registeraliases( | urlerr._registeraliases( | ||||
urllib.error, | urllib.error, | ||||
( | ( | ||||
b"HTTPError", | b"HTTPError", | ||||
b"URLError", | b"URLError", | ||||
), | ), | ||||
) | ) | ||||
import http.server | |||||
httpserver._registeraliases( | httpserver._registeraliases( | ||||
http.server, | http.server, | ||||
( | ( | ||||
b"HTTPServer", | b"HTTPServer", | ||||
b"BaseHTTPRequestHandler", | b"BaseHTTPRequestHandler", | ||||
b"SimpleHTTPRequestHandler", | b"SimpleHTTPRequestHandler", | ||||
b"CGIHTTPRequestHandler", | b"CGIHTTPRequestHandler", | ||||
), | ), | ||||
) | ) | ||||
# urllib.parse.quote() accepts both str and bytes, decodes bytes | # urllib.parse.quote() accepts both str and bytes, decodes bytes | ||||
# (if necessary), and returns str. This is wonky. We provide a custom | # (if necessary), and returns str. This is wonky. We provide a custom | ||||
# implementation that only accepts bytes and emits bytes. | # implementation that only accepts bytes and emits bytes. | ||||
def quote(s, safe='/'): | def quote(s, safe='/'): | ||||
# bytestr has an __iter__ that emits characters. quote_from_bytes() | # bytestr has an __iter__ that emits characters. quote_from_bytes() | ||||
# does an iteration and expects ints. We coerce to bytes to appease it. | # does an iteration and expects ints. We coerce to bytes to appease it. | ||||
if isinstance(s, pycompat.bytestr): | if isinstance(s, pycompat.bytestr): | ||||
s = bytes(s) | s = bytes(s) | ||||
s = urllib.parse.quote_from_bytes(s, safe=safe) | s = urllib.parse.quote_from_bytes(s, safe=safe) | ||||
return s.encode('ascii', 'strict') | return s.encode('ascii', 'strict') | ||||
# urllib.parse.urlencode() returns str. We use this function to make | # urllib.parse.urlencode() returns str. We use this function to make | ||||
# sure we return bytes. | # sure we return bytes. | ||||
def urlencode(query, doseq=False): | def urlencode(query, doseq=False): | ||||
s = urllib.parse.urlencode(query, doseq=doseq) | s = urllib.parse.urlencode(query, doseq=doseq) | ||||
return s.encode('ascii') | return s.encode('ascii') | ||||
urlreq.quote = quote | urlreq.quote = quote | ||||
urlreq.urlencode = urlencode | urlreq.urlencode = urlencode | ||||
def getfullurl(req): | def getfullurl(req): | ||||
return req.full_url | return req.full_url | ||||
def gethost(req): | def gethost(req): | ||||
return req.host | return req.host | ||||
def getselector(req): | def getselector(req): | ||||
return req.selector | return req.selector | ||||
def getdata(req): | def getdata(req): | ||||
return req.data | return req.data | ||||
def hasdata(req): | |||||
return req.data is not None | |||||
else: | |||||
# pytype: disable=import-error | |||||
import BaseHTTPServer | |||||
import CGIHTTPServer | |||||
import SimpleHTTPServer | |||||
import urllib2 | |||||
import urllib | |||||
import urlparse | |||||
# pytype: enable=import-error | |||||
urlreq._registeraliases( | |||||
urllib, | |||||
( | |||||
b"addclosehook", | |||||
b"addinfourl", | |||||
b"ftpwrapper", | |||||
b"pathname2url", | |||||
b"quote", | |||||
b"splitattr", | |||||
b"splitpasswd", | |||||
b"splitport", | |||||
b"splituser", | |||||
b"unquote", | |||||
b"url2pathname", | |||||
b"urlencode", | |||||
), | |||||
) | |||||
urlreq._registeraliases( | |||||
urllib2, | |||||
( | |||||
b"AbstractHTTPHandler", | |||||
b"BaseHandler", | |||||
b"build_opener", | |||||
b"FileHandler", | |||||
b"FTPHandler", | |||||
b"HTTPBasicAuthHandler", | |||||
b"HTTPDigestAuthHandler", | |||||
b"HTTPHandler", | |||||
b"HTTPPasswordMgrWithDefaultRealm", | |||||
b"HTTPSHandler", | |||||
b"install_opener", | |||||
b"ProxyHandler", | |||||
b"Request", | |||||
b"urlopen", | |||||
), | |||||
) | |||||
urlreq._registeraliases( | |||||
urlparse, | |||||
( | |||||
b"urlparse", | |||||
b"urlunparse", | |||||
), | |||||
) | |||||
urlreq._registeralias(urlparse, b"parse_qs", b"parseqs") | |||||
urlreq._registeralias(urlparse, b"parse_qsl", b"parseqsl") | |||||
urlerr._registeraliases( | |||||
urllib2, | |||||
( | |||||
b"HTTPError", | |||||
b"URLError", | |||||
), | |||||
) | |||||
httpserver._registeraliases( | |||||
BaseHTTPServer, | |||||
( | |||||
b"HTTPServer", | |||||
b"BaseHTTPRequestHandler", | |||||
), | |||||
) | |||||
httpserver._registeraliases( | |||||
SimpleHTTPServer, (b"SimpleHTTPRequestHandler",) | |||||
) | |||||
httpserver._registeraliases(CGIHTTPServer, (b"CGIHTTPRequestHandler",)) | |||||
def gethost(req): | |||||
return req.get_host() | |||||
def getselector(req): | |||||
return req.get_selector() | |||||
def getfullurl(req): | |||||
return req.get_full_url() | |||||
def getdata(req): | |||||
return req.get_data() | |||||
def hasdata(req): | def hasdata(req): | ||||
return req.has_data() | return req.data is not None |