Browse Source

Update PySocks 1.7.0 (91dcdf0) → 1.7.1 (c2fa43c).

pull/1289/head
JackDandy 5 years ago
parent
commit
6a51df75c1
  1. 1
      CHANGES.md
  2. 6
      lib/socks/socks.py
  3. 54
      lib/socks/sockshandler.py

1
CHANGES.md

@ -8,6 +8,7 @@
* Update attr 19.2.0.dev0 (daf2bc8) to 20.1.0.dev0 (9b5e988)
* Update Certifi 2019.06.16 (84dc766) to 2019.11.28 (21abb9b)
* Update DiskCache library 4.0.0 (2c79bb9) to 4.1.0 (b0451e0)
* Update PySocks 1.7.0 (91dcdf0) to 1.7.1 (c2fa43c)
* Update Requests library 2.22.0 (3d968ff) to 2.22.0 (d2f65af)
* Update Six compatibility library 1.13.0 (ec58185) to 1.14.0 (3a3db75)

6
lib/socks/socks.py

@ -13,7 +13,7 @@ import socket
import struct
import sys
__version__ = "1.7.0"
__version__ = "1.7.1"
if os.name == "nt" and sys.version_info < (3, 0):
@ -199,7 +199,7 @@ def create_connection(dest_pair,
sock.connect((remote_host, remote_port))
return sock
except (socket.error, ProxyConnectionError) as e:
except (socket.error, ProxyError) as e:
err = e
if sock:
sock.close()
@ -844,4 +844,4 @@ class socksocket(_BaseSocket):
proxy_port = proxy_port or DEFAULT_PORTS.get(proxy_type)
if not proxy_port:
raise GeneralProxyError("Invalid proxy type")
return proxy_addr, proxy_port
return proxy_addr, proxy_port

54
lib/socks/sockshandler.py

@ -7,6 +7,7 @@ author: e<e@tr0ll.in>
This module provides a Handler which you can use with urllib2 to allow it to tunnel your connection through a socks.sockssocket socket, with out monkey patching the original socket...
"""
import socket
import ssl
try:
@ -23,17 +24,45 @@ def merge_dict(a, b):
d.update(b)
return d
def is_ip(s):
try:
if ':' in s:
socket.inet_pton(socket.AF_INET6, s)
elif '.' in s:
socket.inet_aton(s)
else:
return False
except:
return False
else:
return True
socks4_no_rdns = set()
class SocksiPyConnection(httplib.HTTPConnection):
def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs):
self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
httplib.HTTPConnection.__init__(self, *args, **kwargs)
def connect(self):
self.sock = socks.socksocket()
self.sock.setproxy(*self.proxyargs)
if type(self.timeout) in (int, float):
self.sock.settimeout(self.timeout)
self.sock.connect((self.host, self.port))
(proxytype, proxyaddr, proxyport, rdns, username, password) = self.proxyargs
rdns = rdns and proxyaddr not in socks4_no_rdns
while True:
try:
sock = socks.create_connection(
(self.host, self.port), self.timeout, None,
proxytype, proxyaddr, proxyport, rdns, username, password,
((socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),))
break
except socks.SOCKS4Error as e:
if rdns and "0x5b" in str(e) and not is_ip(self.host):
# Maybe a SOCKS4 server that doesn't support remote resolving
# Let's try again
rdns = False
socks4_no_rdns.add(proxyaddr)
else:
raise
self.sock = sock
class SocksiPyConnectionS(httplib.HTTPSConnection):
def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs):
@ -41,12 +70,15 @@ class SocksiPyConnectionS(httplib.HTTPSConnection):
httplib.HTTPSConnection.__init__(self, *args, **kwargs)
def connect(self):
sock = socks.socksocket()
sock.setproxy(*self.proxyargs)
if type(self.timeout) in (int, float):
sock.settimeout(self.timeout)
sock.connect((self.host, self.port))
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
SocksiPyConnection.connect(self)
self.sock = self._context.wrap_socket(self.sock, server_hostname=self.host)
if not self._context.check_hostname and self._check_hostname:
try:
ssl.match_hostname(self.sock.getpeercert(), self.host)
except Exception:
self.sock.shutdown(socket.SHUT_RDWR)
self.sock.close()
raise
class SocksiPyHandler(urllib2.HTTPHandler, urllib2.HTTPSHandler):
def __init__(self, *args, **kwargs):

Loading…
Cancel
Save