packages feed

df1-wai-0.1: lib/Df1/Wai.hs

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Df1.Wai (request, response) where

import Data.ByteString.Builder qualified as BB
import Data.Functor
import Data.List qualified as List
import Data.Maybe
import Data.Text.Encoding qualified as T
import Data.Text.Lazy qualified as TL
import Data.Text.Lazy.Encoding qualified as TL
import Df1
import Network.HTTP.Types
import Network.Wai

request :: Request -> [(Key, Value)]
request r =
   mconcat
      [ maybeToList $
         requestHeaderHost r <&> \x ->
            ("host", value (T.decodeUtf8 x))
      ,
         [ ("method", value (T.decodeUtf8 (requestMethod r)))
         ,
            ( "path"
            , value (TL.fromChunks ("/" : List.intersperse "/" (pathInfo r)))
            )
         ,
            ( "query"
            , value $
               TL.decodeUtf8 $
                  BB.toLazyByteString $
                     "?" <> renderQueryBuilder False (queryString r)
            )
         , ("peer", value (show (remoteHost r)))
         ]
      , maybeToList $
         requestHeaderReferer r <&> \x ->
            ("referer", value (T.decodeUtf8 x))
      ]

response :: Response -> [(Key, Value)]
response r =
   [ ("status", value (statusCode (responseStatus r)))
   ]