Compare commits
7 Commits
11fccc6fc7
...
1.1.2
Author | SHA1 | Date | |
---|---|---|---|
ee4d1f90a3 | |||
d64a4db140 | |||
e2579d3179 | |||
0262aea690 | |||
45156ab4ae | |||
231a9282ea | |||
7e3820fda0 |
@@ -1,4 +1,4 @@
|
|||||||
name="debweb 1.1.0"
|
name="debweb 1.1.2"
|
||||||
proxied=False
|
proxied=False
|
||||||
|
|
||||||
addr="localhost"
|
addr="localhost"
|
||||||
|
59
main.py
59
main.py
@@ -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 = 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,20 +100,32 @@ class WebServer:
|
|||||||
resp = await f.read()
|
resp = await f.read()
|
||||||
|
|
||||||
files = ""
|
files = ""
|
||||||
for file_name in sorted(os.listdir(file_path)): # TODO: добавить настройки отображения файла
|
base_path = os.path.relpath(file_path, self.directory).replace('\\', '/')
|
||||||
file = "/".join(file_path.split("/")[1:]) +"/" + file_name
|
if base_path == '.':
|
||||||
|
base_path = ''
|
||||||
|
|
||||||
if os.path.isdir(file_path + "/" + file_name):
|
for item in sorted(os.listdir(file_path)):
|
||||||
file_name = "/" + file_name
|
item_path = os.path.join(file_path, item)
|
||||||
|
is_dir = os.path.isdir(item_path)
|
||||||
|
|
||||||
modify_time = (os.path.getmtime(file_path + "/" + file_name))
|
if base_path:
|
||||||
|
rel_path = f"{base_path}/{item}"
|
||||||
|
else:
|
||||||
|
rel_path = item
|
||||||
|
|
||||||
|
if is_dir:
|
||||||
|
rel_path += "/"
|
||||||
|
item += "/"
|
||||||
|
|
||||||
|
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="/{file}">{file_name}</a> | {formatted_time}<br>'
|
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.replace("//", "/")
|
|
||||||
resp = resp.encode()
|
resp = resp.encode()
|
||||||
headers = (
|
headers = (
|
||||||
"HTTP/1.1 200 OK\r\n"
|
"HTTP/1.1 200 OK\r\n"
|
||||||
@@ -113,23 +135,32 @@ class WebServer:
|
|||||||
"\r\n"
|
"\r\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
writer.write("".join(headers).encode() + 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(
|
||||||
|
Reference in New Issue
Block a user