{-# LANGUAGE OverloadedStrings #-} module Network.Wai.Middleware.Rewrite ( rewrite, rewritePure ) where import Network.Wai import Control.Monad.IO.Class (liftIO) import Data.Text (Text) import qualified Data.Text.Encoding as TE import qualified Data.Text as T import Network.HTTP.Types as H -- | rewrite based on your own conversion rules rewrite :: ([Text] -> H.RequestHeaders -> IO [Text]) -> Middleware rewrite convert app req sendResponse = do newPathInfo <- liftIO $ convert (pathInfo req) (requestHeaders req) let rawPInfo = TE.encodeUtf8 $ T.intercalate "/" newPathInfo app req { pathInfo = newPathInfo, rawPathInfo = rawPInfo } sendResponse -- | rewrite based on your own conversion rules -- Example convert function: -- staticConvert :: [Text] -> H.RequestHeaders -> [Text] -- staticConvert pieces _ = piecesConvert pieces -- where -- piecesConvert [] = ["static", "html", "pages.html"] -- piecesConvert route@("pages":_) = "static":"html":route rewritePure :: ([Text] -> H.RequestHeaders -> [Text]) -> Middleware rewritePure convert app req = let pInfo = convert (pathInfo req) (requestHeaders req) rawPInfo = TE.encodeUtf8 $ T.intercalate "/" pInfo in app req { pathInfo = pInfo, rawPathInfo = rawPInfo }