[compat] Simplify and use latest cpython 3 code

This commit is contained in:
Sergey M․ 2015-07-17 22:58:13 +06:00
parent 89f691e141
commit 5513967926

View File

@ -75,8 +75,13 @@
import BaseHTTPServer as compat_http_server import BaseHTTPServer as compat_http_server
try: try:
from urllib.parse import unquote_to_bytes as compat_urllib_parse_unquote_to_bytes
from urllib.parse import unquote as compat_urllib_parse_unquote from urllib.parse import unquote as compat_urllib_parse_unquote
except ImportError: except ImportError: # Python 2
# HACK: The following are the correct unquote_to_bytes and unquote
# implementations from cpython 3.4.3's stdlib. Python 2's version
# is apparently broken (see https://github.com/rg3/youtube-dl/pull/6244)
def compat_urllib_parse_unquote_to_bytes(string): def compat_urllib_parse_unquote_to_bytes(string):
"""unquote_to_bytes('abc%20def') -> b'abc def'.""" """unquote_to_bytes('abc%20def') -> b'abc def'."""
# Note: strings are encoded as UTF-8. This is only an issue if it contains # Note: strings are encoded as UTF-8. This is only an issue if it contains
@ -85,32 +90,22 @@ def compat_urllib_parse_unquote_to_bytes(string):
# Is it a string-like object? # Is it a string-like object?
string.split string.split
return b'' return b''
if isinstance(string, str): if isinstance(string, unicode):
string = string.encode('utf-8') string = string.encode('utf-8')
# string = encode('utf-8') bits = string.split(b'%')
# python3 -> 2: must implicitly convert to bits
bits = bytes(string).split(b'%')
if len(bits) == 1: if len(bits) == 1:
return string return string
res = [bits[0]] res = [bits[0]]
append = res.append append = res.append
for item in bits[1:]: for item in bits[1:]:
if item == '':
append(b'%')
continue
try: try:
append(item[:2].decode('hex')) append(compat_urllib_parse._hextochr[item[:2]])
append(item[2:]) append(item[2:])
except: except KeyError:
append(b'%') append(b'%')
append(item) append(item)
return b''.join(res) return b''.join(res)
compat_urllib_parse_asciire = re.compile('([\x00-\x7f]+)')
def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'): def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
"""Replace %xx escapes by their single-character equivalent. The optional """Replace %xx escapes by their single-character equivalent. The optional
encoding and errors parameters specify how to decode percent-encoded encoding and errors parameters specify how to decode percent-encoded
@ -121,7 +116,6 @@ def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
unquote('abc%20def') -> 'abc def'. unquote('abc%20def') -> 'abc def'.
""" """
if '%' not in string: if '%' not in string:
string.split string.split
return string return string
@ -129,20 +123,12 @@ def compat_urllib_parse_unquote(string, encoding='utf-8', errors='replace'):
encoding = 'utf-8' encoding = 'utf-8'
if errors is None: if errors is None:
errors = 'replace' errors = 'replace'
bits = compat_urllib_parse._asciire.split(string)
bits = compat_urllib_parse_asciire.split(string)
res = [bits[0]] res = [bits[0]]
append = res.append append = res.append
for i in range(1, len(bits), 2): for i in range(1, len(bits), 2):
foo = compat_urllib_parse_unquote_to_bytes(bits[i]) append(compat_urllib_parse_unquote_to_bytes(bits[i]).decode(encoding, errors))
foo = foo.decode(encoding, errors) append(bits[i + 1])
append(foo)
if bits[i + 1]:
bar = bits[i + 1]
if not isinstance(bar, unicode):
bar = bar.decode('utf-8')
append(bar)
return ''.join(res) return ''.join(res)
try: try:
@ -454,7 +440,6 @@ def compat_itertools_count(start=0, step=1):
'compat_subprocess_get_DEVNULL', 'compat_subprocess_get_DEVNULL',
'compat_urllib_error', 'compat_urllib_error',
'compat_urllib_parse', 'compat_urllib_parse',
'compat_urllib_parse_asciire',
'compat_urllib_parse_unquote', 'compat_urllib_parse_unquote',
'compat_urllib_parse_unquote_to_bytes', 'compat_urllib_parse_unquote_to_bytes',
'compat_urllib_parse_urlparse', 'compat_urllib_parse_urlparse',