流量转发HTTP、HTTPS
2025-04-22
流量转发HTTP、HTTPS
import socket
import threading
import select
LISTEN_HOST = '0.0.0.0'
LISTEN_PORT = 8080 # 建议避开 80,用 8080、8888 更通用
def handle(client_socket):
try:
request_line = client_socket.recv(4096).split(b'\n')[0]
if not request_line:
client_socket.close()
return
method, url, _ = request_line.decode(errors='ignore').split()
if method == 'CONNECT':
target_host, target_port = url.split(':')
target_port = int(target_port)
remote = socket.create_connection((target_host, target_port))
client_socket.sendall(b"HTTP/1.1 200 Connection Established\r\n\r\n")
else:
from urllib.parse import urlparse
parsed = urlparse(url)
target_host = parsed.hostname
target_port = parsed.port or 80
remote = socket.create_connection((target_host, target_port))
remote.sendall(request_line + b'\r\n')
exchange(client_socket, remote)
except:
client_socket.close()
def exchange(sock1, sock2):
sockets = [sock1, sock2]
try:
while True:
r, _, _ = select.select(sockets, [], [])
for s in r:
data = s.recv(8192)
if not data:
return
if s == sock1:
sock2.sendall(data)
else:
sock1.sendall(data)
finally:
sock1.close()
sock2.close()
def start():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((LISTEN_HOST, LISTEN_PORT))
s.listen(128)
print(f"HTTP Proxy Running on {LISTEN_HOST}:{LISTEN_PORT}")
while True:
client, _ = s.accept()
threading.Thread(target=handle, args=(client,), daemon=True).start()
if __name__ == '__main__':
start()
发表评论: