Add for file iterator check access to file

- Rename function fileiter to file_iterator;

Fix:
 - BrokenPipeError for thread;
 - Log strings;
This commit is contained in:
Иван Солнцев 2024-10-09 14:31:57 +03:00
parent eabd85f68b
commit 346f01c9d9
Signed by: johnsol
GPG key ID: C56B337609C9821E
3 changed files with 33 additions and 34 deletions

View file

@ -23,13 +23,15 @@ import os
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
def fileiter(filename): def file_iterator(filename):
log.debug("Calc file %s size" % 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) yield os.path.getsize(filename)
log.debug("Open file %s to byte-read" % filename) log.debug("Open file \"%s\" to byte-read", filename)
with open(filename, "rb") as f: with open(filename, "rb") as f:
while True: while True:
file_data = f.read(1024) file_data = f.read(1024)

View file

@ -22,7 +22,7 @@ import logging
import config import config
from .common import MAX_REQUEST_LINE_SIZE, HandlerType, HTTPMethod from .common import MAX_REQUEST_LINE_SIZE, HandlerType, HTTPMethod
from .file_read import fileiter from .file_read import file_iterator
from .response import Response from .response import Response
@ -44,29 +44,23 @@ class HTTPHandler:
self.data = b"" self.data = b""
self.__handle_connection()
def __write_data(self, data_iter):
for chunk in data_iter:
try: try:
self.__handle_connection()
except BrokenPipeError:
log.info("Conenction pipe broken, close thread")
def __write_data(self, response):
for chunk in response:
self.write_fd.write(chunk) self.write_fd.write(chunk)
self.write_fd.flush() self.write_fd.flush()
except BrokenPipeError:
pass
def __read_data(self, size=MAX_REQUEST_LINE_SIZE+1): def __read_data(self, size=MAX_REQUEST_LINE_SIZE+1):
try:
return self.read_fd.readline(size) return self.read_fd.readline(size)
except BrokenPipeError:
pass
def __close(self): def __close(self):
try:
self.write_fd.close() self.write_fd.close()
self.read_fd.close() self.read_fd.close()
self.conn.close() self.conn.close()
except BrokenPipeError:
pass
def __handle_connection(self): def __handle_connection(self):
""" """
@ -211,14 +205,14 @@ class HTTPHandler:
self.__close() self.__close()
return 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) self.data = self.read_fd.read(bytes_to_receive)
log.debug("Request method: %s" % self.http_method) log.debug("Request method: %s", self.http_method)
log.debug("Requested address: %s" % self.http_address) log.debug("Requested address: %s", self.http_address)
log.debug("Request headers: %s" % self.http_headers) log.debug("Request headers: %s", self.http_headers)
log.debug("Request in GET after ?: %s" % self.http_get_request) log.debug("Request in GET after ?: %s", self.http_get_request)
log.debug("Data: %s" % self.data) log.debug("Data: %s", self.data)
self.__send_form_data() self.__send_form_data()
@ -234,8 +228,8 @@ class HTTPHandler:
found = True found = True
if path.handler_type == HandlerType.STATIC_FILE: if path.handler_type == HandlerType.STATIC_FILE:
log.debug("Address associated with static file on path {}".format(path.link)) log.debug("Address associated with static file on path %s", path.link)
r = Response(data=fileiter(path.link)) r = Response(data=file_iterator(path.link))
self.__write_data(r) self.__write_data(r)
elif path.handler_type == HandlerType.FUNCTION: elif path.handler_type == HandlerType.FUNCTION:

View file

@ -16,15 +16,18 @@ def init_server_socket(server_handler):
try: try:
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as main_server_socket: 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) 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"])) 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() main_server_socket.listen()
while True: while True:
conn, addr = main_server_socket.accept() 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 = threading.Thread(target=server_handler, args=(conn, addr,), daemon=True)
thr_serv_conn.start() thr_serv_conn.start()