мерж пул реквест
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
files/
|
||||
__pycache__/
|
9
404.html
Normal file
9
404.html
Normal 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!!! -->
|
34
README.md
34
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 документ. но в нем нужно указать одиночный тег `<FILES>` для отображения файлов в директории
|
||||
- `directory` - рабочая директория **обязательно с / на конце!!!!**
|
||||
|
||||
### буферы
|
||||
|
||||
- `READ_BUFFER` - буфер для запроса (по умолчанию - `16384`)
|
||||
- `WRITE_BUFFER` - размер чанка при отправке файлов (по умолчанию - `16384`)
|
||||
- `read_buffer` - буфер для запроса
|
||||
- `write_buffer` - размер буфера при отправке файлов
|
||||
|
||||
### логи
|
||||
|
||||
- `START_MSG` - лог при старте сервера (по умолчанию - `started at <ADDR>`)
|
||||
- `CONN_MSG` - лог при подключении (по умолчанию - `conn from <ADDR>`)
|
||||
- `GET_MSG` - лог при GET запросе (по умолчанию - `<ADDR> got <FILE>`)
|
||||
- `404_MSG` - лог при ошибке 404 (по умолчанию - `<ADDR> err 404 <FILE>`)
|
||||
- `start_msg` - лог при старте сервера
|
||||
- `conn_msg` - лог при подключении
|
||||
- `get_msg` - лог при GET запросе
|
||||
|
||||
`<ADDR>` будет заменен на адрес клиента
|
||||
|
||||
`<FILE>` будет заменен на файл / директорию
|
||||
`<FILE>` будет заменен на файл / директорию, к которой запрашивается доступ
|
||||
|
||||
## preset
|
||||
### ошибки
|
||||
|
||||
файл пресета - обычный html документ. но в нем нужно указать тег `<FILES>` для отображения файлов в директории. кастомизируй на здоровье!
|
||||
- `e404_file` - html файл, который будет отправлен при ошибке 404
|
||||
- `e404_msg` - лог при ошибке 404
|
19
config.py
Normal file
19
config.py
Normal file
@@ -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 <ADDR>"
|
||||
conn_msg="conn from <ADDR>"
|
||||
get_msg="<ADDR> got <FILE>"
|
||||
|
||||
e404_file="404.html"
|
||||
e404_msg="<ADDR> err 404 <FILE>"
|
46
main.py
46
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 <ADDR>")
|
||||
self.start_msg = os.environ.get("START_MSG", "started at <ADDR>")
|
||||
self.get_msg = os.environ.get("GET_MSG", "<ADDR> got <FILE>")
|
||||
self.e404_msg = os.environ.get("404_MSG", "<ADDR> err 404 <FILE>")
|
||||
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"
|
||||
"<h1>плоке плоке, 404</h1>"
|
||||
f"{open(self._e404_file, encoding="utf-8").read()}"
|
||||
)
|
||||
writer.write(response.encode())
|
||||
await writer.drain()
|
||||
|
1
preset.html
Normal file
1
preset.html
Normal file
@@ -0,0 +1 @@
|
||||
<FILES>
|
Reference in New Issue
Block a user