7 Commits

Author SHA1 Message Date
ee4d1f90a3 мерж коммит 2025-08-07 20:59:30 +03:00
d64a4db140 yaay 2025-08-07 20:46:44 +03:00
e2579d3179 ya debil!!! 2025-08-07 16:55:20 +00:00
0262aea690 мерж пул реквест 1.1.1 2025-08-07 16:49:10 +00:00
45156ab4ae теперь точно все пофиксил 2025-08-07 19:41:38 +03:00
231a9282ea очередные фиксики этого говна 2025-08-07 19:26:49 +03:00
11fccc6fc7 мерж пул реквест 2025-08-07 15:11:22 +00:00
2 changed files with 40 additions and 13 deletions

View File

@@ -1,4 +1,4 @@
name="debweb 1.1.0" name="debweb 1.1.2"
proxied=False proxied=False
addr="localhost" addr="localhost"

51
main.py
View File

@@ -44,16 +44,26 @@ class WebServer:
async def handle(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None: async def handle(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter) -> None:
addr = writer.get_extra_info("peername") addr = writer.get_extra_info("peername")
await self.log(self.conn_msg, addr) await self.log(self.conn_msg, addr)
data = await reader.read(self._read_buffer) rdata = await reader.read(self._read_buffer)
data = unquote(data.decode()) data = rdata.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 real_addr = None
for line in data.split("\n"):
if line.startswith("X-Real-IP: "):
real_addr = line[len("X-Real-IP: "):].strip()
break
if real_addr and self.proxied: if real_addr and self.proxied:
addr = (real_addr, addr[1]) addr = (real_addr, addr[1])
request = data.split("\n")[0] request = data.split("\n")[0]
file_name = request.split()[1][1:] parts = request.split()
file_path = os.path.join(self.directory, file_name) if len(parts) < 2: return
path = unquote(parts[1])
file_name = path[1:] if path.startswith('/') else path
file_path = os.path.abspath(os.path.join(self.directory, file_name))
if os.path.isfile(file_path): if os.path.isfile(file_path):
mime, _ = mimetypes.guess_type(file_path) mime, _ = mimetypes.guess_type(file_path)
@@ -90,22 +100,30 @@ class WebServer:
resp = await f.read() resp = await f.read()
files = "" files = ""
base_path = file_name.strip('/') base_path = os.path.relpath(file_path, self.directory).replace('\\', '/')
if base_path == '.':
base_path = ''
for item in sorted(os.listdir(file_path)): for item in sorted(os.listdir(file_path)):
item_path = os.path.join(file_path, item) item_path = os.path.join(file_path, item)
is_dir = os.path.isdir(item_path) is_dir = os.path.isdir(item_path)
if base_path: rel_path = f"{base_path}/{item}" if base_path:
else: rel_path = item rel_path = f"{base_path}/{item}"
else:
rel_path = item
if is_dir: rel_path += "/" if is_dir:
rel_path += "/"
item += "/"
modify_time = os.path.getmtime(item_path) modify_time = os.path.getmtime(item_path)
modify_datetime = datetime.datetime.fromtimestamp(modify_time) modify_datetime = datetime.datetime.fromtimestamp(modify_time)
formatted_time = modify_datetime.strftime("%d.%m.%Y %H:%M:%S") formatted_time = modify_datetime.strftime("%d.%m.%Y %H:%M:%S")
files += f'<a href="/{rel_path}">{item}</a> | {formatted_time}<br>' # TODO: добавить кастом для инфы про файлики rel_path_encoded = rel_path.replace(' ', '%20').replace('#', '%23')
files += f'<a class={"dir" if is_dir else "file"} href="/{rel_path_encoded}">{item}</a> | {formatted_time}<br>\n'
resp = resp.replace("<FILES>", files) resp = resp.replace("<FILES>", files)
resp = resp.encode() resp = resp.encode()
@@ -117,23 +135,32 @@ class WebServer:
"\r\n" "\r\n"
) )
writer.write(headers + resp) writer.write(headers.encode() + resp)
else: else:
await self.log(self.e404_msg, addr, file_path) await self.log(self.e404_msg, addr, file_path)
async with aiofiles.open(self._e404_file, "r", encoding="utf-8") as f:
content = await f.read()
response = ( 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" f"Server: {self.name}\r\n"
"\r\n" "\r\n"
f"{open(self._e404_file, encoding="utf-8").read()}" f"{content}"
) )
writer.write(response.encode()) writer.write(response.encode())
await writer.drain() await writer.drain()
writer.close()
await writer.wait_closed()
return return
await self.log(self.get_msg, addr, file_path) await self.log(self.get_msg, addr, file_path)
await writer.drain() await writer.drain()
writer.close()
await writer.wait_closed()
async def start(self) -> None: async def start(self) -> None:
server = await asyncio.start_server( server = await asyncio.start_server(