-- |
--
-- Since 3.0.9
module Network.Wai.Middleware.Routed (
    routedMiddleware,
    hostedMiddleware,
) where

import Data.ByteString (ByteString)
import Data.Text (Text)
import Network.Wai

-- | Apply a middleware based on a test of pathInfo
--
-- example:
--
-- > let corsify = routedMiddleWare ("static" `elem`) addCorsHeaders
--
-- Since 3.0.9
routedMiddleware
    :: ([Text] -> Bool)
    -- ^ Only use middleware if this pathInfo test returns True
    -> Middleware
    -- ^ middleware to apply the path prefix guard to
    -> Middleware
    -- ^ modified middleware
routedMiddleware :: ([Text] -> Bool) -> Middleware -> Middleware
routedMiddleware [Text] -> Bool
pathCheck Middleware
middle Application
app Request
req
    | [Text] -> Bool
pathCheck (Request -> [Text]
pathInfo Request
req) = Middleware
middle Application
app Request
req
    | Bool
otherwise = Application
app Request
req

-- | Only apply the middleware to certain hosts
--
-- Since 3.0.9
hostedMiddleware
    :: ByteString
    -- ^ Domain the middleware applies to
    -> Middleware
    -- ^ middleware to apply the path prefix guard to
    -> Middleware
    -- ^ modified middleware
hostedMiddleware :: ByteString -> Middleware -> Middleware
hostedMiddleware ByteString
domain Middleware
middle Application
app Request
req
    | ByteString -> Request -> Bool
hasDomain ByteString
domain Request
req = Middleware
middle Application
app Request
req
    | Bool
otherwise = Application
app Request
req

hasDomain :: ByteString -> Request -> Bool
hasDomain :: ByteString -> Request -> Bool
hasDomain ByteString
domain Request
req = ByteString -> Maybe ByteString
forall a. a -> Maybe a
Just ByteString
domain Maybe ByteString -> Maybe ByteString -> Bool
forall a. Eq a => a -> a -> Bool
== Request -> Maybe ByteString
requestHeaderHost Request
req