[utils] Percent-encode redirect URL of Location header (Closes #6457)
authorSergey M․ <dstftw@gmail.com>
Thu, 6 Aug 2015 19:26:40 +0000 (01:26 +0600)
committerSergey M․ <dstftw@gmail.com>
Thu, 6 Aug 2015 19:26:40 +0000 (01:26 +0600)
youtube_dl/utils.py

index c7db75f80b5a544a0893fb11a371a682fee98e41..e265c75742b6d22647965e6a0261f24bb4a73a00 100644 (file)
@@ -715,6 +715,17 @@ class YoutubeDLHandler(compat_urllib_request.HTTPHandler):
             gz = io.BytesIO(self.deflate(resp.read()))
             resp = self.addinfourl_wrapper(gz, old_resp.headers, old_resp.url, old_resp.code)
             resp.msg = old_resp.msg
+        # Percent-encode redirect URL of Location HTTP header to satisfy RFC 3986
+        if 300 <= resp.code < 400:
+            location = resp.headers.get('Location')
+            if location:
+                # As of RFC 2616 default charset is iso-8859-1 that is respected by python 3
+                if sys.version_info >= (3, 0):
+                    location = location.encode('iso-8859-1').decode('utf-8')
+                location_escaped = escape_url(location)
+                if location != location_escaped:
+                    del resp.headers['Location']
+                    resp.headers['Location'] = location_escaped
         return resp
 
     https_request = http_request