Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 17 additions & 6 deletions socks.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import socket
import struct
import sys
import ipaddress

__version__ = "1.7.1"

Expand Down Expand Up @@ -111,7 +112,6 @@ class HTTPError(ProxyError):

DEFAULT_PORTS = {SOCKS4: 1080, SOCKS5: 1080, HTTP: 8080}


def set_default_proxy(proxy_type=None, addr=None, port=None, rdns=True,
username=None, password=None):
"""Sets a default proxy.
Expand Down Expand Up @@ -350,12 +350,23 @@ def bind(self, *pos, **kw):
self._proxyconn.connect(proxy)

UDP_ASSOCIATE = b"\x03"
_, relay = self._SOCKS5_request(self._proxyconn, UDP_ASSOCIATE, dst)
ret, relay = self._SOCKS5_request(self._proxyconn, UDP_ASSOCIATE, dst)

# The relay is most likely on the same host as the SOCKS proxy,
# but some proxies return a private IP address (10.x.y.z)
host, _ = proxy
_, port = relay
# check if returned ip address is private
bind_ip = relay[0]
use_bind_ip = True
try:
bind_ip_parsed = ipaddress.ip_address(bind_ip)
use_bind_ip = bind_ip_parsed.is_global
except ValueError:
use_bind_ip = False

# use IP returned by relay, if it's not private, otherwise use relay's address
if use_bind_ip:
host, port = relay
else:
host, _ = proxy
_, port = relay
super(socksocket, self).connect((host, port))
super(socksocket, self).settimeout(self._timeout)
self.proxy_sockname = ("0.0.0.0", 0) # Unknown
Expand Down