|
|
@ -1,7 +1,10 @@
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import binascii
|
|
|
|
import collections
|
|
|
|
import collections
|
|
|
|
|
|
|
|
import email
|
|
|
|
import getpass
|
|
|
|
import getpass
|
|
|
|
|
|
|
|
import io
|
|
|
|
import optparse
|
|
|
|
import optparse
|
|
|
|
import os
|
|
|
|
import os
|
|
|
|
import re
|
|
|
|
import re
|
|
|
@ -38,6 +41,11 @@ try:
|
|
|
|
except ImportError: # Python 2
|
|
|
|
except ImportError: # Python 2
|
|
|
|
import urlparse as compat_urlparse
|
|
|
|
import urlparse as compat_urlparse
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
import urllib.response as compat_urllib_response
|
|
|
|
|
|
|
|
except ImportError: # Python 2
|
|
|
|
|
|
|
|
import urllib as compat_urllib_response
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
import http.cookiejar as compat_cookiejar
|
|
|
|
import http.cookiejar as compat_cookiejar
|
|
|
|
except ImportError: # Python 2
|
|
|
|
except ImportError: # Python 2
|
|
|
@ -155,6 +163,40 @@ except ImportError: # Python 2
|
|
|
|
string = string.replace('+', ' ')
|
|
|
|
string = string.replace('+', ' ')
|
|
|
|
return compat_urllib_parse_unquote(string, encoding, errors)
|
|
|
|
return compat_urllib_parse_unquote(string, encoding, errors)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
from urllib.request import DataHandler as compat_urllib_request_DataHandler
|
|
|
|
|
|
|
|
except ImportError: # Python < 3.4
|
|
|
|
|
|
|
|
# Ported from CPython 98774:1733b3bd46db, Lib/urllib/request.py
|
|
|
|
|
|
|
|
class compat_urllib_request_DataHandler(compat_urllib_request.BaseHandler):
|
|
|
|
|
|
|
|
def data_open(self, req):
|
|
|
|
|
|
|
|
# data URLs as specified in RFC 2397.
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
# ignores POSTed data
|
|
|
|
|
|
|
|
#
|
|
|
|
|
|
|
|
# syntax:
|
|
|
|
|
|
|
|
# dataurl := "data:" [ mediatype ] [ ";base64" ] "," data
|
|
|
|
|
|
|
|
# mediatype := [ type "/" subtype ] *( ";" parameter )
|
|
|
|
|
|
|
|
# data := *urlchar
|
|
|
|
|
|
|
|
# parameter := attribute "=" value
|
|
|
|
|
|
|
|
url = req.get_full_url()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
scheme, data = url.split(":", 1)
|
|
|
|
|
|
|
|
mediatype, data = data.split(",", 1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# even base64 encoded data URLs might be quoted so unquote in any case:
|
|
|
|
|
|
|
|
data = compat_urllib_parse_unquote_to_bytes(data)
|
|
|
|
|
|
|
|
if mediatype.endswith(";base64"):
|
|
|
|
|
|
|
|
data = binascii.a2b_base64(data)
|
|
|
|
|
|
|
|
mediatype = mediatype[:-7]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if not mediatype:
|
|
|
|
|
|
|
|
mediatype = "text/plain;charset=US-ASCII"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
headers = email.message_from_string(
|
|
|
|
|
|
|
|
"Content-type: %s\nContent-length: %d\n" % (mediatype, len(data)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return compat_urllib_response.addinfourl(io.BytesIO(data), headers, url)
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
compat_basestring = basestring # Python 2
|
|
|
|
compat_basestring = basestring # Python 2
|
|
|
|
except NameError:
|
|
|
|
except NameError:
|
|
|
@ -489,6 +531,8 @@ __all__ = [
|
|
|
|
'compat_urllib_parse_unquote_to_bytes',
|
|
|
|
'compat_urllib_parse_unquote_to_bytes',
|
|
|
|
'compat_urllib_parse_urlparse',
|
|
|
|
'compat_urllib_parse_urlparse',
|
|
|
|
'compat_urllib_request',
|
|
|
|
'compat_urllib_request',
|
|
|
|
|
|
|
|
'compat_urllib_request_DataHandler',
|
|
|
|
|
|
|
|
'compat_urllib_response',
|
|
|
|
'compat_urlparse',
|
|
|
|
'compat_urlparse',
|
|
|
|
'compat_urlretrieve',
|
|
|
|
'compat_urlretrieve',
|
|
|
|
'compat_xml_parse_error',
|
|
|
|
'compat_xml_parse_error',
|
|
|
|