eggserve-core 0.1.1

Security policy, path confinement, and static-serving primitives for eggserve
Documentation
"""Safe file download handler using eggserve primitives.

This example resolves user-provided download names through SecureRoot
to prevent path traversal. It distinguishes not-found from denied and
uses the response planner for metadata. Never join user paths directly
to a filesystem root.
"""

from eggserve.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import unquote
from eggserve.lowlevel import SecureRoot, StaticPolicy

# eggserve enforces: path confinement, symlink denial, dotfile denial
root = SecureRoot("downloads", policy=StaticPolicy())


class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        # Extract the filename from the URL path
        name = unquote(self.path.split("?", 1)[0].lstrip("/"))
        if not name:
            self.send_error(400, "No file specified")
            return

        # Resolve through SecureRoot — never join paths manually
        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