on master help sign in
Migrated to WAI
commit6ec208c3134e81c91916c422c9e8ba287caad7ae authorMichael Snoyman <michael@snoyman.com> dateFri 17 Sep 2010, 09:22 (16 years ago) parent6ce45d1
8 files changed+47−39
Hack/Frontend/MonadCGI.hs → Network/Wai/Frontend/MonadCGI.hs+19−13 README+1−1 samples/hack_cgi.hs−7 samples/hack_fastcgi.hs−8 samples/wai_cgi.hs+8 samples/hack_cgi_generic.hs → samples/wai_cgi_generic.hs+6−5 samples/wai_fastcgi.hs+8 hack-frontend-monadcgi.cabal → wai-frontend-monadcgi.cabal+5−5
Hack/Frontend/MonadCGI.hs → Network/Wai/Frontend/MonadCGI.hsrenamed+19−13
@@ -1,17 +1,20 @@
1−module Hack.Frontend.MonadCGI
1+module Network.Wai.Frontend.MonadCGI
22 ( cgiToApp
33 , cgiToAppGeneric
44 ) where
55
6−import Hack
6+import Network.Wai
7+import Network.Wai.Source
78import Network.CGI.Monad
89import Network.CGI.Protocol
910
1011import qualified Data.Map as Map
1112import qualified Data.ByteString.Lazy as BS
13+import qualified Data.ByteString.Char8 as S8
1214
1315import Control.Arrow (first)
1416import Data.Char (toUpper)
17+import Data.String (fromString)
1518
1619safeRead :: Read a => a -> String -> a
1720safeRead d s = case reads s of
@@ -26,8 +29,9 @@ cgiToAppGeneric :: Monad m
2629 -> CGIT m CGIResult
2730 -> Application
2831cgiToAppGeneric toIO cgi env = do
29− let vars = map (first fixVarName) (http env)++ getCgiVars env
30− input = hackInput env
32+ input <- toLBS $ requestBody env
33+ let vars = map (first fixVarName . go) (requestHeaders env)
34+ ++ getCgiVars env
3135 (inputs, body') = decodeInput vars input
3236 req = CGIRequest
3337 { cgiVars = Map.fromList $ vars
@@ -38,11 +42,14 @@ cgiToAppGeneric toIO cgi env = do
3842 let output = case output' of
3943 CGIOutput bs -> bs
4044 CGINothing -> BS.empty
41− let headers' = map (\(HeaderName x, y) -> (x, y)) headers''
42− let status' = case lookup "Status" headers' of
45+ let headers' = map (\(HeaderName x, y) ->
46+ (fromString x, S8.pack y)) headers''
47+ let status' = case lookup (fromString "Status") headers' of
4348 Nothing -> 200
44− Just s -> safeRead 200 s
45− return $ Response status' headers' output
49+ Just s -> safeRead 200 $ S8.unpack s
50+ return $ Response (Status status' S8.empty) headers' $ ResponseLBS output
51+ where
52+ go (x, y) = (S8.unpack $ ciOriginal x, S8.unpack y)
4653
4754fixVarName :: String -> String
4855fixVarName = ((++) $ "HTTP_") . map fixVarNameChar
@@ -51,12 +58,11 @@ fixVarNameChar :: Char -> Char
5158fixVarNameChar '-' = '_'
5259fixVarNameChar c = toUpper c
5360
54−getCgiVars :: Env -> [(String, String)]
61+getCgiVars :: Request -> [(String, String)]
5562getCgiVars e =
56− [ ("PATH_INFO", pathInfo e)
63+ [ ("PATH_INFO", S8.unpack $ pathInfo e)
5764 , ("REQUEST_METHOD", show $ requestMethod e)
58− , ("SCRIPT_NAME", scriptName e)
59− , ("QUERY_STRING", queryString e)
60− , ("SERVER_NAME", serverName e)
65+ , ("QUERY_STRING", S8.unpack $ queryString e)
66+ , ("SERVER_NAME", S8.unpack $ serverName e)
6167 , ("SERVER_PORT", show $ serverPort e)
6268 ]
README+1−1
@@ -1 +1 @@
1−Allows programs written against MonadCGI to run with any hack handler.
1+Allows programs written against MonadCGI to run with any WAI handler.
samples/hack_cgi.hsdeleted−7
@@ -1,7 +0,0 @@
1−import qualified Network.CGI
2−import qualified Hack.Handler.CGI
3−import qualified Hack.Frontend.MonadCGI
4−
5−main = Hack.Handler.CGI.run $ Hack.Frontend.MonadCGI.cgiToApp mainCGI
6−
7−mainCGI = Network.CGI.output "This is a test"
samples/hack_fastcgi.hsdeleted−8
@@ -1,8 +0,0 @@
1−import qualified Network.CGI
2−import qualified Hack.Handler.FastCGI
3−import qualified Hack.Frontend.MonadCGI
4−
5−main = Hack.Handler.FastCGI.runFastCGIorCGI
6− $ Hack.Frontend.MonadCGI.cgiToApp mainCGI
7−
8−mainCGI = Network.CGI.output "This is a test"
samples/wai_cgi.hsnew file+8
@@ -0,0 +1,8 @@
1+import qualified Network.CGI
2+import qualified Network.Wai.Handler.SimpleServer
3+import qualified Network.Wai.Frontend.MonadCGI
4+
5+main = Network.Wai.Handler.SimpleServer.run 3000
6+ $ Network.Wai.Frontend.MonadCGI.cgiToApp mainCGI
7+
8+mainCGI = Network.CGI.output "This is a test"
samples/hack_cgi_generic.hs → samples/wai_cgi_generic.hsrenamed+6−5
@@ -1,11 +1,12 @@
1+{-# LANGUAGE PackageImports #-}
12import qualified Network.CGI
2−import qualified Hack.Handler.CGI
3−import qualified Hack.Frontend.MonadCGI
4−import Control.Monad.Reader
3+import qualified Network.Wai.Handler.SimpleServer
4+import qualified Network.Wai.Frontend.MonadCGI
5+import "mtl" Control.Monad.Reader
56
67main :: IO ()
7−main = Hack.Handler.CGI.run
8− $ Hack.Frontend.MonadCGI.cgiToAppGeneric
8+main = Network.Wai.Handler.SimpleServer.run 3000
9+ $ Network.Wai.Frontend.MonadCGI.cgiToAppGeneric
910 monadToIO
1011 mainCGI
1112
samples/wai_fastcgi.hsnew file+8
@@ -0,0 +1,8 @@
1+import qualified Network.CGI
2+import qualified Network.Wai.Handler.FastCGI
3+import qualified Network.Wai.Frontend.MonadCGI
4+
5+main = Network.Wai.Handler.FastCGI.run
6+ $ Network.Wai.Frontend.MonadCGI.cgiToApp mainCGI
7+
8+mainCGI = Network.CGI.output "This is a test"
hack-frontend-monadcgi.cabal → wai-frontend-monadcgi.cabalrenamed+5−5
@@ -1,10 +1,10 @@
1−name: hack-frontend-monadcgi
2−version: 0.0.3
1+name: wai-frontend-monadcgi
2+version: 0.0.0
33license: BSD3
44license-file: LICENSE
55author: Michael Snoyman <michael@snoyman.com>
66maintainer: Michael Snoyman <michael@snoyman.com>
7−synopsis: Allows programs written against MonadCGI to run with any hack handler.
7+synopsis: Allows programs written against MonadCGI to run with any WAI handler.
88category: Web
99stability: stable
1010cabal-version: >= 1.2
@@ -15,6 +15,6 @@ library
1515 bytestring,
1616 containers >= 0.2,
1717 cgi,
18− hack >= 2009.5.19
19− exposed-modules: Hack.Frontend.MonadCGI
18+ wai >= 0.2 && < 0.3
19+ exposed-modules: Network.Wai.Frontend.MonadCGI
2020 ghc-options: -Wall