From 780072bdbd268978f48da7f2b2db35e1ef0dc686 Mon Sep 17 00:00:00 2001 From: pablusha Date: Thu, 7 Aug 2025 17:39:09 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B5=D0=B5=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ 404.html | 9 +++++++++ README.md | 34 +++++++++++++++++++--------------- config.py | 18 ++++++++++++++++++ main.py | 41 +++++++++++++++++++++++------------------ preset.html | 1 + 6 files changed, 72 insertions(+), 33 deletions(-) create mode 100644 .gitignore create mode 100644 404.html create mode 100644 config.py create mode 100644 preset.html diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7cc5527 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +files/ +__pycache__/ \ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 0000000..d3a9908 --- /dev/null +++ b/404.html @@ -0,0 +1,9 @@ + +404 Not Found + +

404 Not Found

+
debweb
+ + + + \ No newline at end of file diff --git a/README.md b/README.md index a26053d..08d72d3 100644 --- a/README.md +++ b/README.md @@ -10,35 +10,39 @@ debweb использует всего одну стороннюю библио pip install aiofiles ``` > [!IMPORTANT] -конфигурация сия шедевра происходит с помощью env (переменных окружения). из обязательных - `PRESET_FILE` и `DIR` +конфигурация сия шедевра происходит в файле `config.py` + +### основное + +- `name` - название сервера, отображается в http заголовках ### сеть -- `ADDR` - адрес сервера (по умолчанию - `localhost`) -- `PORT` - порт сервера (по умолчанию - `7856`) +- `addr` - адрес сервера +- `port` - порт сервера ### файлы и директории -- `FILE` - файл логов (по умолчанию вывод в консоль) -- `PRESET_FILE` - файл пресета (подробнее ниже) -- `DIR` - рабочая директория +- `log_file` - файл логов (по умолчанию вывод в консоль) +- `preset_file` - файл пресета. обычный html документ. но в нем нужно указать одиночный тег `` для отображения файлов в директории +- `directory` - рабочая директория **обязательно с / на конце!!!!** ### буферы -- `READ_BUFFER` - буфер для запроса (по умолчанию - `16384`) -- `WRITE_BUFFER` - размер чанка при отправке файлов (по умолчанию - `16384`) +- `read_buffer` - буфер для запроса +- `write_buffer` - размер буфера при отправке файлов ### логи -- `START_MSG` - лог при старте сервера (по умолчанию - `started at `) -- `CONN_MSG` - лог при подключении (по умолчанию - `conn from `) -- `GET_MSG` - лог при GET запросе (по умолчанию - ` got `) -- `404_MSG` - лог при ошибке 404 (по умолчанию - ` err 404 `) +- `start_msg` - лог при старте сервера +- `conn_msg` - лог при подключении +- `get_msg` - лог при GET запросе `` будет заменен на адрес клиента -`` будет заменен на файл / директорию +`` будет заменен на файл / директорию, к которой запрашивается доступ -## preset +### ошибки -файл пресета - обычный html документ. но в нем нужно указать тег `` для отображения файлов в директории. кастомизируй на здоровье! \ No newline at end of file +- `e404_file` - html файл, который будет отправлен при ошибке 404 +- `e404_msg` - лог при ошибке 404 (по умолчанию - ` err 404 `) \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..10e8c6d --- /dev/null +++ b/config.py @@ -0,0 +1,18 @@ +name="debweb 1.1.0" + +addr="localhost" +port=7856 + +log_file=None +preset_file="preset.html" +directory="files/" + +read_buffer=16384 +write_buffer=16384 + +start_msg="started at " +conn_msg="conn from " +get_msg=" got " + +e404_file="404.html" +e404_msg=" err 404 " \ No newline at end of file diff --git a/main.py b/main.py index 1c066c5..208d389 100644 --- a/main.py +++ b/main.py @@ -4,26 +4,28 @@ import mimetypes import datetime import aiofiles import asyncio -import time +import config import os -import re class WebServer: def __init__(self): - self._addr = os.environ.get("ADDR", "localhost") - self._port = int(os.environ.get("PORT", 7856)) + self.name = config.name + self._addr = config.addr + self._port = config.port - self._log_file = os.environ.get("FILE") - self.preset_file = os.environ.get("PRESET_FILE") - self.directory = os.environ.get("DIR") + self._log_file = config.log_file + self.preset_file = config.preset_file + self.directory = config.directory - self._read_buffer = int(os.environ.get("READ_BUFFER", 16384)) - self._write_size = int(os.environ.get("WRITE_BUFFER", 16384)) + self._read_buffer = config.read_buffer + self._write_size = config.write_buffer - self.conn_msg = os.environ.get("CONN_MSG", "conn from ") - self.start_msg = os.environ.get("START_MSG", "started at ") - self.get_msg = os.environ.get("GET_MSG", " got ") - self.e404_msg = os.environ.get("404_MSG", " err 404 ") + self.conn_msg = config.conn_msg + self.start_msg = config.start_msg + self.get_msg = config.get_msg + + self._e404_file = config.e404_file + self.e404_msg = config.e404_msg async def log(self, text: str, addr: tuple=None, file: str=None) -> None: @@ -55,9 +57,10 @@ class WebServer: if mime.startswith("text"): mime += "; charset=utf-8" headers = ( - "HTTP/1.1 200 OK\r\n", - f"Content-Type: {mime}\r\n", - f"Content-Length: {file_size}\r\n", + "HTTP/1.1 200 OK\r\n" + f"Content-Type: {mime}\r\n" + f"Content-Length: {file_size}\r\n" + f"Server: {self.name}\r\n" "\r\n" ) @@ -100,6 +103,7 @@ class WebServer: headers = ( "HTTP/1.1 200 OK\r\n" f"Content-Type: text/html; charset=utf-8\r\n" + f"Server: {self.name}\r\n" f"Content-Length: {len(resp)}\r\n" "\r\n" ) @@ -107,11 +111,12 @@ class WebServer: writer.write("".join(headers).encode() + resp) else: await self.log(self.e404_msg, addr, file_path) - response = ( # TODO: добавить страничку для 404 + 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" - "

плоке плоке, 404

" + f"{open(self._e404_file, encoding="utf-8").read()}" ) writer.write(response.encode()) await writer.drain() diff --git a/preset.html b/preset.html new file mode 100644 index 0000000..6a440ce --- /dev/null +++ b/preset.html @@ -0,0 +1 @@ + \ No newline at end of file From aafa84bfa39c1d188800a64668428b00af522fc4 Mon Sep 17 00:00:00 2001 From: pablusha Date: Thu, 7 Aug 2025 18:04:36 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=B5=D1=89=D0=B5=20=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D1=88=D0=B5=20=D0=B3=D0=BE=D0=B2=D0=BD=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=B4=D0=B0!?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- config.py | 1 + main.py | 5 +++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 08d72d3..6e049ef 100644 --- a/README.md +++ b/README.md @@ -45,4 +45,4 @@ pip install aiofiles ### ошибки - `e404_file` - html файл, который будет отправлен при ошибке 404 -- `e404_msg` - лог при ошибке 404 (по умолчанию - ` err 404 `) \ No newline at end of file +- `e404_msg` - лог при ошибке 404 \ No newline at end of file diff --git a/config.py b/config.py index 10e8c6d..f19d8a4 100644 --- a/config.py +++ b/config.py @@ -1,4 +1,5 @@ name="debweb 1.1.0" +proxied=False addr="localhost" port=7856 diff --git a/main.py b/main.py index 208d389..e8e5612 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,8 @@ import os class WebServer: def __init__(self): self.name = config.name + self.proxied = config.proxied + self._addr = config.addr self._port = config.port @@ -46,6 +48,9 @@ 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 + if real_addr and self.proxied: + addr = (real_addr, addr[1]) request = data.split("\n")[0] file_name = request.split()[1][1:] file_path = self.directory + file_name