#!/usr/bin/python # A generic proxy server # usage: proxy.py listenport targethost targetport # Example: proxy.py 7777 www.cnn.com 80 import select, socket, SocketServer, string, sys listenport= string.atoi(sys.argv[1]) targethost= sys.argv[2] targetport= string.atoi(sys.argv[3]) class Handler(SocketServer.BaseRequestHandler): def fromclient_callback(self, text, target_socket): #print "From client" #print text target_socket.send(text) # pass it along def fromserver_callback(self, text, client_socket): #print "From server" #print text client_socket.send(text) # pass it along def handle(self): # Override of SocketServer.BaseRequestHandler.handle() #print "Handle..." self.request.setblocking(0) target_socket= socket.socket(socket.AF_INET, socket.SOCK_STREAM) target_socket.connect((targethost, targetport)) closing= 0 select_list= [self.request, target_socket] while 1: # Keep looping until one of the connections gets closed from other end ready_to_read, ready_to_write, in_error = select.select( select_list, [], select_list, 15000) for s in ready_to_read: if s== self.request: try: fromclient= self.request.recv(999999) self.fromclient_callback(fromclient, target_socket) except socket.error, msg: in_error.append(s) # so we'll process as error below if s== target_socket: try: fromserver= target_socket.recv(999999) self.fromserver_callback(fromserver, self.request) except socket.error, msg: in_error.append(s) # so we'll process as error below for s in in_error: #print "Closing..." s.close() if len(in_error)> 0: #print "...Handle" return server= SocketServer.TCPServer(('127.0.0.1',listenport), Handler) server.serve_forever()