counting-executor.py (1370B)
1 import json 2 import os.path 3 import time 4 from wptserve.pipes import template 5 6 def main(request, response): 7 response.headers.set(b"Content-Type", b"text/html") 8 response.headers.set(b"Cache-Control", b"no-store") 9 10 uuid = request.GET[b"uuid"] 11 12 # The lock is needed because the server receives concurrent requests to the 13 # same `uuid` e.g. due to `race-network-and-fetch-handler`. 14 with request.server.stash.lock: 15 request_count = request.server.stash.take(uuid) 16 if request_count is None: 17 request_count = {"prefetch": 0, "nonPrefetch": 0} 18 19 if b"check" in request.GET: 20 response.content = json.dumps(request_count) 21 return 22 23 prefetch = request.headers.get( 24 "Sec-Purpose", b"").decode("utf-8").startswith("prefetch") 25 26 request_count["prefetch" if prefetch else "nonPrefetch"] += 1 27 request.server.stash.put(uuid, request_count) 28 29 # This delay is after the `stash.put` above so that the request is counted 30 # upon received (i.e. we don't have to wait for the delay completion). 31 if b"delay" in request.GET: 32 time.sleep(float(request.GET[b"delay"]) / 1E3) 33 34 if b"location" in request.GET: 35 response.status = 302 36 response.headers.set(b"Location", request.GET[b"location"]) 37 return 38 39 response.content = template( 40 request, 41 open(os.path.join(os.path.dirname(__file__), "executor.sub.html"), "rb").read())