From a7a05acc71a3c0cdc78468170b0af4afb81ec565 Mon Sep 17 00:00:00 2001 From: yvesf Date: Thu, 11 Mar 2010 16:42:56 +0100 Subject: cleanup, still missing the relevant feature --- proxy.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) (limited to 'proxy.py') diff --git a/proxy.py b/proxy.py index b721134..585b58b 100644 --- a/proxy.py +++ b/proxy.py @@ -1,7 +1,6 @@ #!/usr/bin/python -t +import pwd, os, sys, logging, logging.handlers, string import asynchat, asyncore, socket, httplib, urlparse -import pwd, os, sys, logging, logging.handlers -import string try: import cStringIO as StringIO except ImportError: @@ -9,10 +8,12 @@ except ImportError: endpoints = { - {'host':'10.1.0.1', 'port':'8080', 'speed':220, 'name':'Yves Proxy'}, - {'host':'10.3.0.99', 'port':'8080', 'speed':340, 'name':'Thomas Proxy'}, + {'host':'10.1.0.1', 'port':8080, 'speed':220, 'name':'Proxy 10.1'}, + {'host':'10.2.2.11', 'port':8081, 'speed':340, 'name':'Proxy 10.2'}, + {'host':'10.3.0.99', 'port':8080, 'speed':340, 'name':'Proxy 10.3'}, } + class HTTPResponseProducer(object): def __init__(self, resp, amt=512): self.resp = resp @@ -27,7 +28,6 @@ class HTTPChannel(asynchat.async_chat): self.set_terminator("\r\n\r\n") self.request = None self.data = StringIO.StringIO() - self.shutdown = 0 def collect_incoming_data(self, data): self.data.write(data) @@ -64,8 +64,9 @@ class HTTPProxyServer(asyncore.dispatcher): def handle_request(self, channel, method, path): url = urlparse.urlparse(path) print method, path - if method != "GET": - return self._do_standard_proxy(channel, method, url) + if method != "GET" or url.query != "": + #do not handle non-GET or GET with Query (?foo=bla) requests + return self._bypass_request(channel, method, url) #check for content-length header with a HEAD request conn = httplib.HTTPConnection(url.hostname, url.port or 80) @@ -73,18 +74,29 @@ class HTTPProxyServer(asyncore.dispatcher): resp = conn.getresponse() content_length = filter(lambda it: it[0] == "content-length", resp.getheaders()) if len( content_length ) == 0: - return self._do_standard_proxy(channel, method, url) + # no content length given, bypass this request + return self._bypass_request(channel, method, url) else: content_length = content_length[0][1] + if content_length < 524288: + # do not handle requests smaller than 512kb + return self._bypass_request(channel, method, url) + print "Content-Length: %s" % (content_length) - return self._do_standard_proxy(channel, method, url) + # XXX an dieser stelle muss de request aufgeteilt werden + return self._bypass_request(channel, method, url) #print "do some magic for " +str(url) #channel.push("HTTP/1.0 200 OK\r\nX-Proxy: Magicproxy (request handled in boost mode)\r\n") #channel.close_when_done() - def _do_standard_proxy(self, channel, method, url): + def _bypass_request(self, channel, method, url): + #XXX hier sollte nicht proxy gespielt werden sondern + #die daten 1-zu-1 durchgereicht werden. + #Weiterhin sollte sichergestellt werden, dass die requests + #zu Host X1 immer über Proxy Y1 geroutet werden + # etwa proxy=proxies[ stuff(hostname) % len(proxies) ] conn = httplib.HTTPConnection(url.hostname, url.port or 80) conn.request(method, url.path) resp = conn.getresponse() @@ -92,6 +104,7 @@ class HTTPProxyServer(asyncore.dispatcher): channel.push( "\r\n".join(map(lambda k: "%s: %s" % (k[0],k[1]), resp.getheaders())) ) channel.push("\r\n\r\n") channel.push_with_producer( HTTPResponseProducer(resp) ) + channel.close_when_done() if __name__ == "__main__": proxy = HTTPProxyServer() -- cgit v1.2.1