обнова 1.1.0 #1
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
|
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
|
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 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.proxied = config.proxied
|
||||||
|
|
||||||
self._log_file = os.environ.get("FILE")
|
self._addr = config.addr
|
||||||
self.preset_file = os.environ.get("PRESET_FILE")
|
self._port = config.port
|
||||||
self.directory = os.environ.get("DIR")
|
|
||||||
|
|
||||||
self._read_buffer = int(os.environ.get("READ_BUFFER", 16384))
|
self._log_file = config.log_file
|
||||||
self._write_size = int(os.environ.get("WRITE_BUFFER", 16384))
|
self.preset_file = config.preset_file
|
||||||
|
self.directory = config.directory
|
||||||
|
|
||||||
self.conn_msg = os.environ.get("CONN_MSG", "conn from <ADDR>")
|
self._read_buffer = config.read_buffer
|
||||||
self.start_msg = os.environ.get("START_MSG", "started at <ADDR>")
|
self._write_size = config.write_buffer
|
||||||
self.get_msg = os.environ.get("GET_MSG", "<ADDR> got <FILE>")
|
|
||||||
self.e404_msg = os.environ.get("404_MSG", "<ADDR> err 404 <FILE>")
|
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:
|
async def log(self, text: str, addr: tuple=None, file: str=None) -> None:
|
||||||
@@ -44,6 +48,9 @@ class WebServer:
|
|||||||
data = unquote(data.decode())
|
data = unquote(data.decode())
|
||||||
if not data: return
|
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]
|
request = data.split("\n")[0]
|
||||||
file_name = request.split()[1][1:]
|
file_name = request.split()[1][1:]
|
||||||
file_path = self.directory + file_name
|
file_path = self.directory + file_name
|
||||||
@@ -55,9 +62,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 +108,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 +116,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
1
preset.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<FILES>
|
Reference in New Issue
Block a user