From 0d789361d63a805054708bf73f12377cd623863f Mon Sep 17 00:00:00 2001 From: Emery Hemingway Date: Tue, 26 Dec 2023 01:12:30 +0200 Subject: [PATCH] webhooks: parse JSON request bodies --- src/syndesizer/webhooks.nim | 21 +++++++++++++-------- syndicate_utils.nimble | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/syndesizer/webhooks.nim b/src/syndesizer/webhooks.nim index 8ce049e..b56843e 100644 --- a/src/syndesizer/webhooks.nim +++ b/src/syndesizer/webhooks.nim @@ -3,9 +3,9 @@ ## An actor for relaying Webhooks. -import std/[asyncdispatch, asynchttpserver, net, sets, strutils, tables, uri] +import std/[asyncdispatch, asynchttpserver, json, net, sets, strutils, tables, uri] -import preserves +import preserves, preserves/jsonhooks import syndicate, syndicate/[bags, relays] import syndicate/protocols/[http, transportAddress] @@ -31,12 +31,17 @@ proc toRecord(req: Request; seqnum: BiggestInt; path: seq[string]): HttpRequest for key, val in decodeQuery(req.url.query): result.query[Symbol key] = @[QueryValue(orKind: QueryValueKind.string, string: val)] - if req.body == "": - result.body = RequestBody(orKind: RequestBodyKind.absent) - else: - result.body = RequestBody( - orKind: RequestBodyKind.present, - present: cast[seq[byte]](req.body)) + let contentType = req.headers.getOrDefault("content-type") + if req.body.len > 0: + result.body = RequestBody(orKind: RequestBodyKind.present) + case contentType.toString + of "application/json": + var js = parseJson req.body + result.body.present = js.toPreserve + of "application/octet-stream": + result.body.present = cast[seq[byte]](req.body).toPreserve + else: + result.body.present = req.body.toPreserve proc bootWebhookActor*(turn: var Turn; root: Cap): Actor = spawn("webhooks", turn) do (turn: var Turn): diff --git a/syndicate_utils.nimble b/syndicate_utils.nimble index cb88ab1..f8bb898 100644 --- a/syndicate_utils.nimble +++ b/syndicate_utils.nimble @@ -1,6 +1,6 @@ # Package -version = "20231214" +version = "20231226" author = "Emery Hemingway" description = "Utilites for Syndicated Actors and Synit" license = "unlicense"