обнова 1.1.0 #1

Merged
admin merged 2 commits from testing into main 2025-08-07 15:11:23 +00:00
6 changed files with 72 additions and 33 deletions
Showing only changes of commit 780072bdbd - Show all commits

2
.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
files/
__pycache__/

9
404.html Normal file
View File

@@ -0,0 +1,9 @@
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>debweb</center>
</body>
</html>
<!-- точно не спиздил с nginx'a!!! -->

View File

@@ -10,35 +10,39 @@ debweb использует всего одну стороннюю библио
pip install aiofiles pip install aiofiles
``` ```
> [!IMPORTANT] > [!IMPORTANT]
конфигурация сия шедевра происходит с помощью env (переменных окружения). из обязательных - `PRESET_FILE` и `DIR` конфигурация сия шедевра происходит в файле `config.py`
### основное
- `name` - название сервера, отображается в http заголовках
### сеть ### сеть
- `ADDR` - адрес сервера (по умолчанию - `localhost`) - `addr` - адрес сервера
- `PORT` - порт сервера (по умолчанию - `7856`) - `port` - порт сервера
### файлы и директории ### файлы и директории
- `FILE` - файл логов (по умолчанию вывод в консоль) - `log_file` - файл логов (по умолчанию вывод в консоль)
- `PRESET_FILE` - файл пресета (подробнее ниже) - `preset_file` - файл пресета. обычный html документ. но в нем нужно указать одиночный тег `<FILES>` для отображения файлов в директории
- `DIR` - рабочая директория - `directory` - рабочая директория **обязательно с / на конце!!!!**
### буферы ### буферы
- `READ_BUFFER` - буфер для запроса (по умолчанию - `16384`) - `read_buffer` - буфер для запроса
- `WRITE_BUFFER` - размер чанка при отправке файлов (по умолчанию - `16384`) - `write_buffer` - размер буфера при отправке файлов
### логи ### логи
- `START_MSG` - лог при старте сервера (по умолчанию - `started at <ADDR>`) - `start_msg` - лог при старте сервера
- `CONN_MSG` - лог при подключении (по умолчанию - `conn from <ADDR>`) - `conn_msg` - лог при подключении
- `GET_MSG` - лог при GET запросе (по умолчанию - `<ADDR> got <FILE>`) - `get_msg` - лог при GET запросе
- `404_MSG` - лог при ошибке 404 (по умолчанию - `<ADDR> err 404 <FILE>`)
`<ADDR>` будет заменен на адрес клиента `<ADDR>` будет заменен на адрес клиента
`<FILE>` будет заменен на файл / директорию `<FILE>` будет заменен на файл / директорию, к которой запрашивается доступ
## preset ### ошибки
файл пресета - обычный html документ. но в нем нужно указать тег `<FILES>` для отображения файлов в директории. кастомизируй на здоровье! - `e404_file` - html файл, который будет отправлен при ошибке 404
- `e404_msg` - лог при ошибке 404 (по умолчанию - `<ADDR> err 404 <FILE>`)

18
config.py Normal file
View File

@@ -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 <ADDR>"
conn_msg="conn from <ADDR>"
get_msg="<ADDR> got <FILE>"
e404_file="404.html"
e404_msg="<ADDR> err 404 <FILE>"

41
main.py
View File

@@ -4,26 +4,28 @@ import mimetypes
import datetime import datetime
import aiofiles import aiofiles
import asyncio import asyncio
import time import config
import os import os
import re
class WebServer: class WebServer:
def __init__(self): def __init__(self):
self._addr = os.environ.get("ADDR", "localhost") self.name = config.name
self._port = int(os.environ.get("PORT", 7856)) self._addr = config.addr
self._port = config.port
self._log_file = os.environ.get("FILE") self._log_file = config.log_file
self.preset_file = os.environ.get("PRESET_FILE") self.preset_file = config.preset_file
self.directory = os.environ.get("DIR") self.directory = config.directory
self._read_buffer = int(os.environ.get("READ_BUFFER", 16384)) self._read_buffer = config.read_buffer
self._write_size = int(os.environ.get("WRITE_BUFFER", 16384)) self._write_size = config.write_buffer
self.conn_msg = os.environ.get("CONN_MSG", "conn from <ADDR>") self.conn_msg = config.conn_msg
self.start_msg = os.environ.get("START_MSG", "started at <ADDR>") self.start_msg = config.start_msg
self.get_msg = os.environ.get("GET_MSG", "<ADDR> got <FILE>") self.get_msg = config.get_msg
self.e404_msg = os.environ.get("404_MSG", "<ADDR> err 404 <FILE>")
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: 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" if mime.startswith("text"): mime += "; charset=utf-8"
headers = ( headers = (
"HTTP/1.1 200 OK\r\n", "HTTP/1.1 200 OK\r\n"
f"Content-Type: {mime}\r\n", f"Content-Type: {mime}\r\n"
f"Content-Length: {file_size}\r\n", f"Content-Length: {file_size}\r\n"
f"Server: {self.name}\r\n"
"\r\n" "\r\n"
) )
@@ -100,6 +103,7 @@ class WebServer:
headers = ( headers = (
"HTTP/1.1 200 OK\r\n" "HTTP/1.1 200 OK\r\n"
f"Content-Type: text/html; charset=utf-8\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" f"Content-Length: {len(resp)}\r\n"
"\r\n" "\r\n"
) )
@@ -107,11 +111,12 @@ class WebServer:
writer.write("".join(headers).encode() + resp) writer.write("".join(headers).encode() + resp)
else: else:
await self.log(self.e404_msg, addr, file_path) await self.log(self.e404_msg, addr, file_path)
response = ( # TODO: добавить страничку для 404 response = (
"HTTP/1.1 404 Not Found\r\n" "HTTP/1.1 404 Not Found\r\n"
"Content-Type: text/html; charset=utf-8\r\n" "Content-Type: text/html; charset=utf-8\r\n"
f"Server: {self.name}\r\n"
"\r\n" "\r\n"
"<h1>плоке плоке, 404</h1>" f"{open(self._e404_file, encoding="utf-8").read()}"
) )
writer.write(response.encode()) writer.write(response.encode())
await writer.drain() await writer.drain()

1
preset.html Normal file
View File

@@ -0,0 +1 @@
<FILES>