def main(request, response): def fail(message): response.content = "FAIL " + request.method + ": " + str(message) def getState(token): server_state = request.server.stash.take(token) if not server_state: return "Uninitialized" return server_state def setState(state, token): request.server.stash.put(token, state) response.headers.set("Access-Control-Allow-Origin", request.headers.get("origin")) response.headers.set("Access-Control-Allow-Credentials", "true") token = request.GET.first("token", None) state = getState(token) if state == "Uninitialized": if request.method == "OPTIONS": response.headers.set("Access-Control-Allow-Methods", "PUT") response.headers.set("Access-Control-Max-Age", 10) setState("OPTIONSSent", token) else: fail(state) elif state == "OPTIONSSent": if request.method == "PUT": response.content = "PASS: First PUT request." setState("FirstPUTSent", token) else: fail(state) elif state == "FirstPUTSent": if request.method == "OPTIONS": response.headers.set("Access-Control-Allow-Methods", "PUT, XMETHOD") response.headers.set("Access-Control-Allow-Headers", "x-test") setState("SecondOPTIONSSent", token) elif request.method == "PUT": fail("Second PUT request sent without preflight") else: fail(state) elif state == "SecondOPTIONSSent": if request.method == "PUT" or request.method == "XMETHOD": response.content = "PASS: Second OPTIONS request was sent." else: fail(state) else: fail(state)