Поддержка keep alive подключений #3

Merged
johnsol merged 2 commits from dev into stable 2024-10-09 14:42:26 +03:00
4 changed files with 30 additions and 10 deletions
Showing only changes of commit eabd85f68b - Show all commits

View file

@ -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:

View file

@ -48,16 +48,25 @@ class HTTPHandler:
def __write_data(self, data_iter):
for chunk in data_iter:
self.write_fd.write(chunk)
self.write_fd.flush()
try:
self.write_fd.write(chunk)
self.write_fd.flush()
except BrokenPipeError:
pass
def __read_data(self, size=MAX_REQUEST_LINE_SIZE+1):
return self.read_fd.readline(size)
try:
return self.read_fd.readline(size)
except BrokenPipeError:
pass
def __close(self):
self.write_fd.close()
self.read_fd.close()
self.conn.close()
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()

View file

@ -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!")

View file

@ -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")