Source code
Revision control
Copy as Markdown
Other Tools
"""
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")