module Network.Haskbot.Internal.Request
( Params
, jsonContentType
, textContentType
, getPostParams
, headOnly
, getParamsMap
, optParam
, reqParam
) where
import Control.Monad.Error (liftIO, throwError)
import Data.ByteString.Lazy (fromStrict)
import Data.Text (Text)
import Data.Text.Encoding (decodeUtf8)
import qualified Data.Map as M
import qualified Network.HTTP.Types as N
import qualified Network.Wai as W
import Network.Haskbot.Internal.Environment (HaskbotM)
type Params = M.Map Text Text
jsonContentType :: N.Header
jsonContentType = (N.hContentType, "application/json")
textContentType :: N.Header
textContentType = (N.hContentType, "text/plain")
headOnly :: N.Status -> W.Response
headOnly status = W.responseLBS status [] . fromStrict $ N.statusMessage status
getParamsMap :: W.Request -> IO Params
getParamsMap req = do
body <- W.requestBody req
return . M.fromList . map decode $ N.parseSimpleQuery body
where
decode (k,v) = (decodeUtf8 k, decodeUtf8 v)
getPostParams :: W.Request -> HaskbotM Params
getPostParams req
| isPost = liftIO $ getParamsMap req
| otherwise = throwError N.status403
where
isPost = W.requestMethod req == N.methodPost
optParam :: Params -> Text -> HaskbotM (Maybe Text)
optParam pMap key = return $ M.lookup key pMap
reqParam :: Params -> Text -> HaskbotM Text
reqParam pMap key =
case M.lookup key pMap of
Just p -> return p
_ -> throwError N.badRequest400