test_ok1/py/green/server/httpserver.py

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()