def main(request, response): | |
headers = [(b"Content-Type", b"text/plain")] | |
stashed_data = {b'control_request_headers': b"", b'preflight': b"0", b'preflight_referrer': b""} | |
token = None | |
if b"token" in request.GET: | |
token = request.GET.first(b"token") | |
if b"origin" in request.GET: | |
for origin in request.GET[b'origin'].split(b", "): | |
headers.append((b"Access-Control-Allow-Origin", origin)) | |
else: | |
headers.append((b"Access-Control-Allow-Origin", b"*")) | |
if b"clear-stash" in request.GET: | |
if request.server.stash.take(token) is not None: | |
return headers, b"1" | |
else: | |
return headers, b"0" | |
if b"credentials" in request.GET: | |
headers.append((b"Access-Control-Allow-Credentials", b"true")) | |
if request.method == u"OPTIONS": | |
if not b"Access-Control-Request-Method" in request.headers: | |
response.set_error(400, u"No Access-Control-Request-Method header") | |
return b"ERROR: No access-control-request-method in preflight!" | |
if request.headers.get(b"Accept", b"") != b"*/*": | |
response.set_error(400, u"Request does not have 'Accept: */*' header") | |
return b"ERROR: Invalid access in preflight!" | |
if b"control_request_headers" in request.GET: | |
stashed_data[b'control_request_headers'] = request.headers.get(b"Access-Control-Request-Headers", None) | |
if b"max_age" in request.GET: | |
headers.append((b"Access-Control-Max-Age", request.GET[b'max_age'])) | |
if b"allow_headers" in request.GET: | |
headers.append((b"Access-Control-Allow-Headers", request.GET[b'allow_headers'])) | |
if b"allow_methods" in request.GET: | |
headers.append((b"Access-Control-Allow-Methods", request.GET[b'allow_methods'])) | |
preflight_status = 200 | |
if b"preflight_status" in request.GET: | |
preflight_status = int(request.GET.first(b"preflight_status")) | |
stashed_data[b'preflight'] = b"1" | |
stashed_data[b'preflight_referrer'] = request.headers.get(b"Referer", b"") | |
stashed_data[b'preflight_user_agent'] = request.headers.get(b"User-Agent", b"") | |
if token: | |
request.server.stash.put(token, stashed_data) | |
return preflight_status, headers, b"" | |
if token: | |
data = request.server.stash.take(token) | |
if data: | |
stashed_data = data | |
if b"checkUserAgentHeaderInPreflight" in request.GET and request.headers.get(b"User-Agent") != stashed_data[b'preflight_user_agent']: | |
return 400, headers, b"ERROR: No user-agent header in preflight" | |
#use x-* headers for returning value to bodyless responses | |
headers.append((b"Access-Control-Expose-Headers", b"x-did-preflight, x-control-request-headers, x-referrer, x-preflight-referrer, x-origin")) | |
headers.append((b"x-did-preflight", stashed_data[b'preflight'])) | |
if stashed_data[b'control_request_headers'] != None: | |
headers.append((b"x-control-request-headers", stashed_data[b'control_request_headers'])) | |
headers.append((b"x-preflight-referrer", stashed_data[b'preflight_referrer'])) | |
headers.append((b"x-referrer", request.headers.get(b"Referer", b""))) | |
headers.append((b"x-origin", request.headers.get(b"Origin", b""))) | |
if token: | |
request.server.stash.put(token, stashed_data) | |
return headers, b"" |