on master help sign in
Merge remote branch 'greg/master'
c031ac9Michael Snoyman
Network/Wai/Middleware/Rewrite.hsnew file+34
@@ -0,0 +1,34 @@
1+{-# LANGUAGE OverloadedStrings #-}
2+module Network.Wai.Middleware.Rewrite
3+ ( rewrite, autoHtmlRewrite
4+ ) where
5+
6+import Network.Wai
7+import qualified Data.ByteString.Char8 as B
8+import System.Directory (doesFileExist)
9+import Control.Monad.IO.Class (liftIO)
10+import Web.Routes.Base (decodePathInfo)
11+
12+-- | rewrite based on your own conversion rules
13+-- Example usage: rewrite (autoHtmlRewrite "static")
14+rewrite :: (B.ByteString -> IO B.ByteString) -> Middleware
15+rewrite convert app req = do
16+ newPathInfo <- liftIO $ convert $ pathInfo req
17+ app req { pathInfo = newPathInfo }
18+
19+-- | example rewriter
20+-- implements 2 rules for static html re-writes
21+-- 1) for a directory foo/, check for foo/index.html
22+-- 2) for a non-directory bar, check for bar.html
23+-- if the file exists, do the rewrite
24+autoHtmlRewrite :: String -> B.ByteString -> IO B.ByteString
25+autoHtmlRewrite staticDir pInfo = do
26+ fe <- doesFileExist $ staticDir ++ "/" ++ reWritePath
27+ return $ if fe then B.pack reWritePath else pInfo
28+ where
29+ reWritePath = concat $ map ((:) '/') reWritePieces
30+ pieces = decodePathInfo $ B.unpack $ pInfo
31+ reWritePieces =
32+ if (null pieces) || (null $ last pieces)
33+ then pieces ++ ["index.html"]
34+ else (init pieces) ++ [(last pieces) ++ ".html"]
wai-extra.cabal+3−1
@@ -24,7 +24,8 @@ Library
24 blaze-builder-enumerator >= 0.2 && < 0.3,
24 blaze-builder-enumerator >= 0.2 && < 0.3,
25 transformers >= 0.2 && < 0.3,
25 transformers >= 0.2 && < 0.3,
26 enumerator >= 0.4 && < 0.5,
26 enumerator >= 0.4 && < 0.5,
27− blaze-builder >= 0.2.1.3 && < 0.3
27+ blaze-builder >= 0.2.1.3 && < 0.3,
28+ web-routes >= 0.23
28 Exposed-modules: Network.Wai.Handler.CGI
29 Exposed-modules: Network.Wai.Handler.CGI
29 Network.Wai.Middleware.AcceptOverride
30 Network.Wai.Middleware.AcceptOverride
30 Network.Wai.Middleware.Autohead
31 Network.Wai.Middleware.Autohead
@@ -33,6 +34,7 @@ Library
33 Network.Wai.Middleware.Gzip
34 Network.Wai.Middleware.Gzip
34 Network.Wai.Middleware.Jsonp
35 Network.Wai.Middleware.Jsonp
35 Network.Wai.Middleware.MethodOverride
36 Network.Wai.Middleware.MethodOverride
37+ Network.Wai.Middleware.Rewrite
36 Network.Wai.Middleware.Vhost
38 Network.Wai.Middleware.Vhost
37 Network.Wai.Zlib
39 Network.Wai.Zlib
38 Network.Wai.Parse
40 Network.Wai.Parse