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..6e049ef 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 \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..f19d8a4 --- /dev/null +++ b/config.py @@ -0,0 +1,19 @@ +name="debweb 1.1.0" +proxied=False + +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..e8e5612 100644 --- a/main.py +++ b/main.py @@ -4,26 +4,30 @@ 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.proxied = config.proxied - self._log_file = os.environ.get("FILE") - self.preset_file = os.environ.get("PRESET_FILE") - self.directory = os.environ.get("DIR") + self._addr = config.addr + self._port = config.port - self._read_buffer = int(os.environ.get("READ_BUFFER", 16384)) - self._write_size = int(os.environ.get("WRITE_BUFFER", 16384)) + self._log_file = config.log_file + self.preset_file = config.preset_file + self.directory = config.directory - 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._read_buffer = config.read_buffer + self._write_size = config.write_buffer + + 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: @@ -44,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 @@ -55,9 +62,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 +108,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 +116,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