move example to different port
[multitaskhttpd.git] / ProxyServer.py
index 15380f6a0d3131da968b9bd7b55dd827ffdbce66..4816cdc37c1d27a2cb44063ca29969ebf9300d48 100644 (file)
@@ -121,6 +121,7 @@ class ProxyServerRequestHandler(object):
 
     """
 
+    debuglevel = 0
     server_version = "SimpleHTTP/" + __version__
 
     def on_query(self, client, reqtype, *args):
@@ -128,7 +129,9 @@ class ProxyServerRequestHandler(object):
 
         self.client = client
         self.hr = args[0]
-        print "on_query", reqtype, repr(self.hr.headers), str(self.hr.headers)
+        if self.debuglevel > 0:
+            print "on_query", reqtype, repr(self.hr.headers), \
+                              str(self.hr.headers)
         session = self.client.session 
         p = self.proxies.get(session, None)
         if not p:
@@ -136,31 +139,33 @@ class ProxyServerRequestHandler(object):
             proxy.connect()
             self.proxies[session] = proxy
 
-        multitask.add(self.proxy_relay(reqtype))
+        yield self.proxy_relay(reqtype)
 
-        return True
+        #while p.serving:
+        #    (yield multitask.sleep(0.01))
+
+        raise StopIteration
 
     def onPOST(self, client, *args):
         """Serve a POST request."""
-        return self.on_query(client, "POST", *args)
+        yield self.on_query(client, "POST", *args)
 
     def onGET(self, client, *args):
         """Serve a GET request."""
-        return self.on_query(client, "GET", *args)
+        yield self.on_query(client, "GET", *args)
 
     def proxy_relay(self, reqtype):
 
         session = self.client.session 
         p = self.proxies[session]
 
-        #while p.serving:
-        #    (yield multitask.sleep(0.01))
         p.serving = True
 
         try:
             # send command
             req = "%s %s %s\n" % (reqtype, self.hr.path, "HTTP/1.1")
-            print "req", req
+            if self.debuglevel > 0:
+                print "req", req
             yield p.ss.write(req)
 
             conntype = self.hr.headers.get('Connection', "")
@@ -171,7 +176,8 @@ class ProxyServerRequestHandler(object):
 
             # send headers
             hdrs = str(self.hr.headers)
-            print "hdrs", hdrs
+            if self.debuglevel > 0:
+                print "hdrs", hdrs
             yield p.ss.write(hdrs)
             yield p.ss.write('\r\n')
 
@@ -180,11 +186,13 @@ class ProxyServerRequestHandler(object):
                 max_chunk_size = 10*1024*1024
                 size_remaining = int(self.hr.headers["content-length"])
                 L = []
-                print "size_remaining", size_remaining
+                if self.debuglevel > 0:
+                    print "size_remaining", size_remaining
                 while size_remaining:
                     chunk_size = min(size_remaining, max_chunk_size)
                     data = self.hr.rfile.read(chunk_size)
-                    print "proxy rfile read", repr(data)
+                    if self.debuglevel > 0:
+                        print "proxy rfile read", repr(data)
                     yield multitask.send(p.sock, data)
                     size_remaining -= len(data)
 
@@ -197,15 +205,17 @@ class ProxyServerRequestHandler(object):
             try:
                 while 1:
                     line = (yield p.ss.readline())
-                    print "reading from proxy", repr(line)
+                    if self.debuglevel > 0:
+                        print "reading from proxy", repr(line)
                     res += line
                     if line in ['\n', '\r\n']:
                         break
             except StopIteration:
-                if httpd._debug: print "proxy read stopiter"
+                if self.debuglevel > 0:
+                    print "proxy read stopiter"
                 # TODO: close connection
             except:
-                if httpd._debug:
+                if self.debuglevel > 0:
                     print 'proxy read error', \
                           (traceback and traceback.print_exc() or None)
                 # TODO: close connection
@@ -214,14 +224,16 @@ class ProxyServerRequestHandler(object):
 
             # Examine the headers and look for a Connection directive
             respheaders = mimetools.Message(f, 0)
-            print "response headers", str(respheaders)
+            if self.debuglevel > 0:
+                print "response headers", str(respheaders)
             remote = self.client.remote
             rcooks = httpd.process_cookies(respheaders, remote, "Set-Cookie", False)
             rcooks['session'] = self.hr.response_cookies['session'].value # nooo
             rcooks['session']['expires'] = \
                     self.hr.response_cookies['session']['expires']
             self.hr.response_cookies = rcooks
-            print "rcooks", str(rcooks)
+            if self.debuglevel > 0:
+                print "rcooks", str(rcooks)
 
             # override connection: keep-alive hack
             #responseline = responseline.split(" ")
@@ -248,7 +260,8 @@ class ProxyServerRequestHandler(object):
                     self.hr.close_connection = 0
 
             # write rest of data
-            print "writing to client body"
+            if self.debuglevel > 0:
+                print "writing to client body"
             yield self.client.writeMessage("\r\n")
 
             if respheaders.has_key('content-length'):
@@ -257,7 +270,9 @@ class ProxyServerRequestHandler(object):
                 while size_remaining:
                     chunk_size = min(size_remaining, max_chunk_size)
                     data = (yield p.ss.read(chunk_size))
-                    print "reading from proxy expecting", size_remaining, repr(data)
+                    if self.debuglevel > 0:
+                        print "reading from proxy expecting", \
+                                    size_remaining, repr(data)
                     yield self.client.writeMessage(data)
                     size_remaining -= len(data)
             else:
@@ -267,27 +282,36 @@ class ProxyServerRequestHandler(object):
                         data = (yield p.ss.read(1024))
                     except httpd.ConnectionClosed:
                         break
-                    print "reading from proxy", repr(data)
+                    if self.debuglevel > 0:
+                        print "reading from proxy", repr(data)
                     if data == '':
                         break
                     yield self.client.writeMessage(data)
 
             if not keepalive: #self.hr.close_connection:
-                print 'proxy wants client to close_connection'
+                if self.debuglevel > 0:
+                    print 'proxy wants client to close_connection'
                 try:
                     yield self.client.connectionClosed()
+                    p.serving = False
                     raise httpd.ConnectionClosed
                 except httpd.ConnectionClosed:
-                    print 'close_connection done'
+                    if self.debuglevel > 0:
+                        print 'close_connection done'
                     pass
 
             p.serving = False
         except httpd.ConnectionClosed:
-            # whoops...
-            raise httpd.ConnectionClosed
+            # whoops, remote end has died: remove client and
+            # remove proxy session, we cannot do anything else,
+            # there's nothing there to talk to.
+            self.client.removeConnection()
+            self.proxies.pop(session)
+
         except:
-            print traceback.print_exc()
+            if self.debuglevel > 0:
+                print traceback.print_exc()
             
-
+        p.serving = False
         raise StopIteration