Skip to content

Instantly share code, notes, and snippets.

@vilterp
Created January 20, 2009 00:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vilterp/49262 to your computer and use it in GitHub Desktop.
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.
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
print
print
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