diff --git a/mercurial/urllibcompat.py b/mercurial/urllibcompat.py --- a/mercurial/urllibcompat.py +++ b/mercurial/urllibcompat.py @@ -5,6 +5,12 @@ # This software may be used and distributed according to the terms of the # 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 . import pycompat @@ -39,199 +45,109 @@ urlreq = _pycompatstub() urlerr = _pycompatstub() -if pycompat.ispy3: - import urllib.parse - - urlreq._registeraliases( - urllib.parse, - ( - b"splitattr", - b"splitpasswd", - b"splitport", - b"splituser", - b"urlparse", - b"urlunparse", - ), - ) - urlreq._registeralias(urllib.parse, b"parse_qs", b"parseqs") - urlreq._registeralias(urllib.parse, b"parse_qsl", b"parseqsl") - urlreq._registeralias(urllib.parse, b"unquote_to_bytes", b"unquote") - import urllib.request - - urlreq._registeraliases( - urllib.request, - ( - b"AbstractHTTPHandler", - b"BaseHandler", - b"build_opener", - b"FileHandler", - b"FTPHandler", - b"ftpwrapper", - b"HTTPHandler", - b"HTTPSHandler", - b"install_opener", - b"pathname2url", - b"HTTPBasicAuthHandler", - b"HTTPDigestAuthHandler", - b"HTTPPasswordMgrWithDefaultRealm", - b"ProxyHandler", - b"Request", - b"url2pathname", - b"urlopen", - ), - ) - import urllib.response - - urlreq._registeraliases( - urllib.response, - ( - b"addclosehook", - b"addinfourl", - ), - ) - import urllib.error +urlreq._registeraliases( + urllib.parse, + ( + b"splitattr", + b"splitpasswd", + b"splitport", + b"splituser", + b"urlparse", + b"urlunparse", + ), +) +urlreq._registeralias(urllib.parse, b"parse_qs", b"parseqs") +urlreq._registeralias(urllib.parse, b"parse_qsl", b"parseqsl") +urlreq._registeralias(urllib.parse, b"unquote_to_bytes", b"unquote") - urlerr._registeraliases( - urllib.error, - ( - b"HTTPError", - b"URLError", - ), - ) - import http.server - - httpserver._registeraliases( - http.server, - ( - b"HTTPServer", - b"BaseHTTPRequestHandler", - b"SimpleHTTPRequestHandler", - b"CGIHTTPRequestHandler", - ), - ) - - # urllib.parse.quote() accepts both str and bytes, decodes bytes - # (if necessary), and returns str. This is wonky. We provide a custom - # implementation that only accepts bytes and emits bytes. - def quote(s, safe='/'): - # bytestr has an __iter__ that emits characters. quote_from_bytes() - # does an iteration and expects ints. We coerce to bytes to appease it. - if isinstance(s, pycompat.bytestr): - s = bytes(s) - s = urllib.parse.quote_from_bytes(s, safe=safe) - return s.encode('ascii', 'strict') - - # urllib.parse.urlencode() returns str. We use this function to make - # sure we return bytes. - def urlencode(query, doseq=False): - s = urllib.parse.urlencode(query, doseq=doseq) - return s.encode('ascii') - - urlreq.quote = quote - urlreq.urlencode = urlencode - - def getfullurl(req): - return req.full_url - - def gethost(req): - return req.host - - def getselector(req): - return req.selector - - def getdata(req): - return req.data - - def hasdata(req): - return req.data is not None +urlreq._registeraliases( + urllib.request, + ( + b"AbstractHTTPHandler", + b"BaseHandler", + b"build_opener", + b"FileHandler", + b"FTPHandler", + b"ftpwrapper", + b"HTTPHandler", + b"HTTPSHandler", + b"install_opener", + b"pathname2url", + b"HTTPBasicAuthHandler", + b"HTTPDigestAuthHandler", + b"HTTPPasswordMgrWithDefaultRealm", + b"ProxyHandler", + b"Request", + b"url2pathname", + b"urlopen", + ), +) -else: - # pytype: disable=import-error - import BaseHTTPServer - import CGIHTTPServer - import SimpleHTTPServer - import urllib2 - import urllib - import urlparse +urlreq._registeraliases( + urllib.response, + ( + b"addclosehook", + b"addinfourl", + ), +) - # pytype: enable=import-error +urlerr._registeraliases( + urllib.error, + ( + b"HTTPError", + b"URLError", + ), +) + +httpserver._registeraliases( + http.server, + ( + b"HTTPServer", + b"BaseHTTPRequestHandler", + b"SimpleHTTPRequestHandler", + b"CGIHTTPRequestHandler", + ), +) - 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",)) +# urllib.parse.quote() accepts both str and bytes, decodes bytes +# (if necessary), and returns str. This is wonky. We provide a custom +# implementation that only accepts bytes and emits bytes. +def quote(s, safe='/'): + # bytestr has an __iter__ that emits characters. quote_from_bytes() + # does an iteration and expects ints. We coerce to bytes to appease it. + if isinstance(s, pycompat.bytestr): + s = bytes(s) + s = urllib.parse.quote_from_bytes(s, safe=safe) + return s.encode('ascii', 'strict') + + +# urllib.parse.urlencode() returns str. We use this function to make +# sure we return bytes. +def urlencode(query, doseq=False): + s = urllib.parse.urlencode(query, doseq=doseq) + return s.encode('ascii') + - def gethost(req): - return req.get_host() +urlreq.quote = quote +urlreq.urlencode = urlencode + - def getselector(req): - return req.get_selector() +def getfullurl(req): + return req.full_url + + +def gethost(req): + return req.host - def getfullurl(req): - return req.get_full_url() + +def getselector(req): + return req.selector + - def getdata(req): - return req.get_data() +def getdata(req): + return req.data - def hasdata(req): - return req.has_data() + +def hasdata(req): + return req.data is not None