from eggserve.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import unquote
from eggserve.lowlevel import SecureRoot, StaticPolicy
root = SecureRoot("downloads", policy=StaticPolicy())
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
name = unquote(self.path.split("?", 1)[0].lstrip("/"))
if not name:
self.send_error(400, "No file specified")
return
resource = root.resolve_path(name)
if resource.is_file:
plan = resource.file.plan_response("GET", list(self.headers.items()))
self.send_response(plan.status)
for n, v in plan.headers:
self.send_header(n, v)
self.end_headers()
if plan.body_kind == "file_full":
body = resource.file.body_for_plan(plan)
self.wfile.write(body.read_all())
elif resource.is_denied:
self.send_error(403, "Access denied")
else:
self.send_error(404, "File not found")
def log_message(self, format, *args):
pass
if __name__ == "__main__":
try:
with HTTPServer(("127.0.0.1", 8000), Handler) as server:
print("Download server on http://127.0.0.1:8000")
server.serve_forever()
except KeyboardInterrupt:
pass