Skip to content

Instantly share code, notes, and snippets.

@binderclip
Created December 23, 2015 06:59
Show Gist options
  • Save binderclip/fdf680fa0728709b2fe4 to your computer and use it in GitHub Desktop.
Save binderclip/fdf680fa0728709b2fe4 to your computer and use it in GitHub Desktop.
写一个简单的 HTTP 代理服务器
#!/usr/bin/env python
# coding: utf-8
import socket
import sys
from thread import *
try:
listening_port = int(raw_input("[*] Enter Listening Port Number: "))
except KeyboardInterrupt:
print("\n[*] User Requested An Interrupt")
print("[*] Application Exiting ...")
sys.exit()
max_conn = 20
buffer_size = 8192
def proxy_server(webserver, port, conn, addr, data):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print(s)
s.connect((webserver, port))
print(s)
s.send(data)
print(s)
while 1:
# Read reply or data to from end web server
print('before recv')
reply = s.recv(buffer_size)
print('reply >>>', reply)
if (len(reply) > 0):
conn.send(reply) # Send reply back to client
# Send Notification To Proxy Server [ That's Us]
dar = float(len(reply))
dar = float(dar / 1024)
dar = "%.3s" % (str(dar))
dar = "%s KB" % (dar)
# Print A Custom Message For Request Complete
print("[*] Request Done: %s ==> %s <==" % (str(addr[0]), str(dar)))
else:
# break the connection if receiving data failed
break
# Feel Free To Close Our Server Sockets
s.close()
# Now that everthing is sent, We may now close our client sock
coon.close()
except socket.error, (value, message):
s.close()
conn.close()
sys.exit(1)
def conn_string(conn, data, addr):
# Client Browser Request Appears Here
print('Start Conn...')
try:
first_line = data.split('\n')[0]
url = first_line.split(' ')[1]
http_pos = url.find("://") # Find The Position of ://
if (http_pos == -1):
temp = url
else:
temp = url[(http_pos + 3):] # Get the rest of the url
port_pos = temp.find(":") # Find The Pos of the port (if any)
webserver_pos = temp.find("/") # Find the end of the web server
if webserver_pos == -1:
webserver_pos = len(temp)
webserver = ""
port = -1
if (port_pos == -1 or webserver_pos < port_pos):
# use default port
port = 80
webserver = temp[:webserver_pos]
else:
# use specific port
port = int((temp[(port_pos + 1):])[:webserver_pos - port_pos - 1])
webserver = temp[:port_pos]
print(webserver, port, conn, addr, data)
proxy_server(webserver, port, conn, addr, data)
except Exception:
pass
def start():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # Initiate Socket
s.bind(('127.0.0.1', listening_port)) # Bind Socket For Listen
s.listen(max_conn) # Start Listening For Incoming Connections
print("[*] Initializing Sockets ... Done")
print("[*] Sockets Binded Successfully ...")
print("[*] Server Started Successfully [ %d ]\n" % (listening_port))
except Exception:
print("[*] Unable To Initialize Socket")
sys.exit(2)
while 1:
try:
conn, addr = s.accept() # Accept Connection From Client Browser
data = conn.recv(buffer_size) # Receive Client Data
print(data)
start_new_thread(conn_string, (conn, data, addr)) # Start A Thread
except KeyboardInterrupt:
# Execute This Block If Client Socket Failed
s.close()
print("\n[*] Proxy Server Shutting Down ...")
print("[*] Hava A Nice Day ... Sergeant !!!")
sys.exit(1)
s.close()
if __name__ == '__main__':
start()
@binderclip
Copy link
Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment