Skip to content

Commit

Permalink
Update Proxy_server.py
Browse files Browse the repository at this point in the history
Proxy Server Implementation in Python

This repository contains a simple proxy server implemented in Python. The proxy server acts as an intermediary between clients and web servers, forwarding requests and responses. It supports basic HTTP proxy functionality and can be configured to listen on a specific port.

Features:
Port Configuration: Easily configure the listening port for the proxy server.
HTTP Proxy: Handles basic HTTP requests and responses.
Dynamic URL Parsing: Parses URLs dynamically to determine the target web server and port.
  • Loading branch information
Ime22nemouhoubi committed Dec 4, 2023
1 parent 356f4e1 commit 1d2eaa1
Showing 1 changed file with 88 additions and 0 deletions.
88 changes: 88 additions & 0 deletions Proxy_server.py
Original file line number Diff line number Diff line change
@@ -1 +1,89 @@
import socket
import sys
import _thread
import traceback

def main():
global listen_port, buffer_size, max_conn
try:
listen_port = int(input("Enter a listening port: "))
except KeyboardInterrupt:
sys.exit(0)

max_conn = 10000
buffer_size = 8192 # Adjusted buffer size for better performance
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(("127.0.0.1", listen_port))
s.listen(max_conn)
print("[*] Initializing socket. Done.")
print("[*] Socket bound successfully...")
print("[*] Server started successfully [{}]".format(listen_port))
except Exception as e:
print(e)
sys.exit(2)

while True:
try:
conn, addr = s.accept()
data = conn.recv(buffer_size)
_thread.start_new_thread(conn_string, (conn, data, addr))
except KeyboardInterrupt:
s.close()
print("\n[*] Shutting down...")
sys.exit(1)
s.close()

def conn_string(conn, data, addr):
try:
print(addr)
first_line = data.decode('latin-1').split("\n")[0]
print(first_line)
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]

print(webserver)
proxy_server(webserver, port, conn, data, addr)
except Exception as e:
print(e)
traceback.print_exc()

def proxy_server(webserver, port, conn, data, addr):
print(" {} {} {} {}".format(webserver, port, conn, addr))
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((webserver, port))
s.sendall(data) # Use sendall to ensure all data is sent
while True:
reply = s.recv(buffer_size)
if not reply:
break
conn.sendall(reply) # Use sendall to ensure all data is sent
except Exception as e:
print(e)
traceback.print_exc()
finally:
s.close()

if __name__ == "__main__":
main()

0 comments on commit 1d2eaa1

Please sign in to comment.