Source code

Revision control

Copy as Markdown

Other Tools

"""Handler to receive message from protected audience worklets, such as
sendReportTo() and forDebuggingOnly.reportAdAuctionWin().
This handler only supports read and write operations from the URL parameters.
"""
import json
from typing import List, Tuple
from wptserve.request import Request
from wptserve.response import Response
Header = Tuple[str, str]
ResponseTuple = Tuple[int, List[Header], str]
def main(request: Request, response: Response) -> ResponseTuple:
operation = request.GET.first(b"operation").decode('utf-8')
uuid = request.GET.first(b"uuid").decode('utf-8')
if operation == "read":
with request.server.stash.lock:
stash_reports = request.server.stash.take(key=uuid)
if stash_reports is None:
stash_reports = []
else:
request.server.stash.put(key=uuid, value=stash_reports)
return 200, [("Content-Type", "application/json")], json.dumps(stash_reports)
elif operation == "write":
report = request.GET.first(b"report").decode('utf-8')
if report is None:
return 400, [("Content-Type", "application/json")], json.dumps({'error': 'Missing report.', 'uuid': uuid})
with request.server.stash.lock:
stash_reports = request.server.stash.take(key=uuid)
if stash_reports is None:
stash_reports = []
stash_reports.append(report)
request.server.stash.put(key=uuid, value=stash_reports)
return 200, [("Content-Type", "application/json")], json.dumps({'msg': 'Recorded report ' + uuid})
else:
return 400, [("Content-Type", "application/json")], json.dumps({'error': 'Invalid operation.', 'uuid': uuid})