Browse Source

[utils] Register SOCKS protocols in urllib and support SOCKS4A

Yen Chi Hsuan 9 years ago
parent
commit
51fb4995a5
2 changed files with 13 additions and 1 deletions
  1. 3 0
      youtube_dl/YoutubeDL.py
  2. 10 1
      youtube_dl/utils.py

+ 3 - 0
youtube_dl/YoutubeDL.py

@@ -64,6 +64,7 @@ from .utils import (
     PostProcessingError,
     PostProcessingError,
     preferredencoding,
     preferredencoding,
     prepend_extension,
     prepend_extension,
+    register_socks_protocols,
     render_table,
     render_table,
     replace_extension,
     replace_extension,
     SameFileError,
     SameFileError,
@@ -361,6 +362,8 @@ class YoutubeDL(object):
         for ph in self.params.get('progress_hooks', []):
         for ph in self.params.get('progress_hooks', []):
             self.add_progress_hook(ph)
             self.add_progress_hook(ph)
 
 
+        register_socks_protocols()
+
     def warn_if_short_id(self, argv):
     def warn_if_short_id(self, argv):
         # short YouTube ID starting with dash?
         # short YouTube ID starting with dash?
         idxs = [
         idxs = [

+ 10 - 1
youtube_dl/utils.py

@@ -61,6 +61,13 @@ from .socks import (
 )
 )
 
 
 
 
+def register_socks_protocols():
+    # "Register" SOCKS protocols
+    for scheme in ('socks', 'socks4', 'socks4a', 'socks5'):
+        if scheme not in compat_urlparse.uses_netloc:
+            compat_urlparse.uses_netloc.append(scheme)
+
+
 # This is not clearly defined otherwise
 # This is not clearly defined otherwise
 compiled_regex_type = type(re.compile(''))
 compiled_regex_type = type(re.compile(''))
 
 
@@ -870,6 +877,8 @@ def make_socks_conn_class(base_class, socks_proxy):
         socks_type = ProxyType.SOCKS5
         socks_type = ProxyType.SOCKS5
     elif url_components.scheme.lower() in ('socks', 'socks4'):
     elif url_components.scheme.lower() in ('socks', 'socks4'):
         socks_type = ProxyType.SOCKS4
         socks_type = ProxyType.SOCKS4
+    elif url_components.scheme.lower() == 'socks4a':
+        socks_type = ProxyType.SOCKS4A
 
 
     proxy_args = (
     proxy_args = (
         socks_type,
         socks_type,
@@ -2738,7 +2747,7 @@ class PerRequestProxyHandler(compat_urllib_request.ProxyHandler):
 
 
         if proxy == '__noproxy__':
         if proxy == '__noproxy__':
             return None  # No Proxy
             return None  # No Proxy
-        if compat_urlparse.urlparse(proxy).scheme.lower() in ('socks', 'socks4', 'socks5'):
+        if compat_urlparse.urlparse(proxy).scheme.lower() in ('socks', 'socks4', 'socks4a', 'socks5'):
             req.add_header('Ytdl-socks-proxy', proxy)
             req.add_header('Ytdl-socks-proxy', proxy)
             # youtube-dl's http/https handlers do wrapping the socket with socks
             # youtube-dl's http/https handlers do wrapping the socket with socks
             return None
             return None