| """Endpoint to return signed additional bids in the appropriate response header. |
| |
| Additional bids are returned using the "Ad-Auction-Additional-Bid" response |
| header, as described at |
| https://github.com/WICG/turtledove/blob/main/FLEDGE.md#63-http-response-headers. |
| |
| This script generates an "Ad-Auction-Additional-Bid" response header for each of |
| the pre-formatted additional bid header values provided in a JSON list-valued |
| `additionalBidHeaderValues` query parameter. |
| |
| All requests to this endpoint requires a "Sec-Ad-Auction-Fetch" request header |
| with a value of b"?1"; this entrypoint otherwise returns a 400 response. |
| """ |
| |
| import json |
| |
| import fledge.tentative.resources.fledge_http_server_util as fledge_http_server_util |
| |
| |
| class BadRequestError(Exception): |
| pass |
| |
| |
| def main(request, response): |
| try: |
| if fledge_http_server_util.handle_cors_headers_fail_if_preflight(request, response): |
| return |
| |
| # Verify that Sec-Ad-Auction-Fetch is present |
| if request.headers.get("Sec-Ad-Auction-Fetch", default=b"").decode("utf-8") != "?1": |
| raise BadRequestError("Sec-Ad-Auction-Fetch missing or unexpected value; expected '?1'") |
| |
| # Return each additional bid in its own header |
| additional_bid_header_values = request.GET.get(b"additionalBidHeaderValues", default=b"").decode("utf-8") |
| if not additional_bid_header_values: |
| raise BadRequestError("Missing 'additionalBidHeaderValues' parameter") |
| for additional_bid_header_value in json.loads(additional_bid_header_values): |
| response.headers.append( |
| b"Ad-Auction-Additional-Bid", additional_bid_header_value.encode("utf-8")) |
| |
| response.status = (200, b"OK") |
| response.headers.set(b"Content-Type", b"text/plain") |
| |
| except BadRequestError as error: |
| response.status = (400, b"Bad Request") |
| response.headers.set(b"Content-Type", b"text/plain") |
| response.content = str(error) |
| |
| except Exception as exception: |
| response.status = (500, b"Internal Server Error") |
| response.content = str(exception) |