summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/fenced-frame/resources/key-value-store.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/fenced-frame/resources/key-value-store.py')
-rw-r--r--testing/web-platform/tests/fenced-frame/resources/key-value-store.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/testing/web-platform/tests/fenced-frame/resources/key-value-store.py b/testing/web-platform/tests/fenced-frame/resources/key-value-store.py
new file mode 100644
index 0000000000..c9fd81b2a3
--- /dev/null
+++ b/testing/web-platform/tests/fenced-frame/resources/key-value-store.py
@@ -0,0 +1,46 @@
+"""Key-Value store server.
+
+The request takes "key=" and "value=" URL parameters. The key must be UUID
+generated by token().
+
+- When only the "key=" is specified, serves a 200 response whose body contains
+ the stored value specified by the key. If the stored value doesn't exist,
+ serves a 200 response with an empty body.
+- When both the "key=" and "value=" are specified, stores the pair and serves
+ a 200 response without body.
+"""
+
+
+def main(request, response):
+ key = request.GET.get(b"key")
+ value = request.GET.get(b"value")
+
+ # Store the value.
+ # We have two ways to check the truthiness of `value`:
+ # 1. `if value`
+ # 2. `if value != None`
+ # While (1) is the most intuitive, we actually need (2), which is a looser
+ # check. We need the looser check so that if the URL contains `&value=` to
+ # set the value equal to the empty string (a case we need to support), this
+ # condition still evaluates to true and we enter this branch.
+ if value != None:
+ # We opted for (2) above which is the looser of the truthiness tests
+ # that lets empty strings into this branch. So you might think that when
+ # the URL contains `&value=`, then the `value` variable here would be
+ # equal `""`, but instead it equals the empty byte string. If you just
+ # store that empty byte string into the stash and retrieve it later, you
+ # actually get <Not set> because it doesn't recognize the empty byte
+ # string as a real value, so we instead have to override it to the empty
+ # normal string, and then we can store it for later use. This is
+ # because we have to support storage and retrieval of empty strings.
+ if type(value) is bytes and value == b'':
+ value = ""
+
+ request.server.stash.put(key, value)
+ return (200, [], b"")
+
+ # Get the value.
+ data = request.server.stash.take(key)
+ if not data and data != "":
+ return (200, [], b"<Not set>")
+ return (200, [], data)