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

Merged
johnsol merged 2 commits from dev into stable 2024-10-09 14:42:26 +03:00
4 changed files with 40 additions and 21 deletions

View file

@ -18,13 +18,20 @@
#
import logging
import os
log = logging.getLogger(__name__)
def fileiter(filename):
log.debug("Open file %s to byte-read" % filename)
def file_iterator(filename):
log.debug("Try access to file \"%s\"", filename)
if not os.path.isfile(filename):
raise FileNotFoundError("File \"%s\" not found", filename)
log.debug("Get size of file \"%s\"", filename)
yield os.path.getsize(filename)
log.debug("Open file \"%s\" to byte-read", filename)
with open(filename, "rb") as f:
while True:
file_data = f.read(1024)

View file

@ -22,7 +22,7 @@ import logging
import config
from .common import MAX_REQUEST_LINE_SIZE, HandlerType, HTTPMethod
from .file_read import fileiter
from .file_read import file_iterator
from .response import Response
@ -44,10 +44,13 @@ class HTTPHandler:
self.data = b""
try:
self.__handle_connection()
except BrokenPipeError:
log.info("Conenction pipe broken, close thread")
def __write_data(self, data_iter):
for chunk in data_iter:
def __write_data(self, response):
for chunk in response:
self.write_fd.write(chunk)
self.write_fd.flush()
@ -202,14 +205,14 @@ class HTTPHandler:
self.__close()
return
log.debug("Want to receive {} bytes from client".format(bytes_to_receive))
log.debug("Want to receive %s bytes from client", bytes_to_receive)
self.data = self.read_fd.read(bytes_to_receive)
log.debug("Request method: %s" % self.http_method)
log.debug("Requested address: %s" % self.http_address)
log.debug("Request headers: %s" % self.http_headers)
log.debug("Request in GET after ?: %s" % self.http_get_request)
log.debug("Data: %s" % self.data)
log.debug("Request method: %s", self.http_method)
log.debug("Requested address: %s", self.http_address)
log.debug("Request headers: %s", self.http_headers)
log.debug("Request in GET after ?: %s", self.http_get_request)
log.debug("Data: %s", self.data)
self.__send_form_data()
@ -225,8 +228,8 @@ class HTTPHandler:
found = True
if path.handler_type == HandlerType.STATIC_FILE:
log.debug("Address associated with static file on path {}".format(path.link))
r = Response(data=fileiter(path.link))
log.debug("Address associated with static file on path %s", path.link)
r = Response(data=file_iterator(path.link))
self.__write_data(r)
elif path.handler_type == HandlerType.FUNCTION:
@ -258,4 +261,4 @@ class HTTPHandler:
r = Response(status_code=404, data=b"Not found!")
self.__write_data(r)
self.__close()
self.__handle_connection()

View file

@ -16,18 +16,21 @@ def init_server_socket(server_handler):
try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as main_server_socket:
log.debug("Set socket option REUSEADDR to True")
main_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
log.debug("Attempt to bind socket to 0.0.0.0:{}".format(config.SETUP["server"]["port"]))
log.info("Attempt to bind socket to 0.0.0.0:%d", config.SETUP["server"]["port"])
main_server_socket.bind(("0.0.0.0", config.SETUP["server"]["port"]))
log.debug("Make socket is listen")
log.debug("Make socket to listen")
main_server_socket.listen()
while True:
conn, addr = main_server_socket.accept()
log.info("Accepted connection from %s", addr[0])
log.info("Accept 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")