|
|
|
@ -651,6 +651,26 @@ class YoutubeDLHandler(compat_urllib_request.HTTPHandler):
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
def http_request(self, req):
|
|
|
|
|
# According to RFC 3986, URLs can not contain non-ASCII characters, however this is not
|
|
|
|
|
# always respected by websites, some tend to give out URLs with non percent-encoded
|
|
|
|
|
# non-ASCII characters (see telemb.py, ard.py [#3412])
|
|
|
|
|
# urllib chokes on URLs with non-ASCII characters (see http://bugs.python.org/issue3991)
|
|
|
|
|
# To work around aforementioned issue we will replace request's original URL with
|
|
|
|
|
# percent-encoded one
|
|
|
|
|
# Since redirects are also affected (e.g. http://www.southpark.de/alle-episoden/s18e09)
|
|
|
|
|
# the code of this workaround has been moved here from YoutubeDL.urlopen()
|
|
|
|
|
url = req.get_full_url()
|
|
|
|
|
url_escaped = escape_url(url)
|
|
|
|
|
|
|
|
|
|
# Substitute URL if any change after escaping
|
|
|
|
|
if url != url_escaped:
|
|
|
|
|
req_type = HEADRequest if req.get_method() == 'HEAD' else compat_urllib_request.Request
|
|
|
|
|
new_req = req_type(
|
|
|
|
|
url_escaped, data=req.data, headers=req.headers,
|
|
|
|
|
origin_req_host=req.origin_req_host, unverifiable=req.unverifiable)
|
|
|
|
|
new_req.timeout = req.timeout
|
|
|
|
|
req = new_req
|
|
|
|
|
|
|
|
|
|
for h, v in std_headers.items():
|
|
|
|
|
# Capitalize is needed because of Python bug 2275: http://bugs.python.org/issue2275
|
|
|
|
|
# The dict keys are capitalized because of this bug by urllib
|
|
|
|
|