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