Skip to content

Instantly share code, notes, and snippets.

@brandond
Last active December 27, 2016 11:37
Show Gist options
  • Save brandond/5830fe45d7b4fe192713b1000b87f99c to your computer and use it in GitHub Desktop.
Save brandond/5830fe45d7b4fe192713b1000b87f99c to your computer and use it in GitHub Desktop.
Improved Python monkeypatching for SOCKS proxy support
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