{-# language OverloadedStrings #-} module Web.Firefly.Internal.Utils where import Data.Bifunctor import Data.Maybe import qualified Data.Map as M import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as LBS import qualified Data.Text.Lazy as LT import qualified Data.Text.Lazy.Encoding as LT import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.CaseInsensitive as CI import qualified Network.HTTP.Types.Header as HTTP import Network.HTTP.Types.URI import Web.Firefly.Types toBS :: T.Text -> BS.ByteString toBS = T.encodeUtf8 toLBS :: T.Text -> LBS.ByteString toLBS = LT.encodeUtf8 . LT.fromStrict fromBS :: BS.ByteString -> T.Text fromBS = T.decodeUtf8 fromLBS :: LBS.ByteString -> T.Text fromLBS = LT.toStrict . LT.decodeUtf8 mkHeader :: T.Text -> T.Text -> HTTP.Header mkHeader headerName headerVal = (CI.mk (toBS headerName), toBS headerVal) convertHeaders :: HTTP.RequestHeaders -> HeaderMap convertHeaders = M.fromListWith mappend . fmap (bimap mapName mapVal) where mapName = CI.map fromBS mapVal val = [fromBS val] fromHeaderMap :: HeaderMap -> HTTP.ResponseHeaders fromHeaderMap hm = do (headerName, values) <- M.toList hm [(CI.map toBS headerName, toBS value) | value <- values] qsToList :: Query -> [(T.Text, Maybe T.Text)] qsToList = fmap (bimap fromBS (fmap fromBS)) -- Get all occurances of query params convertQueries :: Query -> MultiQueryMap convertQueries = M.fromListWith (flip mappend) . fmap (second maybeToList) . qsToList -- | Get last occurrance of each query param simpleQuery :: Query -> QueryMap simpleQuery = M.fromListWith (flip const) . fmap (second (fromMaybe "")) . qsToList