1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #! /usr/bin/python
import os, sys, socket, re
num_port = 1712
regexp_reqnav = re.compile(r".*(GET|POST) (http|https|ftp)://([\w\.\-_]+):?(\d*)(/.*) (HTTP/\d\.\d)(.*)", re.DOTALL)
# creation de la socket de type serveur du proxy
ma_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
ma_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
ma_socket.bind(('',num_port))
ma_socket.listen(socket.SOMAXCONN)
while 1:
(nll_conn,depuis) = ma_socket.accept()
# reception et decomposition de la requete du navigateur
data = nll_conn.recv(1024)
print("NEW DATA :\n" +data)
res = regexp_reqnav.search(data)
if not res :
print("erreur regexp !")
sys.exit(1)
type_req = res.group(1)
serv_req = res.group(3)
port_req = res.group(4) or 80
rep_req = res.group(5)
vers_req = res.group(6)
opt_req = res.group(7)
print("Requete recue :")
print(type_req + " " + serv_req + ":" + str(port_req) + " " + rep_req + " " + vers_req + opt_req)
pid = os.fork()
if not pid :
# fils
# creation de la socket de type client du proxy
sock_req = socket.socket(socket.AF_INET, socket.SOCK_STREAM, socket.IPPROTO_TCP)
# connexion vers le serveur web
try: sock_req.connect((serv_req,port_req))
except Exception, msg:
print("Connexion vers "+serv_req+" : FAILED ! "+str(msg))
print("Connexion vers "+serv_req+" : OK !")
# envoi de la requete http
req = type_req + " " + rep_req + " " + vers_req + opt_req + "\r\n\r\n"
print("Envoie de la requete :")
print(req)
sock_req.sendall(req)
# reception de la reponse http
while 1:
rep = sock_req.recv(1024)
if not rep: break
nll_conn.sendall(rep)
sock_req.close()
sys.exit(0)
else:
# pere
nll_conn.close() |
Partager