#!/usr/bin/python from asyncore import dispatcher, loop, ExitNow from socket import * import socket recvsize = 63*1024 class http_proxy(dispatcher): def __init__(self, proxy_port): dispatcher.__init__(self) self.create_socket(AF_INET, SOCK_STREAM) self.set_reuse_addr() self.bind(("", proxy_port)) self.listen(10) def handle_accept(self): sock, addr = self.accept() # print "accepted ", sock, " from ", addr client_socket(sock) class client_socket(dispatcher): def __init__(self, sock): dispatcher.__init__(self, sock) self.request = "" self.reply = "" self.close_after_reply = 0 self.server_socket = None def handle_read(self): try: self.request = self.request + self.recv(recvsize) if self.request[-4:] == "\r\n\r\n": # print "got request" self.server_socket = server_socket(self, self.request) except socket.error: self.abort() def writable(self): return len(self.reply) > 0 def handle_write(self): try: sent = self.send(self.reply) self.reply = self.reply[sent:] if len(self.reply) == 0 and self.close_after_reply: self.close() except socket.error: self.abort() def handle_close(self): # print "client closed" if self.server_socket: self.server_socket.client_closing() self.close() def forward_data(self, data): self.reply = self.reply + data def server_closing(self): if len(self.reply) == 0: self.close() else: self.close_after_reply = 1 def abort(self): # print "abort, abort!" if self.server_socket: self.server_socket.server_closing() self.close() class server_socket(dispatcher): def __init__(self, client_socket, request): dispatcher.__init__(self) self.client_socket = client_socket self.request = request method, url, version = request.split("\r\n", 1)[0].split(" ", 3) host = url.split("/")[2] if host == "quit": raise ExitNow() try: host, port = host.split(":") port = int(port) except ValueError: port = 80 # print "host:", host, "port:", port self.create_socket(AF_INET, SOCK_STREAM) try: self.connect((host, port)) except socket.error: self.abort() def writable(self): return len(self.request) > 0 def handle_connect(self): # print "connected to remote server" pass def handle_write(self): try: sent = self.send(self.request) self.request = self.request[sent:] except socket.error: self.abort() def handle_read(self): try: data = self.recv(recvsize) self.client_socket.forward_data(data) except socket.error: self.abort() def handle_close(self): # print "server closed" self.client_socket.server_closing() self.close() def client_closing(self): self.close() def abort(self): # print "abort, abort!" self.client_socket.server_closing() self.close() http_proxy(7999) try: loop() except ExitNow: pass