43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			43 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| import BaseHTTPServer
 | |
| from pygreen import greensock2
 | |
| from pygreen.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()
 |