fastcgi 3001.0.1 → 3001.0.2
raw patch · 4 files changed
+86/−36 lines, 4 files
Files
- LICENSE +30/−0
- Network/FastCGI.hsc +37/−29
- configure +9/−0
- fastcgi.cabal +10/−7
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) Bjorn Bringert, Lemmih++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.++3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR+IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
Network/FastCGI.hsc view
@@ -12,7 +12,7 @@ -- ----------------------------------------------------------------------------- module Network.FastCGI- ( + ( -- * Single-threaded interface runFastCGIorCGI , runOneFastCGIorCGI@@ -58,10 +58,14 @@ #include <fcgiapp.h> +------------------------------------------------------------------------+ data FCGX_Stream type StreamPtr = Ptr FCGX_Stream type Environ = Ptr CString +------------------------------------------------------------------------+ foreign import ccall unsafe "fcgiapp.h FCGX_IsCGI" fcgx_isCGI :: IO CInt @@ -76,6 +80,8 @@ foreign import ccall unsafe "fcgiapp.h FCGX_Finish" fcgx_finish :: IO () +------------------------------------------------------------------------+ -- | Handle a single CGI request, or FastCGI requests in an infinite loop. -- This function only returns normally if it was a CGI request. -- This lets you use the same program@@ -89,7 +95,7 @@ -- | Handle a single FastCGI or CGI request. This lets you use the same program -- as either a FastCGI or CGI program, depending on what the server -- treats it as.-runOneFastCGIorCGI :: CGI CGIResult +runOneFastCGIorCGI :: CGI CGIResult -> IO Bool -- ^ True if it was a FastCGI request, -- False if CGI. runOneFastCGIorCGI f =@@ -164,42 +170,44 @@ runFastCGIConcurrent' :: (IO () -> IO a) -- ^ How to fork a request. -> Int -- ^ Max number of concurrent threads. -> CGI CGIResult -> IO ()+ runFastCGIConcurrent' fork m f = do qsem <- newQSem m- testReturn "FCGX_Init" $ fcgx_init+ testReturn "FCGX_Init" $ fcgx_init let loop = do waitQSem qsem reqp <- acceptRequest- fork (oneRequestMT f reqp `finally` (finishRequest reqp >> signalQSem qsem))- loop- loop `catch` \e -> log (show e)+ fork (oneRequestMT f reqp+ `finally`+ (finishRequest reqp >> signalQSem qsem))+ loop+ loop `catch` \e -> log (show e) oneRequestMT :: CGI CGIResult -> Ptr FCGX_Request -> IO () oneRequestMT f r = do- env <- peekEnvp r- vars <- environToTable env- ins <- peekIn r- input <- sRead ins- output <- runCGIEnvFPS vars input (runCGIT f)- outs <- peekOut r- sPutStr outs output+ env <- peekEnvp r+ vars <- environToTable env+ ins <- peekIn r+ input <- sRead ins+ output <- runCGIEnvFPS vars input (runCGIT f)+ outs <- peekOut r+ sPutStr outs output -- -- * FCGX_Reqest struct -- acceptRequest :: IO (Ptr FCGX_Request) acceptRequest = do- reqp <- mallocBytes (#size FCGX_Request)- initAndAccept reqp- return reqp- where initAndAccept reqp = - do - testReturn "FCGX_InitRequest" $ fcgx_initrequest reqp 0 0- testReturn "FCGX_Accept_r" $ fcgx_accept_r reqp+ reqp <- mallocBytes (#size FCGX_Request)+ initAndAccept reqp+ return reqp+ where initAndAccept reqp = do+ testReturn "FCGX_InitRequest" $ fcgx_initrequest reqp 0 0+ testReturn "FCGX_Accept_r" $ fcgx_accept_r reqp finishRequest :: Ptr FCGX_Request -> IO () finishRequest reqp = do- fcgx_finish_r reqp- free reqp+ fcgx_finish_r reqp+ free reqp peekIn, peekOut, _peekErr :: Ptr FCGX_Request -> IO (Ptr FCGX_Stream) peekIn = (#peek FCGX_Request, in)@@ -215,18 +223,18 @@ -- sPutStr :: StreamPtr -> Lazy.ByteString -> IO ()-sPutStr h str = +sPutStr h str = mapM_ (flip BSB.unsafeUseAsCStringLen (fcgxPutCStringLen h)) (Lazy.toChunks str) fcgxPutCStringLen :: StreamPtr -> CStringLen -> IO ()-fcgxPutCStringLen h (cs,len) = +fcgxPutCStringLen h (cs,len) = testReturn "FCGX_PutStr" $ fcgx_putStr cs (fromIntegral len) h sRead :: StreamPtr -> IO Lazy.ByteString sRead h = buildByteString (fcgxGetBuf h) 4096 fcgxGetBuf :: StreamPtr -> Ptr a -> Int -> IO Int-fcgxGetBuf h p c = +fcgxGetBuf h p c = liftM fromIntegral $ fcgx_getStr (castPtr p) (fromIntegral c) h --@@ -251,10 +259,10 @@ -- testReturn :: String -> IO CInt -> IO ()-testReturn e = throwIfNeg_ (const $ e ++ " failed")+testReturn e = throwIfNeg_ (\n -> e ++ " failed with error code: "++ show n) environToTable :: Environ -> IO [(String,String)]-environToTable arr = +environToTable arr = do css <- peekArray0 nullPtr arr ss <- mapM peekCString css return $ map (splitBy '=') ss@@ -277,5 +285,5 @@ log :: String -> IO () log msg = do- t <- myThreadId- withMVar logMutex (const $ hPutStrLn stderr (show t ++ ": " ++ msg))+ t <- myThreadId+ withMVar logMutex (const $ hPutStrLn stderr (show t ++ ": " ++ msg))
+ configure view
@@ -0,0 +1,9 @@+#!/bin/sh+#++# subst standard header path variables+if test -n "$CPPFLAGS" ; then+ echo "Found CPPFLAGS in environment: '$CPPFLAGS'"+ sed 's,@CPPFLAGS@,'"$CPPFLAGS"',g;s,@LDFLAGS@,'"$LDFLAGS"',g' \+ < fastcgi.buildinfo.in > fastcgi.buildinfo+fi
fastcgi.cabal view
@@ -1,13 +1,16 @@-Name: fastcgi-Version: 3001.0.1-Copyright: Bjorn Bringert, Lemmih-Maintainer: lemmih@gmail.com-License: BSD3-Synopsis: A Haskell library for writing FastCGI programs+Name: fastcgi+Version: 3001.0.2+Copyright: Bjorn Bringert, Lemmih+Maintainer: bjorn@bringert.net+License: BSD3+license-file: LICENSE+Synopsis: A Haskell library for writing FastCGI programs Description: This library lets you write FastCGI programs. This package reuses the cgi package API, making it very easy to port CGI programs to FastCGI. Cabal-version: >= 1.2.0+build-type: Configure+extra-source-files: configure flag small_base description: Choose the new smaller, split-up base package.@@ -21,5 +24,5 @@ Extensions: ForeignFunctionInterface, EmptyDataDecls Exposed-Modules: Network.FastCGI- ghc-options: -O2 -Werror -fwarn-unused-binds -fwarn-unused-imports -fwarn-unused-matches+ ghc-options: -O2 -fwarn-unused-binds -fwarn-unused-imports -fwarn-unused-matches extra-libraries: fcgi