summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/common/dispatcher/dispatcher.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/common/dispatcher/dispatcher.py')
-rw-r--r--testing/web-platform/tests/common/dispatcher/dispatcher.py53
1 files changed, 53 insertions, 0 deletions
diff --git a/testing/web-platform/tests/common/dispatcher/dispatcher.py b/testing/web-platform/tests/common/dispatcher/dispatcher.py
new file mode 100644
index 0000000000..9fe7a38ac8
--- /dev/null
+++ b/testing/web-platform/tests/common/dispatcher/dispatcher.py
@@ -0,0 +1,53 @@
+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;