63 lines
1.7 KiB
Python
63 lines
1.7 KiB
Python
# SPDX-FileCopyrightText: 2023 Michal Pokusa
|
|
#
|
|
# SPDX-License-Identifier: Unlicense
|
|
import os
|
|
import re
|
|
|
|
import socketpool
|
|
import wifi
|
|
|
|
from adafruit_httpserver import FileResponse, Request, Response, Server
|
|
|
|
try:
|
|
from adafruit_templateengine import render_template
|
|
except ImportError as e:
|
|
raise ImportError("This example requires adafruit_templateengine library.") from e
|
|
|
|
|
|
pool = socketpool.SocketPool(wifi.radio)
|
|
server = Server(pool, "/static", debug=True)
|
|
|
|
# Create /static directory if it doesn't exist
|
|
try:
|
|
os.listdir("/static")
|
|
except OSError as e:
|
|
raise OSError("Please create a /static directory on the CIRCUITPY drive.") from e
|
|
|
|
|
|
def is_file(path: str):
|
|
return (os.stat(path.rstrip("/"))[0] & 0b_11110000_00000000) == 0b_10000000_00000000
|
|
|
|
|
|
@server.route("/")
|
|
def directory_listing(request: Request):
|
|
path = request.query_params.get("path", "").replace("%20", " ")
|
|
|
|
# Preventing path traversal by removing all ../ from path
|
|
path = re.sub(r"\/(\.\.)\/|\/(\.\.)|(\.\.)\/", "/", path).strip("/")
|
|
|
|
# If path is a file, return it as a file response
|
|
if is_file(f"/static/{path}"):
|
|
return FileResponse(request, path)
|
|
|
|
items = sorted(
|
|
[
|
|
item + ("" if is_file(f"/static/{path}/{item}") else "/")
|
|
for item in os.listdir(f"/static/{path}")
|
|
],
|
|
key=lambda item: not item.endswith("/"),
|
|
)
|
|
|
|
# Otherwise, return a directory listing
|
|
return Response(
|
|
request,
|
|
render_template(
|
|
"directory_listing.tpl.html",
|
|
context={"path": path, "items": items},
|
|
),
|
|
content_type="text/html",
|
|
)
|
|
|
|
|
|
# Start the server.
|
|
server.serve_forever(str(wifi.radio.ipv4_address))
|