Last active
May 18, 2018 10:14
-
-
Save nenodias/3e5ed44e8672d4e79f47 to your computer and use it in GitHub Desktop.
Python Forwarding Proxy
This file contains hidden or 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
# *-* coding: utf-8 *-* | |
import socket, sys | |
import threading | |
def tratando_host(host_proxy): | |
host_proxy = host_proxy.replace("Host: ", "") | |
index_prota_proxy = host_proxy.find(":") | |
port_proxy = host_proxy[index_prota_proxy:].replace(":","").replace("\r\n","") if index_prota_proxy != -1 else 80 | |
port_proxy = int(port_proxy) | |
return (host_proxy, port_proxy) | |
def tratativa_data(data, webserver, port): | |
comeco = data[data.find("\r\n")+2:] | |
host_proxy = comeco[:comeco.find("\r\n")+2] | |
host_novo = "Host: " | |
if port != 80: | |
host_novo += webserver + ":" + str(port) | |
else: | |
host_novo += webserver | |
host_novo += "\r\n" | |
addr_proxy = tratando_host(host_proxy) | |
return (data.replace(host_proxy, host_novo), addr_proxy) | |
def tratativa_retornodata(data, webserver): | |
location = data[data.find("Location:"):] | |
location = location[:location.find("\r\n")] | |
location = location[location.find('http://'):] | |
host_novo = "Location: http://" | |
host_novo += webserver.replace("\r\n", "") | |
host_novo += location[7:][ (location[7:].find('/')) :] | |
return data.replace(location, host_novo) | |
def proxy_server(webserver, port, conn, addr, data): | |
try: | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.connect((webserver, port)) | |
data, addr_proxy = tratativa_data(data, webserver, port) | |
print("Dados:",data) | |
print("Para:",webserver) | |
s.send(data) | |
while True: | |
reply = s.recv(buffer_size) | |
if len(reply) > 0: | |
# falta tratar o retorno pelo proxy | |
reply = tratativa_retornodata(reply, addr_proxy[0]) | |
conn.send(reply) | |
dar = float(len(reply)) | |
dar = float(dar / 1024.0) | |
dar = "%.3s" %( str(dar) ) | |
dar = "%s KB" %( dar) | |
print("[*] Request Done: %s => %s <= " %( str(addr[0] ) , str(dar) ) ) | |
else: | |
break | |
s.close() | |
conn.close() | |
except socket.error as e: | |
print("Erro no proxy_server") | |
print(e) | |
s.close() | |
conn.close() | |
sys.exit(1) | |
class Connexao(threading.Thread): | |
def __init__(self, conn, data, addr): | |
threading.Thread.__init__(self) | |
self.conn = conn | |
self.data = data | |
self.addr = addr | |
def run(self): | |
conn = self.conn | |
data = self.data | |
addr = self.addr | |
try: | |
first_line = data.split("\n")[0] | |
url = first_line.split(" ")[1] | |
http_pos = url.find("://") | |
if http_pos == -1: | |
temp = url | |
else: | |
temp = url[(http_pos+3):] | |
port_pos = temp.find(":") | |
webserver_pos = temp.find("/") | |
if webserver_pos == -1: | |
webserver_pos = len(temp) | |
webserver = "" | |
port = -1 | |
if port_pos == -1 or webserver_pos < port_pos: | |
port = 80 | |
webserver = temp[:webserver_pos] | |
else: | |
port = int ( ( temp[ ( port_pos + 1 ) :]) [:webserver_pos - port_pos -1 ] ) | |
webserver = temp[:port_pos] | |
webserver = "www.google.com" | |
port = 80 | |
proxy_server(webserver, port, conn, addr, data) | |
except Exception as e: | |
print("Erro no run") | |
print(e) | |
conn.close() | |
pass | |
def start(): | |
try: | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.bind(('', listening_port)) | |
s.listen(max_conn) | |
print("[*] Initializing Sockets ...Done") | |
print("[*] Sockets Binded Succefully ...") | |
print("[*] Sockets Started Succefully [%d]\n"%(listening_port)) | |
except Exception: | |
print("[*] Unable to Initialize Socket") | |
sys.exit(2) | |
while True: | |
try: | |
conn, addr = s.accept() | |
data = conn.recv(buffer_size) | |
conexao = Connexao(conn, data, addr) | |
conexao.run() | |
except KeyboardInterrupt: | |
print("\n[*] Proxy Server is Shuting Down ...") | |
s.close() | |
sys.exit(1) | |
try: | |
listening_port = int(input("[*] Enter Listening Port Number: ")) | |
except KeyboardInterrupt: | |
print("\n[*] User registration An Interrupt") | |
print("[*] Application Exiting") | |
sys.exit() | |
max_conn = 5 | |
buffer_size = 8129 | |
start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment