39 lines
1.2 KiB
Haskell
39 lines
1.2 KiB
Haskell
{-# LANGUAGE OverloadedStrings #-}
|
|
module Servant.Server.Internal.PathInfo where
|
|
|
|
import Data.List (unfoldr)
|
|
import Data.Text (Text)
|
|
import qualified Data.Text as T
|
|
import Network.Wai (Request, pathInfo)
|
|
|
|
-- | Like `null . pathInfo`, but works with redundant trailing slashes.
|
|
pathIsEmpty :: Request -> Bool
|
|
pathIsEmpty = f . processedPathInfo
|
|
where
|
|
f [] = True
|
|
f [""] = True
|
|
f _ = False
|
|
|
|
|
|
splitMatrixParameters :: Text -> (Text, Text)
|
|
splitMatrixParameters = T.break (== ';')
|
|
|
|
parsePathInfo :: Request -> [Text]
|
|
parsePathInfo = filter (/= "") . mergePairs . map splitMatrixParameters . pathInfo
|
|
where mergePairs = concat . unfoldr pairToList
|
|
pairToList [] = Nothing
|
|
pairToList ((a, b):xs) = Just ([a, b], xs)
|
|
|
|
-- | Returns a processed pathInfo from the request.
|
|
--
|
|
-- In order to handle matrix parameters in the request correctly, the raw pathInfo needs to be
|
|
-- processed, so routing works as intended. Therefor this function should be used to access
|
|
-- the pathInfo for routing purposes.
|
|
processedPathInfo :: Request -> [Text]
|
|
processedPathInfo r =
|
|
case pinfo of
|
|
(x:xs) | T.head x == ';' -> xs
|
|
_ -> pinfo
|
|
where pinfo = parsePathInfo r
|
|
|