on master help sign in
Merge branch 'master' into conduit-0.3

Conflicts: wai-extra/wai-extra.cabal wai-handler-devel/wai-handler-devel.cabal wai-handler-fastcgi/wai-handler-fastcgi.cabal wai-handler-scgi/wai-handler-scgi.cabal warp-static/warp-static.cabal

commit578f9854fb8264c5b60c2a48ab2c1633a4c7f3ac authorMichael Snoyman <michael@snoyman.com> dateWed 14 Mar 2012, 09:24 (15 years ago) parent9e6aeb7f7dc81a
6 files changed+56−34
README.md+10 scripts+1−1 sources.txt+13−11 wai-app-static/Network/Wai/Application/Static.hs+2 wai-extra/Network/Wai/Middleware/Rewrite.hs+15−21 wai-extra/Network/Wai/Middleware/Vhost.hs+15−1
README.mdnew file+10
@@ -0,0 +1,10 @@
1+An interface between Haskell web frameworks and web servers.
2+
3+A Haskell web application targets WAI and then can be deployed to any backend with a WAI adaptor.
4+The premier WAI backend is the Warp web server.
5+
6+WAI also adds modularity and code-sharing through middleware and WAI applications.
7+Code can be written that works with any web framework targeting WAI.
8+
9+[http://www.yesodweb.com/book/wai](Documentation)
10+[http://hackage.haskell.org/package/wai](Haddock Documentation)
scripts+1−1

Submodule changed.

sources.txt+13−11
@@ -1,11 +1,13 @@
1−wai
2−wai-test
3−wai-extra
4−warp
5−wai-app-static
6−wai-handler-fastcgi
7−wai-handler-launch
8−wai-handler-scgi
9−wai-websockets
10−wai-eventsource
11−warp-static
1+./wai
2+./wai-test
3+./wai-extra
4+./warp
5+./warp-tls
6+./wai-app-static
7+./wai-handler-fastcgi
8+./wai-handler-launch
9+./wai-handler-scgi
10+./wai-frontend-monadcgi
11+./warp-static
12+./wai-websockets
13+./wai-eventsource
wai-app-static/Network/Wai/Application/Static.hs+2
@@ -149,7 +149,9 @@ defaultMimeTypes = Map.fromList [
149149 ( "jpeg" , "image/jpeg" ),
150150 ( "jpg" , "image/jpeg" ),
151151 ( "js" , "text/javascript" ),
152+ ( "json" , "application/json" ),
152153 ( "log" , "text/plain" ),
154+ ( "manifest", "text/cache-manifest" ),
153155 ( "m3u" , "audio/x-mpegurl" ),
154156 ( "mov" , "video/quicktime" ),
155157 ( "mp3" , "audio/mpeg" ),
wai-extra/Network/Wai/Middleware/Rewrite.hs+15−21
@@ -1,39 +1,33 @@
11{-# LANGUAGE OverloadedStrings #-}
22module Network.Wai.Middleware.Rewrite
3− ( rewrite, autoHtmlRewrite
3+ ( rewrite, rewritePure
44 ) where
55
66import Network.Wai
7−import System.Directory (doesFileExist)
87import Control.Monad.IO.Class (liftIO)
9−import Data.Text (Text, unpack, pack)
8+import Data.Text (Text)
109import qualified Data.Text.Encoding as TE
1110import qualified Data.Text as T
1211import Network.HTTP.Types as H
1312
1413
1514-- | rewrite based on your own conversion rules
16−-- Example usage: rewrite (autoHtmlRewrite "static")
1715rewrite :: ([Text] -> H.RequestHeaders -> IO [Text]) -> Middleware
1816rewrite convert app req = do
1917 newPathInfo <- liftIO $ convert (pathInfo req) (requestHeaders req)
2018 let rawPInfo = TE.encodeUtf8 $ T.intercalate "/" newPathInfo
2119 app req { pathInfo = newPathInfo, rawPathInfo = rawPInfo }
2220
23−-- | example rewriter
24−-- We don't recommend normally checking the file system on every request - this is just an example.
25−-- Implements 2 rules for static html re-writes
26−-- 1) for a directory foo/, check for foo/index.html
27−-- 2) for a non-directory bar, check for bar.html
28−-- Do the rewrite only if the html file exists.
29−autoHtmlRewrite :: String -> [Text] -> H.RequestHeaders -> IO [Text]
30−autoHtmlRewrite staticDir pieces' _ = do
31− fe <- doesFileExist $ staticDir ++ "/" ++ reWritePath
32− return $ if fe then map pack reWritePieces else pieces'
33− where
34− pieces = map unpack pieces'
35− reWritePath = concat $ map ((:) '/') reWritePieces
36− reWritePieces =
37− if (null pieces) || (null $ last pieces)
38− then pieces ++ ["index.html"]
39− else (init pieces) ++ [(last pieces) ++ ".html"]
21+-- | rewrite based on your own conversion rules
22+-- Example convert function:
23+
24+-- staticConvert :: [Text] -> H.RequestHeaders -> [Text]
25+-- staticConvert pieces _ = piecesConvert pieces
26+-- where
27+-- piecesConvert [] = ["static", "html", "pages.html"]
28+-- piecesConvert route@("pages":_) = "static":"html":route
29+rewritePure :: ([Text] -> H.RequestHeaders -> [Text]) -> Middleware
30+rewritePure convert app req =
31+ let pInfo = convert (pathInfo req) (requestHeaders req)
32+ rawPInfo = TE.encodeUtf8 $ T.intercalate "/" pInfo
33+ in app req { pathInfo = pInfo, rawPathInfo = rawPInfo }
wai-extra/Network/Wai/Middleware/Vhost.hs+15−1
@@ -1,9 +1,23 @@
1−module Network.Wai.Middleware.Vhost (vhost) where
1+{-# LANGUAGE OverloadedStrings #-}
2+module Network.Wai.Middleware.Vhost (vhost, redirectWWW) where
23
34import Network.Wai
45
6+import Network.HTTP.Types as H
7+import qualified Data.Text.Encoding as TE
8+import Data.Text (Text)
9+import qualified Data.ByteString as BS
10+
511vhost :: [(Request -> Bool, Application)] -> Application -> Application
612vhost vhosts def req =
713 case filter (\(b, _) -> b req) vhosts of
814 [] -> def req
915 (_, app):_ -> app req
16+
17+redirectWWW :: Text -> Application -> Application -- W.MiddleWare
18+redirectWWW home app req =
19+ if BS.isPrefixOf "www" $ serverName req
20+ then return $ responseLBS H.status301
21+ [ ("Content-Type", "text/plain") , ("Location", TE.encodeUtf8 home) ] "Redirect"
22+ else app req
23+