From 0150fae81c3ee2a12fb41190cbe97a7e90a8ec13 Mon Sep 17 00:00:00 2001 From: tunip3 <26260613+tunip3@users.noreply.github.com> Date: Sun, 10 Mar 2019 23:03:13 +0000 Subject: [PATCH] Add files via upload --- proxy3.py | 149 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 proxy3.py diff --git a/proxy3.py b/proxy3.py new file mode 100644 index 0000000..f418874 --- /dev/null +++ b/proxy3.py @@ -0,0 +1,149 @@ +#**************************************************** +# * +# HTTP PROXY * +# Version: 1.0 * +# Author: Luu Gia Thuy * +# * +#**************************************************** + +import os,sys,socket,time +import _thread as thread + +#********* CONSTANT VARIABLES ********* +BACKLOG = 50 # how many pending connections queue will hold +MAX_DATA_RECV = 999999 # max number of bytes we receive at once +DEBUG = True # set to True to see the debug msgs +BLOCKED = [] # just an example. Remove with [""] for no blocking at all. + +#************************************** +#********* MAIN PROGRAM *************** +#************************************** +def main(): + + # check the length of command running + if (len(sys.argv)<2): + print ("No port given, using :8080 (http-alt)") + port = 8080 + else: + port = int(sys.argv[1]) # port from argument + + # host and port info. + host = '' # blank for localhost + + print ("Proxy Server Running on ",host,":",port) + + try: + # create a socket + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + + # associate the socket to host and port + s.bind((host, port)) + + # listenning + s.listen(BACKLOG) + + except (socket.error, (value, message)): + if s: + s.close() + print ("Could not open socket:", message) + sys.exit(1) + + # get the connection from client + while 1: + conn, client_addr = s.accept() + + # create a thread to handle request + thread.start_new_thread(proxy_thread, (conn, client_addr)) + + s.close() +#************** END MAIN PROGRAM *************** + +def printout(type,request,address): + if "Block" in type or "Blacklist" in type: + colornum = 91 + elif "Request" in type: + colornum = 92 + elif "Reset" in type: + colornum = 93 + + print ("\033[",colornum,"m",address[0],"\t",type,"\t",request,"\033[0m") + +#******************************************* +#********* PROXY_THREAD FUNC *************** +# A thread to handle request from browser +#******************************************* +def proxy_thread(conn, client_addr): + + # get the request from browser + request = conn.recv(MAX_DATA_RECV) + + # parse the first line + first_line = request.split(b'\n')[0] + + # get url + url = first_line.split(b' ')[1] + + for i in range(0,len(BLOCKED)): + if BLOCKED[i] in url: + printout("Blacklisted",first_line,client_addr) + conn.close() + sys.exit(1) + + + printout("Request",first_line,client_addr) + # print "URL:",url + # print + + # find the webserver and port + http_pos = url.find(b'://') # find pos of :// + if (http_pos==-1): + temp = url + else: + temp = url[(http_pos+3):] # get the rest of url + + port_pos = temp.find(b':') # find the port pos (if any) + + # find end of web server + webserver_pos = temp.find(b'/') + if webserver_pos == -1: + webserver_pos = len(temp) + + webserver = "" + port = -1 + if (port_pos==-1 or webserver_pos < port_pos): # default port + port = 80 + webserver = temp[:webserver_pos] + else: # specific port + port = int((temp[(port_pos+1):])[:webserver_pos-port_pos-1]) + webserver = temp[:port_pos] + + try: + # create a socket to connect to the web server + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((webserver, port)) + s.send(request) # send request to webserver + + while 1: + # receive data from web server + data = s.recv(MAX_DATA_RECV) + + if (len(data) > 0): + # send to browser + conn.send(data) + else: + break + s.close() + conn.close() + except (socket.error): + if s: + s.close() + if conn: + conn.close() + printout("Peer Reset",first_line,client_addr) + sys.exit(1) +#********** END PROXY_THREAD *********** + +if __name__ == '__main__': + main() + +