Created
March 26, 2019 15:55
-
-
Save Scorpia10x/a6bf7b2077cee926de13f3f2771336cb to your computer and use it in GitHub Desktop.
This file contains 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
import os,sys,thread,socket | |
#********* 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 = 3128 | |
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('\n')[0] | |
# get url | |
url = first_line.split(' ')[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 | |
# find the webserver and port | |
http_pos = url.find("://") # find pos of :// | |
if (http_pos==-1): | |
temp = url | |
else: | |
temp = url[(http_pos+3):] # get the rest of url | |
port_pos = temp.find(":") # find the port pos (if any) | |
# find end of web server | |
webserver_pos = temp.find("/") | |
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, (value, message): | |
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() | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment