import json
from wptserve.utils import isomorphic_decode
# A server used to store and retrieve arbitrary data.
# This is used by: ./dispatcher.js
def main(request, response):
# This server is configured so that is accept to receive any requests and
# any cookies the web browser is willing to send.
response.headers.set(b"Access-Control-Allow-Credentials", b"true")
response.headers.set(b'Access-Control-Allow-Methods', b'OPTIONS, GET, POST')
response.headers.set(b'Access-Control-Allow-Headers', b'Content-Type')
response.headers.set(b"Access-Control-Allow-Origin", request.headers.get(b"origin") or '*')
if b"cacheable" in request.GET:
response.headers.set(b"Cache-Control", b"max-age=31536000")
else:
response.headers.set(b'Cache-Control', b'no-cache, no-store, must-revalidate')
# CORS preflight
if request.method == u'OPTIONS':
return b''
uuid = request.GET[b'uuid']
stash = request.server.stash;
# The stash is accessed concurrently by many clients. A lock is used to
# avoid unterleaved read/write from different clients.
with stash.lock:
queue = stash.take(uuid, '/common/dispatcher') or [];
# Push into the |uuid| queue, the requested headers.
if b"show-headers" in request.GET:
headers = {};
for key, value in request.headers.items():
headers[isomorphic_decode(key)] = isomorphic_decode(request.headers[key])
headers = json.dumps(headers);
queue.append(headers);
ret = b'';
# Push into the |uuid| queue, the posted data.
elif request.method == u'POST':
queue.append(request.body)
ret = b'done'
# Pull from the |uuid| queue, the posted data.
else:
if len(queue) == 0:
ret = b'not ready'
else:
ret = queue.pop(0)
stash.put(uuid, queue, '/common/dispatcher')
return ret;