blob: 89707470d25a09f7d87f6f5f6349d7155af078f8 [file] [log] [blame]
# General bidding logic script. Depending on query parameters, it can
# simulate a variety of network errors, and its generateBid() and
# reportWin() functions can have arbitrary Javascript code injected
# in them. generateBid() will by default return a bid of 9 for the
# first ad.
def main(request, response):
error = request.GET.first(b"error", None)
if error == b"close-connection":
# Close connection without writing anything, to simulate a network
# error. The write call is needed to avoid writing the default headers.
response.writer.write("")
response.close_connection = True
return
if error == b"http-error":
response.status = (404, b"OK")
else:
response.status = (200, b"OK")
if error == b"wrong-content-type":
response.headers.set(b"Content-Type", b"application/json")
elif error != b"no-content-type":
response.headers.set(b"Content-Type", b"application/javascript")
if error == b"bad-allow-fledge":
response.headers.set(b"Ad-Auction-Allowed", b"sometimes")
elif error == b"fledge-not-allowed":
response.headers.set(b"Ad-Auction-Allowed", b"false")
elif error != b"no-allow-fledge":
response.headers.set(b"Ad-Auction-Allowed", b"true")
body = b''
if error == b"no-body":
return body
if error != b"no-generateBid":
body += b"""
function generateBid(interestGroup, auctionSignals, perBuyerSignals,
trustedBiddingSignals, browserSignals,
directFromSellerSignals) {
{{GET[generateBid]}};
return {
'bid': 9,
'render': interestGroup.ads[0].renderURL
};
}"""
bid = request.GET.first(b"bid", None)
if bid != None:
body = body.replace(b"9", bid)
if error != b"no-reportWin":
body += b"""
function reportWin(auctionSignals, perBuyerSignals, sellerSignals,
browserSignals, directFromSellerSignals) {
{{GET[reportWin]}};
}"""
return body