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