From 7e3820fda0722af2be884a2657d8674e28601409 Mon Sep 17 00:00:00 2001 From: pablusha Date: Thu, 7 Aug 2025 19:10:47 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=BF=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D1=80=D0=B8=D0=BA=D0=BE=D0=BB=20=D1=81=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D1=8B=D0=BC=D0=B8=20=D0=BF=D1=83=D1=82=D1=8F?= =?UTF-8?q?=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/main.py b/main.py index e8e5612..4db8359 100644 --- a/main.py +++ b/main.py @@ -53,7 +53,7 @@ class WebServer: addr = (real_addr, addr[1]) request = data.split("\n")[0] file_name = request.split()[1][1:] - file_path = self.directory + file_name + file_path = os.path.join(self.directory, file_name) if os.path.isfile(file_path): mime, _ = mimetypes.guess_type(file_path) @@ -90,20 +90,24 @@ class WebServer: resp = await f.read() files = "" - for file_name in sorted(os.listdir(file_path)): # TODO: добавить настройки отображения файла - file = "/".join(file_path.split("/")[1:]) +"/" + file_name - - if os.path.isdir(file_path + "/" + file_name): - file_name = "/" + file_name - - modify_time = (os.path.getmtime(file_path + "/" + file_name)) + base_path = file_name.strip('/') + + for item in sorted(os.listdir(file_path)): + item_path = os.path.join(file_path, item) + is_dir = os.path.isdir(item_path) + + if base_path: rel_path = f"{base_path}/{item}" + else: rel_path = item + + if is_dir: rel_path += "/" + + modify_time = os.path.getmtime(item_path) modify_datetime = datetime.datetime.fromtimestamp(modify_time) formatted_time = modify_datetime.strftime("%d.%m.%Y %H:%M:%S") - - files += f'{file_name} | {formatted_time}
' + + files += f'{item} | {formatted_time}
' # TODO: добавить кастом для инфы про файлики resp = resp.replace("", files) - resp = resp.replace("//", "/") resp = resp.encode() headers = ( "HTTP/1.1 200 OK\r\n" @@ -113,7 +117,7 @@ class WebServer: "\r\n" ) - writer.write("".join(headers).encode() + resp) + writer.write(headers + resp) else: await self.log(self.e404_msg, addr, file_path) response = ( -- 2.49.1 From 231a9282ea27b638f7584a03ac52768d9b98da80 Mon Sep 17 00:00:00 2001 From: pablusha Date: Thu, 7 Aug 2025 19:26:49 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=BE=D1=87=D0=B5=D1=80=D0=B5=D0=B4=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D0=BA=D0=B8=20?= =?UTF-8?q?=D1=8D=D1=82=D0=BE=D0=B3=D0=BE=20=D0=B3=D0=BE=D0=B2=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/main.py b/main.py index 4db8359..91cbae3 100644 --- a/main.py +++ b/main.py @@ -48,7 +48,12 @@ class WebServer: data = unquote(data.decode()) if not data: return - real_addr = "".join([l.replace("X-Real-IP: ", "") for l in data.split("\n") if l.startswith("X-Real-IP: ")][0]).strip() # ТАКОЙ ГАВНАКОД XD + real_addr = None + for line in data.split("\n"): + if line.startswith("X-Real-IP: "): + real_addr = line[len("X-Real-IP: "):].strip() + break + if real_addr and self.proxied: addr = (real_addr, addr[1]) request = data.split("\n")[0] @@ -90,22 +95,25 @@ class WebServer: resp = await f.read() files = "" - base_path = file_name.strip('/') + norm_path = file_path.replace('\\', '/') + base_path = norm_path.replace(self.directory.replace('\\', '/'), '').strip('/') for item in sorted(os.listdir(file_path)): item_path = os.path.join(file_path, item) is_dir = os.path.isdir(item_path) - if base_path: rel_path = f"{base_path}/{item}" - else: rel_path = item + rel_path = f"{base_path}/{item}" if base_path else item + rel_path = rel_path.replace('\\', '/') - if is_dir: rel_path += "/" + if is_dir: + rel_path += "/" + item += "/" modify_time = os.path.getmtime(item_path) modify_datetime = datetime.datetime.fromtimestamp(modify_time) formatted_time = modify_datetime.strftime("%d.%m.%Y %H:%M:%S") - files += f'{item} | {formatted_time}
' # TODO: добавить кастом для инфы про файлики + files += f'{item} | {formatted_time}
' resp = resp.replace("", files) resp = resp.encode() @@ -117,15 +125,17 @@ class WebServer: "\r\n" ) - writer.write(headers + resp) + writer.write(headers.encode() + resp) else: await self.log(self.e404_msg, addr, file_path) + async with aiofiles.open(self._e404_file, "r", encoding="utf-8") as f: + content = await f.read() response = ( "HTTP/1.1 404 Not Found\r\n" "Content-Type: text/html; charset=utf-8\r\n" f"Server: {self.name}\r\n" "\r\n" - f"{open(self._e404_file, encoding="utf-8").read()}" + f"{content}" ) writer.write(response.encode()) await writer.drain() -- 2.49.1 From 45156ab4aebbfad8464d33fac3fda9a0462fb5d7 Mon Sep 17 00:00:00 2001 From: pablusha Date: Thu, 7 Aug 2025 19:41:38 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D1=82=D0=BE=D1=87=D0=BD=D0=BE=20=D0=B2=D1=81=D0=B5=20=D0=BF?= =?UTF-8?q?=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 91cbae3..0a6e740 100644 --- a/main.py +++ b/main.py @@ -44,8 +44,8 @@ class WebServer: async def handle(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: addr = writer.get_extra_info("peername") await self.log(self.conn_msg, addr) - data = await reader.read(self._read_buffer) - data = unquote(data.decode()) + rdata = await reader.read(self._read_buffer) + data = rdata.decode() if not data: return real_addr = None @@ -56,9 +56,14 @@ class WebServer: if real_addr and self.proxied: addr = (real_addr, addr[1]) + request = data.split("\n")[0] - file_name = request.split()[1][1:] - file_path = os.path.join(self.directory, file_name) + parts = request.split() + if len(parts) < 2: return + + path = unquote(parts[1]) + file_name = path[1:] if path.startswith('/') else path + file_path = os.path.abspath(os.path.join(self.directory, file_name)) if os.path.isfile(file_path): mime, _ = mimetypes.guess_type(file_path) @@ -113,7 +118,7 @@ class WebServer: modify_datetime = datetime.datetime.fromtimestamp(modify_time) formatted_time = modify_datetime.strftime("%d.%m.%Y %H:%M:%S") - files += f'{item} | {formatted_time}
' + files += f'{item} | {formatted_time}
\n' resp = resp.replace("", files) resp = resp.encode() -- 2.49.1