import base64
def maybeBoolToJavascriptLiteral(value):
if value == None:
return "undefined"
if value == True:
return "true"
if value == False:
return "false"
raise ValueError("Expected bool or None")
def main(request, response):
destination = request.headers.get("sec-fetch-dest").decode("utf-8")
gpcValue = request.headers.get("sec-gpc") == b'1'
expectedGPCValue = request.GET.get(b"gpc") == b"true"
inFrame = request.GET.get(b"framed") != None
destinationDescription = "framed " + destination if inFrame else destination
if destination == "document" or destination == "iframe":
response.headers.set('Content-Type', 'text/html');
return f"""
Sec-GPC {destination}
""" + (f"""
""" if destination == "document" else "") + f"""
"""
elif destination == "image":
if gpcValue == expectedGPCValue:
return (200, [(b"Content-Type", b"image/png")], base64.b64decode("iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAEUlEQVR42mP8nzaTAQQYYQwALssD/5ca+r8AAAAASUVORK5CYII="))
return (400, [], "")
elif destination == "script":
response.headers.set('Content-Type', 'application/javascript');
return f"""
debugger;
test(function(t) {{
assert_equals({maybeBoolToJavascriptLiteral(gpcValue)}, {maybeBoolToJavascriptLiteral(expectedGPCValue)}, "Expected Sec-GPC value ({maybeBoolToJavascriptLiteral(expectedGPCValue)}) is on the {destinationDescription} fetch");
}}, `Expected Sec-GPC value ({maybeBoolToJavascriptLiteral(expectedGPCValue)}) is on the {destinationDescription} fetch`);
"""
elif destination == "worker" or destination == "sharedworker" or destination == "serviceworker":
response.headers.set('Content-Type', 'application/javascript');
return f"""
importScripts("/resources/testharness.js");
test(function(t) {{
assert_equals({maybeBoolToJavascriptLiteral(gpcValue)}, {maybeBoolToJavascriptLiteral(expectedGPCValue)}, "Expected Sec-GPC value ({maybeBoolToJavascriptLiteral(expectedGPCValue)}) is on the {destinationDescription} fetch");
}}, `Expected Sec-GPC value ({maybeBoolToJavascriptLiteral(expectedGPCValue)}) is on the {destinationDescription} fetch`);
done();
"""
raise ValueError("Unexpected destination")