fedi/src/Fedi/Requests.hs
2024-12-17 10:46:59 +02:00

56 lines
1.4 KiB
Haskell

{-# language DataKinds #-}
module Fedi.Requests where
import Data.Aeson qualified as A
import Fedi.Helpers
import Fedi.UserDetails
import Fedi.Crypto
import Network.HTTP.Req qualified as Req
import Data.ByteString.Lazy qualified as BSL
import Text.URI qualified as URI
sendPost
:: (A.FromJSON output, A.ToJSON input)
=> UserDetails
-> String
-> input
-> IO output
sendPost details url payload = do
let encoded = BSL.toStrict $ A.encode payload
signed <- sign details encoded
uri <- URI.mkURI $ fromString url
(url', scheme) <- maybe (throw "couldn't parse uri") pure (Req.useHttpsURI uri)
print ("url", url')
Req.runReq Req.defaultHttpConfig do
r <-
Req.req
Req.POST
url'
(Req.ReqBodyBs encoded)
Req.jsonResponse
( scheme
<> Req.header "ContentType" "application/activity+json"
<> Req.header "Digest" signed.signedDigest
<> Req.header "Signature" signed.signedMessage
)
pure $ Req.responseBody r
sendGet :: (A.FromJSON a) => String -> IO a
sendGet url = do
uri <- URI.mkURI $ fromString url
(url', scheme) <- maybe (throw "couldn't parse uri") pure (Req.useHttpsURI uri)
print ("url", url')
Req.runReq Req.defaultHttpConfig do
r <-
Req.req
Req.GET
url'
Req.NoReqBody
Req.jsonResponse
( scheme
<> Req.header "ContentType" "application/activity+json"
)
pure $ Req.responseBody r