Created
January 20, 2009 00:45
-
-
Save vilterp/49262 to your computer and use it in GitHub Desktop.
attempt at a proxy server. Really slow, I think it has to be threaded or something to work right.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import socket | |
class Proxy: | |
serversock_port = 987654 | |
def __init__(self, host='localhost', port=1234, req_func=None, resp_func=None): | |
self.browsersock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
self.browsersock.bind((host,port)) | |
print 'listening %s:%d' % (host,port) | |
self.browsersock.listen(5) | |
if req_func is None: | |
self.request_function = lambda req: req | |
else: | |
self.request_function = req_func | |
if resp_func is None: | |
self.response_function = lambda resp: resp | |
else: | |
self.response_function = resp_func | |
def listen(self): | |
try: | |
while 1: | |
(connection, address) = self.browsersock.accept() | |
request = connection.recv(4096) | |
response = self.dorequest(request) | |
connection.sendall(response) | |
connection.close() | |
except KeyboardInterrupt: | |
self.browsersock.close() | |
print 'bye!' | |
def dorequest(self, request): | |
request = self.request_function(request) | |
serverhost = self.gethost(request) | |
serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
serversock.bind((socket.gethostname(),self.serversock_port)) | |
self.serversock_port += 1 | |
try: | |
serversock.connect((serverhost,80)) | |
serversock.sendall(request) | |
response = '' | |
done = False | |
while not done: | |
chunk = serversock.recv(4096) | |
print len(chunk) | |
if len(chunk) > 0: | |
response += chunk | |
else: | |
done = True | |
finally: | |
serversock.close() | |
return self.response_function(response) | |
def gethost(self, request): | |
lines = request.split('\n') | |
for line in lines: | |
if line.startswith('Host:') or line.startswith('host:'): | |
return line.split(':')[1].strip() | |
def req_func(request): | |
print '>>>>>>>>>>>>>>>>>>>> ' + request.split('\n')[0] | |
return request | |
def resp_func(response): | |
print response | |
return response | |
Proxy(port=1245,req_func=req_func,resp_func=resp_func).listen() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment