about summary refs log tree commit diff stats
path: root/adapter/protocol/data.nim
diff options
context:
space:
mode:
Diffstat (limited to 'adapter/protocol/data.nim')
-rw-r--r--adapter/protocol/data.nim29
1 files changed, 29 insertions, 0 deletions
diff --git a/adapter/protocol/data.nim b/adapter/protocol/data.nim
new file mode 100644
index 00000000..7b022976
--- /dev/null
+++ b/adapter/protocol/data.nim
@@ -0,0 +1,29 @@
+import std/envvars
+import std/base64
+import std/strutils
+
+import utils/twtstr
+
+proc main() =
+  let str = getEnv("MAPPED_URI_PATH")
+  const si = "data:".len # start index
+  var ct = str.until(',', si)
+  for c in ct:
+    if c notin AsciiAlphaNumeric and c != '/':
+      stdout.write("Cha-Control: ConnectionError -7 invalid data URL")
+      return
+  let sd = si + ct.len + 1 # data start
+  let body = percentDecode(str, sd)
+  if ct.endsWith(";base64"):
+    try:
+      let d = base64.decode(body) # decode from ct end + 1
+      ct.setLen(ct.len - ";base64".len) # remove base64 indicator
+      stdout.write("Content-Type: " & ct & "\n\n")
+      stdout.write(d)
+    except ValueError:
+      stdout.write("Cha-Control: ConnectionError -7 invalid data URL")
+  else:
+    stdout.write("Content-Type: " & ct & "\n\n")
+    stdout.write(body)
+
+main()