Adafruit_CircuitPython_HTTP.../examples/httpserver_templates.py
2025-05-16 16:11:43 +00:00

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))