Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
m0rtem
GitHub Repository: m0rtem/CloudFail
Path: blob/master/sockshandler.py
138 views
1
#!/usr/bin/env python
2
"""
3
SocksiPy + urllib2 handler
4
5
version: 0.3
6
author: e<[email protected]>
7
8
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...
9
"""
10
import ssl
11
12
try:
13
import urllib2
14
import httplib
15
except ImportError: # Python 3
16
import urllib.request as urllib2
17
import http.client as httplib
18
19
import socks # $ pip install PySocks
20
21
def merge_dict(a, b):
22
d = a.copy()
23
d.update(b)
24
return d
25
26
class SocksiPyConnection(httplib.HTTPConnection):
27
def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs):
28
self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
29
httplib.HTTPConnection.__init__(self, *args, **kwargs)
30
31
def connect(self):
32
self.sock = socks.socksocket()
33
self.sock.setproxy(*self.proxyargs)
34
if type(self.timeout) in (int, float):
35
self.sock.settimeout(self.timeout)
36
self.sock.connect((self.host, self.port))
37
38
class SocksiPyConnectionS(httplib.HTTPSConnection):
39
def __init__(self, proxytype, proxyaddr, proxyport=None, rdns=True, username=None, password=None, *args, **kwargs):
40
self.proxyargs = (proxytype, proxyaddr, proxyport, rdns, username, password)
41
httplib.HTTPSConnection.__init__(self, *args, **kwargs)
42
43
def connect(self):
44
sock = socks.socksocket()
45
sock.setproxy(*self.proxyargs)
46
if type(self.timeout) in (int, float):
47
sock.settimeout(self.timeout)
48
sock.connect((self.host, self.port))
49
self.sock = ssl.wrap_socket(sock, self.key_file, self.cert_file)
50
51
class SocksiPyHandler(urllib2.HTTPHandler, urllib2.HTTPSHandler):
52
def __init__(self, *args, **kwargs):
53
self.args = args
54
self.kw = kwargs
55
urllib2.HTTPHandler.__init__(self)
56
57
def http_open(self, req):
58
def build(host, port=None, timeout=0, **kwargs):
59
kw = merge_dict(self.kw, kwargs)
60
conn = SocksiPyConnection(*self.args, host=host, port=port, timeout=timeout, **kw)
61
return conn
62
return self.do_open(build, req)
63
64
def https_open(self, req):
65
def build(host, port=None, timeout=0, **kwargs):
66
kw = merge_dict(self.kw, kwargs)
67
conn = SocksiPyConnectionS(*self.args, host=host, port=port, timeout=timeout, **kw)
68
return conn
69
return self.do_open(build, req)
70
71
if __name__ == "__main__":
72
import sys
73
try:
74
port = int(sys.argv[1])
75
except (ValueError, IndexError):
76
port = 9050
77
opener = urllib2.build_opener(SocksiPyHandler(socks.PROXY_TYPE_SOCKS5, "localhost", port))
78
print("HTTP: " + opener.open("http://httpbin.org/ip").read().decode())
79
print("HTTPS: " + opener.open("https://httpbin.org/ip").read().decode())
80
81