@@ -15,7 +15,10 @@
15-- Totally ripped off by Michael Snoyman to work with Hack, then WAI.
15-- Totally ripped off by Michael Snoyman to work with Hack, then WAI.
17-----------------------------------------------------------------------------
17-----------------------------------------------------------------------------
18−module Network.Wai.Handler.FastCGI (run) where
18+module Network.Wai.Handler.FastCGI
20import Data.Maybe
23import Data.Maybe
21import Control.Monad ( liftM )
24import Control.Monad ( liftM )
@@ -66,31 +69,39 @@ foreign import ccall unsafe "fcgiapp.h FCGX_Finish" fcgx_finish
67-- | Handle FastCGI requests in an infinite loop.
70-- | Handle FastCGI requests in an infinite loop.
68run :: W.Application -> IO ()
71run :: W.Application -> IO ()
69−run f = runOneFastCGI f >> run f
72+run f = runOneFastCGI Nothing f >> run f
74+-- | Handle FastCGI requests in an infinite loop. For a server which supports
75+-- the X-Sendfile header.
76+runSendfile :: String -> W.Application -> IO ()
77+runSendfile sf f = runOneFastCGI (Just sf) f >> runSendfile sf f
71-- | Handle a single FastCGI request.
79-- | Handle a single FastCGI request.
80+runOneFastCGI :: Maybe String -- X-Sendfile
72−runOneFastCGI :: W.Application -> IO ()
81+ -> W.Application -> IO ()
73−runOneFastCGI f = do
82+runOneFastCGI xsendfile f = do
74 alloca (\inp ->
83 alloca (\inp ->
75 alloca (\outp ->
84 alloca (\outp ->
76 alloca (\errp ->
85 alloca (\errp ->
77 alloca (\envp ->
86 alloca (\envp ->
78− oneRequest f inp outp errp envp))))
87+ oneRequest f inp outp errp envp
80oneRequest :: W.Application
90oneRequest :: W.Application
81 -> Ptr StreamPtr
91 -> Ptr StreamPtr
82 -> Ptr StreamPtr
92 -> Ptr StreamPtr
83 -> Ptr StreamPtr
93 -> Ptr StreamPtr
84 -> Ptr Environ
94 -> Ptr Environ
95+ -> Maybe String -- X-Sendfile
86−oneRequest f inp outp errp envp =
97+oneRequest f inp outp errp envp xsendfile =
88 testReturn "FCGX_Accept" $ fcgx_accept inp outp errp envp
99 testReturn "FCGX_Accept" $ fcgx_accept inp outp errp envp
89 ins <- peek inp
100 ins <- peek inp
90 outs <- peek outp
101 outs <- peek outp
91 errs <- peek errp
102 errs <- peek errp
92 env <- peek envp
103 env <- peek envp
93− handleRequest f ins outs errs env
104+ handleRequest f ins outs errs env xsendfile
94 fcgx_finish
105 fcgx_finish
96handleRequest :: W.Application
107handleRequest :: W.Application
@@ -98,13 +109,14 @@ handleRequest :: W.Application
98 -> StreamPtr
109 -> StreamPtr
99 -> StreamPtr
110 -> StreamPtr
100 -> Environ
111 -> Environ
112+ -> Maybe String -- sendfile
102−handleRequest f ins outs _errs env =
114+handleRequest f ins outs _errs env xsendfile =
104 vars <- environToTable env
116 vars <- environToTable env
105 let input = sRead ins
117 let input = sRead ins
106 let hPut = sPutStr' outs
118 let hPut = sPutStr' outs
107− CGI.run'' vars (CGI.requestBodyFunc input) hPut f
119+ CGI.run'' vars (CGI.requestBodyFunc input) hPut xsendfile f
109data FCGX_Request
121data FCGX_Request