webhooks: parse JSON request bodies

This commit is contained in:
Emery Hemingway 2023-12-26 01:12:30 +02:00
parent 92dbdbe438
commit 0d789361d6
2 changed files with 14 additions and 9 deletions

View File

@ -3,9 +3,9 @@
## An actor for relaying Webhooks. ## 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, syndicate/[bags, relays]
import syndicate/protocols/[http, transportAddress] 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): for key, val in decodeQuery(req.url.query):
result.query[Symbol key] = result.query[Symbol key] =
@[QueryValue(orKind: QueryValueKind.string, string: val)] @[QueryValue(orKind: QueryValueKind.string, string: val)]
if req.body == "": let contentType = req.headers.getOrDefault("content-type")
result.body = RequestBody(orKind: RequestBodyKind.absent) if req.body.len > 0:
else: result.body = RequestBody(orKind: RequestBodyKind.present)
result.body = RequestBody( case contentType.toString
orKind: RequestBodyKind.present, of "application/json":
present: cast[seq[byte]](req.body)) 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 = proc bootWebhookActor*(turn: var Turn; root: Cap): Actor =
spawn("webhooks", turn) do (turn: var Turn): spawn("webhooks", turn) do (turn: var Turn):

View File

@ -1,6 +1,6 @@
# Package # Package
version = "20231214" version = "20231226"
author = "Emery Hemingway" author = "Emery Hemingway"
description = "Utilites for Syndicated Actors and Synit" description = "Utilites for Syndicated Actors and Synit"
license = "unlicense" license = "unlicense"