""" Dynamic Python WPT server handler for Web App Manifest (WAM) JSON files. Logs incoming request metadata into request.server.stash under `id`. Supports declarative query parameters: - `id`: Unique test run token (generated by token() in JS test). - `redirect_location`: Target URL for redirect. - `redirect_status`: HTTP redirect status code (default 302). - `status`: HTTP response status code (default 200). - `content_type`: Custom Content-Type header (default: application/manifest+json). - `body`: Custom raw response body (default: JSON with serviceworker & icons). """ import json import os import sys resources_dir = os.path.dirname(__file__) if resources_dir not in sys.path: sys.path.insert(0, resources_dir) from server_constants import STASH_PATH def main(request, response): test_id = request.GET.get(b"id") if not test_id: response.status = 400 response.headers.set(b"Content-Type", b"text/plain") response.content = b"Missing required 'id' query parameter" return # Record incoming HTTP request metadata into server stash for test verification stash = request.server.stash with stash.lock: logs = stash.take(test_id, path=STASH_PATH) or [] header_dict = { k.decode("utf-8").lower(): b", ".join(v).decode("utf-8") for k, v in request.headers.items() } logs.append({ "endpoint": "web-app-manifest", "step": "web-app-manifest", "method": request.method, "url": request.url, "headers": header_dict, }) stash.put(test_id, logs, path=STASH_PATH) redirect_location = request.GET.get(b"redirect_location") if redirect_location: redirect_status = int(request.GET.get(b"redirect_status", b"302")) response.status = redirect_status response.headers.set(b"Location", redirect_location) response.content = b"Redirecting web app manifest..." return status = int(request.GET.get(b"status", b"200")) response.status = status content_type = request.GET.get(b"content_type", b"application/manifest+json") response.headers.set(b"Content-Type", content_type) response.headers.set(b"Access-Control-Allow-Origin", b"*") custom_body = request.GET.get(b"body") if custom_body is not None: response.content = custom_body else: default_wam = { "name": "Default Test Payment App", "icons": [{ "src": "/images/rgrg-256x256.png", "sizes": "256x256", "type": "image/png", }], "serviceworker": { "src": "app-sw.js", "scope": "./", }, } response.content = json.dumps(default_wam).encode("utf-8")