| 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"" |