Support keep alive
Improvements: - Response return Content-Length header; - HTTP handler run recursive after call; - File iterator when call before yield file size.
This commit is contained in:
parent
0fb84420fe
commit
eabd85f68b
4 changed files with 30 additions and 10 deletions
|
@ -18,11 +18,16 @@
|
|||
#
|
||||
|
||||
import logging
|
||||
import os
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
def fileiter(filename):
|
||||
log.debug("Calc file %s size" % filename)
|
||||
|
||||
yield os.path.getsize(filename)
|
||||
|
||||
log.debug("Open file %s to byte-read" % filename)
|
||||
|
||||
with open(filename, "rb") as f:
|
||||
|
|
|
@ -48,16 +48,25 @@ class HTTPHandler:
|
|||
|
||||
def __write_data(self, data_iter):
|
||||
for chunk in data_iter:
|
||||
try:
|
||||
self.write_fd.write(chunk)
|
||||
self.write_fd.flush()
|
||||
except BrokenPipeError:
|
||||
pass
|
||||
|
||||
def __read_data(self, size=MAX_REQUEST_LINE_SIZE+1):
|
||||
try:
|
||||
return self.read_fd.readline(size)
|
||||
except BrokenPipeError:
|
||||
pass
|
||||
|
||||
def __close(self):
|
||||
try:
|
||||
self.write_fd.close()
|
||||
self.read_fd.close()
|
||||
self.conn.close()
|
||||
except BrokenPipeError:
|
||||
pass
|
||||
|
||||
def __handle_connection(self):
|
||||
"""
|
||||
|
@ -258,4 +267,4 @@ class HTTPHandler:
|
|||
r = Response(status_code=404, data=b"Not found!")
|
||||
self.__write_data(r)
|
||||
|
||||
self.__close()
|
||||
self.__handle_connection()
|
||||
|
|
|
@ -27,7 +27,7 @@ def init_server_socket(server_handler):
|
|||
log.info("Accepted connection from %s", addr[0])
|
||||
|
||||
thr_serv_conn = threading.Thread(target=server_handler, args=(conn, addr,), daemon=True)
|
||||
thr_serv_conn.run()
|
||||
thr_serv_conn.start()
|
||||
|
||||
except KeyboardInterrupt:
|
||||
log.info("Server get keyboard interrupt, bye!")
|
||||
|
|
|
@ -51,11 +51,17 @@ class Response:
|
|||
|
||||
resp = "HTTP/1.1 {} {}\r\n"
|
||||
resp += "Server: cnserv\r\n"
|
||||
resp += "Connection: close\r\n"
|
||||
resp += "Connection: keep-alive\r\n"
|
||||
|
||||
for key, val in self.additional_headers.items():
|
||||
resp += "{}: {}\r\n".format(key, val)
|
||||
resp += "\r\n"
|
||||
|
||||
if type(self.data) == bytes:
|
||||
resp += "Content-Length: {}\r\n".format(len(self.data))
|
||||
elif hasattr(self.data, "__iter__"):
|
||||
resp += "Content-Length: {}\r\n".format(next(self.data))
|
||||
|
||||
resp += "\r\n"
|
||||
resp = resp.format(self.status_code, STATUS_BY_CODE[self.status_code])
|
||||
resp = resp.encode("UTF-8")
|
||||
|
||||
|
|
Loading…
Reference in a new issue