Last active
December 27, 2016 11:37
-
-
Save brandond/5830fe45d7b4fe192713b1000b87f99c to your computer and use it in GitHub Desktop.
Improved Python monkeypatching for SOCKS proxy support
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import logging | |
from functools import wraps | |
from urlparse import urlparse | |
logger = logging.getLogger(__name__) | |
def socket_to_socks(module): | |
try: | |
import socks | |
except ImportError: | |
logger.info('Not monkeypatching {0} for socks support: socks import failed.'.format(module.__name__)) | |
return | |
if not getattr(module, 'socket', False): | |
logger.info('Not monkeypatching {0} for socks support: modules does not import socket.'.format(module.__name__)) | |
return | |
logger.info('Monkeypatching {0} for socks support.'.format(module.__name__)) | |
if 'http_proxy' in os.environ: | |
try: | |
proxy = urlparse(os.environ['http_proxy']) | |
socks.set_default_proxy(socks.PROXY_TYPES[proxy.scheme.upper()], addr=proxy.hostname, port=proxy.port, rdns=True, username=proxy.username, password=proxy.password) | |
except: | |
pass | |
def with_default_proxy(func): | |
if getattr(func, 'is_wrapped', False): | |
return func | |
@wraps(func) | |
def wrapper(dest_pair, timeout=None, source_address=None, | |
proxy_type=None, proxy_addr=None, | |
proxy_port=None, proxy_rdns=True, | |
proxy_username=None, proxy_password=None, | |
socket_options=None): | |
proxy = socks.get_default_proxy() | |
if proxy: | |
(proxy_type, proxy_addr, proxy_port, proxy_rdns, proxy_username, proxy_password) = proxy | |
return func(dest_pair, proxy_type, proxy_addr, | |
proxy_port, proxy_rdns, | |
proxy_username, proxy_password, | |
timeout, source_address, | |
socket_options) | |
setattr(wrapper, 'is_wrapped', True) | |
return wrapper | |
socks.create_connection = with_default_proxy(socks.create_connection) | |
module.socket = socks |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment