import json import os.path import time from wptserve.pipes import template def main(request, response): response.headers.set(b"Content-Type", b"text/html") response.headers.set(b"Cache-Control", b"no-store") uuid = request.GET[b"uuid"] # The lock is needed because the server receives concurrent requests to the # same `uuid` e.g. due to `race-network-and-fetch-handler`. with request.server.stash.lock: request_count = request.server.stash.take(uuid) if request_count is None: request_count = {"prefetch": 0, "nonPrefetch": 0} if b"check" in request.GET: response.content = json.dumps(request_count) return prefetch = request.headers.get( "Sec-Purpose", b"").decode("utf-8").startswith("prefetch") request_count["prefetch" if prefetch else "nonPrefetch"] += 1 request.server.stash.put(uuid, request_count) # This delay is after the `stash.put` above so that the request is counted # upon received (i.e. we don't have to wait for the delay completion). if b"delay" in request.GET: time.sleep(float(request.GET[b"delay"]) / 1E3) if b"location" in request.GET: response.status = 302 response.headers.set(b"Location", request.GET[b"location"]) return response.content = template( request, open(os.path.join(os.path.dirname(__file__), "executor.sub.html"), "rb").read())