1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| class HttpHandler(asynchat.async_chat):
ac_out_buffer_size = 1 << 16
def __init__(self, app, conn, addr):
asynchat.async_chat.__init__(self, conn)
self.__app = app
self.__addr = addr
self.__headersDone = False
self.__headersString = ""
self.__headers = {}
self.__method = ""
self.__uri = ""
self.__contents = ""
self.__remainingLength = 0
self.set_terminator("\r\n\r\n")
def collect_incoming_data(self, data):
if self.__headersDone and self.__remainingLength > 0:
self.__contents += data
self.__remainingLength -= len(data)
if self.__remainingLength <= 0:
self.__process()
else:
self.__headersString += data
def found_terminator(self):
self.__headersDone = True
self.__parseRequest()
def __parseRequest(self):
lines = iter(self.__headersString.split("\r\n"))
request = lines.next()
self.__method, self.__uri, version = request.split(" ")
for header in lines:
name, value = header.split(": ")
self.__headers[name] = value
if not "Content-Length" in self.__headers:
self.__process()
def __process(self):
# output = StringIO()
# req = HttpRequest(self.__method, self.__uri, self.__headers, output)
# self.__app.handle(req)
#self.push(output.read())
self.push("HTTP/1.1 200 OK\r\nContent-Length: 13\r\nContent-Type: text/plain\r\n\r\nHello World !")
self.close_when_done()
class HttpServer(asyncore.dispatcher):
def __init__(self, host, port, app):
asyncore.dispatcher.__init__(self)
self.__app = app
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
def handle_read(self):
pass
def handle_connect(self):
pass
def handle_accept(self):
try:
conn, addr = self.accept()
except socket.error:
print "Socket error"
return
except TypeError:
return
HttpHandler(self.__app, conn, addr) |
Partager