43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
import BaseHTTPServer
 | 
						|
from py.__.green import greensock2
 | 
						|
from py.__.green.pipe.gsocket import GreenSocket
 | 
						|
 | 
						|
 | 
						|
class GreenMixIn:
 | 
						|
    """Mix-in class to handle each request in a new greenlet."""
 | 
						|
 | 
						|
    def process_request_greenlet(self, request, client_address):
 | 
						|
        """Same as in BaseServer but as a greenlet.
 | 
						|
        In addition, exception handling is done here.
 | 
						|
        """
 | 
						|
        try:
 | 
						|
            self.finish_request(request, client_address)
 | 
						|
            self.close_request(request)
 | 
						|
        except:
 | 
						|
            self.handle_error(request, client_address)
 | 
						|
            self.close_request(request)
 | 
						|
 | 
						|
    def process_request(self, request, client_address):
 | 
						|
        """Start a new greenlet to process the request."""
 | 
						|
        greensock2.autogreenlet(self.process_request_greenlet,
 | 
						|
                                request, client_address)
 | 
						|
 | 
						|
 | 
						|
class GreenHTTPServer(GreenMixIn, BaseHTTPServer.HTTPServer):
 | 
						|
    protocol_version = "HTTP/1.1"
 | 
						|
 | 
						|
    def server_bind(self):
 | 
						|
        self.socket = GreenSocket.fromsocket(self.socket)
 | 
						|
        BaseHTTPServer.HTTPServer.server_bind(self)
 | 
						|
 | 
						|
 | 
						|
def test_simple(handler_class=None):
 | 
						|
    if handler_class is None:
 | 
						|
        from SimpleHTTPServer import SimpleHTTPRequestHandler
 | 
						|
        handler_class = SimpleHTTPRequestHandler
 | 
						|
    server_address = ('', 8000)
 | 
						|
    httpd = GreenHTTPServer(server_address, handler_class)
 | 
						|
    sa = httpd.socket.getsockname()
 | 
						|
    print "Serving HTTP on", sa[0], "port", sa[1], "..."
 | 
						|
    httpd.serve_forever()
 |