packages feed

wai-app-file-cgi 0.2.0 → 0.2.1

raw patch · 6 files changed

+50/−35 lines, 6 filesdep +static-hashdep −arraydep −hashmapPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependencies added: static-hash

Dependencies removed: array, hashmap

API changes (from Hackage documentation)

- Network.Wai.Application.Classic.CGI: cgiApp :: AppSpec -> CgiRoute -> Application
- Network.Wai.Application.Classic.File: fileApp :: AppSpec -> FileRoute -> Application
- Network.Wai.Application.Classic.Header: fkAcceptLanguage :: ByteString
- Network.Wai.Application.Classic.Header: fkContentLength :: FieldKey
- Network.Wai.Application.Classic.Header: fkContentType :: FieldKey
- Network.Wai.Application.Classic.Header: fkCookie :: FieldKey
- Network.Wai.Application.Classic.Header: fkIfModifiedSince :: FieldKey
- Network.Wai.Application.Classic.Header: fkIfRange :: FieldKey
- Network.Wai.Application.Classic.Header: fkIfUnmodifiedSince :: FieldKey
- Network.Wai.Application.Classic.Header: fkLastModified :: FieldKey
- Network.Wai.Application.Classic.Header: fkRange :: FieldKey
- Network.Wai.Application.Classic.Header: fkReferer :: FieldKey
- Network.Wai.Application.Classic.Header: fkUserAgent :: FieldKey
- Network.Wai.Application.Classic.Header: lookupField :: FieldKey -> RequestHeaders -> Maybe ByteString
- Network.Wai.Application.Classic.Header: lookupRequestField :: FieldKey -> Request -> Maybe ByteString
- Network.Wai.Application.Classic.Header: lookupRequestField' :: FieldKey -> Request -> ByteString
- Network.Wai.Application.Classic.Header: type FieldKey = ByteString
- Network.Wai.Application.Classic.Types: AppSpec :: ByteString -> ByteString -> (ByteString -> Bool) -> (Request -> Status -> RspBody -> IO ()) -> AppSpec
- Network.Wai.Application.Classic.Types: BodyFile :: ByteString -> Range -> RspBody
- Network.Wai.Application.Classic.Types: BodyLBS :: ByteString -> RspBody
- Network.Wai.Application.Classic.Types: CgiRoute :: ByteString -> ByteString -> CgiRoute
- Network.Wai.Application.Classic.Types: Entire :: Integer -> Range
- Network.Wai.Application.Classic.Types: FileRoute :: ByteString -> ByteString -> FileRoute
- Network.Wai.Application.Classic.Types: NoBody :: RspBody
- Network.Wai.Application.Classic.Types: Part :: Integer -> Integer -> Range
- Network.Wai.Application.Classic.Types: RspSpec :: Status -> ResponseHeaders -> RspBody -> RspSpec
- Network.Wai.Application.Classic.Types: cgiDst :: CgiRoute -> ByteString
- Network.Wai.Application.Classic.Types: cgiSrc :: CgiRoute -> ByteString
- Network.Wai.Application.Classic.Types: data AppSpec
- Network.Wai.Application.Classic.Types: data CgiRoute
- Network.Wai.Application.Classic.Types: data FileRoute
- Network.Wai.Application.Classic.Types: data Range
- Network.Wai.Application.Classic.Types: data RspBody
- Network.Wai.Application.Classic.Types: data RspSpec
- Network.Wai.Application.Classic.Types: fileDst :: FileRoute -> ByteString
- Network.Wai.Application.Classic.Types: fileSrc :: FileRoute -> ByteString
- Network.Wai.Application.Classic.Types: indexFile :: AppSpec -> ByteString
- Network.Wai.Application.Classic.Types: isHTML :: AppSpec -> ByteString -> Bool
- Network.Wai.Application.Classic.Types: logger :: AppSpec -> Request -> Status -> RspBody -> IO ()
- Network.Wai.Application.Classic.Types: rspBody :: RspSpec -> RspBody
- Network.Wai.Application.Classic.Types: rspHeaders :: RspSpec -> ResponseHeaders
- Network.Wai.Application.Classic.Types: rspStatus :: RspSpec -> Status
- Network.Wai.Application.Classic.Types: softwareName :: AppSpec -> ByteString
+ Network.Wai.Application.Classic: AppSpec :: ByteString -> ByteString -> (ByteString -> Bool) -> (Request -> Status -> Maybe Integer -> IO ()) -> AppSpec
+ Network.Wai.Application.Classic: BodyFile :: ByteString -> Range -> RspBody
+ Network.Wai.Application.Classic: BodyLBS :: ByteString -> RspBody
+ Network.Wai.Application.Classic: CgiRoute :: ByteString -> ByteString -> CgiRoute
+ Network.Wai.Application.Classic: Entire :: Integer -> Range
+ Network.Wai.Application.Classic: FileRoute :: ByteString -> ByteString -> FileRoute
+ Network.Wai.Application.Classic: NoBody :: RspBody
+ Network.Wai.Application.Classic: Part :: Integer -> Integer -> Range
+ Network.Wai.Application.Classic: cgiApp :: AppSpec -> CgiRoute -> Application
+ Network.Wai.Application.Classic: cgiDst :: CgiRoute -> ByteString
+ Network.Wai.Application.Classic: cgiSrc :: CgiRoute -> ByteString
+ Network.Wai.Application.Classic: data AppSpec
+ Network.Wai.Application.Classic: data CgiRoute
+ Network.Wai.Application.Classic: data FileRoute
+ Network.Wai.Application.Classic: data Range
+ Network.Wai.Application.Classic: data RspBody
+ Network.Wai.Application.Classic: fileApp :: AppSpec -> FileRoute -> Application
+ Network.Wai.Application.Classic: fileDst :: FileRoute -> ByteString
+ Network.Wai.Application.Classic: fileSrc :: FileRoute -> ByteString
+ Network.Wai.Application.Classic: getPeerAddr :: SockAddr -> IO NumericAddress
+ Network.Wai.Application.Classic: indexFile :: AppSpec -> ByteString
+ Network.Wai.Application.Classic: isHTML :: AppSpec -> ByteString -> Bool
+ Network.Wai.Application.Classic: logger :: AppSpec -> Request -> Status -> Maybe Integer -> IO ()
+ Network.Wai.Application.Classic: lookupRequestField :: FieldKey -> Request -> Maybe ByteString
+ Network.Wai.Application.Classic: lookupRequestField' :: FieldKey -> Request -> ByteString
+ Network.Wai.Application.Classic: softwareName :: AppSpec -> ByteString
+ Network.Wai.Application.Classic: type FieldKey = ByteString
+ Network.Wai.Application.Classic: type NumericAddress = String

Files

Network/Wai/Application/Classic.hs view
@@ -2,12 +2,23 @@   WAI (Web Application Interface) Application for static files and CGI. -} -module Network.Wai.Application.Classic (module Classic) where--import Network.Wai.Application.Classic.CGI as Classic-import Network.Wai.Application.Classic.File as Classic-import Network.Wai.Application.Classic.Types as Classic-import Network.Wai.Application.Classic.Header as Classic-import Network.Wai.Application.Classic.Utils as Classic-+module Network.Wai.Application.Classic (+  -- * Types+    AppSpec(..)+  , RspBody(..)+  , Range(..)+  -- * Files+  , FileRoute(..), fileApp+  -- * CGI+  , CgiRoute(..), cgiApp+  -- * Utilities for logging+  , NumericAddress, getPeerAddr+  , FieldKey+  , lookupRequestField, lookupRequestField'+  ) where +import Network.Wai.Application.Classic.CGI+import Network.Wai.Application.Classic.File+import Network.Wai.Application.Classic.Types+import Network.Wai.Application.Classic.Utils+import Network.Wai.Application.Classic.Header
Network/Wai/Application/Classic/CGI.hs view
@@ -65,7 +65,7 @@                     Nothing    -> (status500,[],True)                     Just (s,h) -> (s,h,False)                 hdr' = addHeader hdr-            liftIO $ logger spec req st NoBody -- cannot know body length+            liftIO $ logger spec req st Nothing -- cannot know body length             if emp                then emptyBody =$ response build st hdr'                else              response build st hdr')
Network/Wai/Application/Classic/Field.hs view
@@ -7,10 +7,10 @@ import Data.ByteString (ByteString) import qualified Data.ByteString as BS hiding (pack) import Data.ByteString.Char8 as BS (pack)-import Data.HashMap (Map)-import qualified Data.HashMap as M-import Data.Map as Map (toList)+import qualified Data.Map as Map (toList) import Data.Maybe+import Data.StaticHash (StaticHash)+import qualified Data.StaticHash as SH import Network.HTTP.Date import Network.HTTP.Types import Network.Wai@@ -50,7 +50,7 @@ mimeType file =fromMaybe defaultMimeType . foldr1 mplus . map lok $ targets   where     targets = extensions file-    lok x = M.lookup x defaultMimeTypes'+    lok x = SH.lookup x defaultMimeTypes'  extensions :: ByteString -> [ByteString] extensions file = exts@@ -60,5 +60,5 @@         (_,x)  -> BS.tail x     exts = if entire == "" then [] else entire : BS.split 46 file -defaultMimeTypes' :: Map ByteString MimeType-defaultMimeTypes' = M.fromList $ map (first BS.pack) $ Map.toList defaultMimeTypes+defaultMimeTypes' :: StaticHash ByteString MimeType+defaultMimeTypes' = SH.fromList $ map (first BS.pack) $ Map.toList defaultMimeTypes
Network/Wai/Application/Classic/File.hs view
@@ -8,7 +8,7 @@ import Data.ByteString (ByteString) import qualified Data.ByteString as BS hiding (unpack, pack) import qualified Data.ByteString.Char8 as BS (unpack, pack)-import qualified Data.ByteString.Lazy.Char8 as BL ()+import qualified Data.ByteString.Lazy.Char8 as BL (length) import Network.HTTP.Types import Network.Wai import Network.Wai.Application.Classic.Field@@ -44,17 +44,21 @@         "GET"  -> processGET  req file ishtml rfile         "HEAD" -> processHEAD req file ishtml rfile         _      -> return notAllowed-    liftIO $ logger spec req st body-    let hdr' = addServer hdr-    case body of-        NoBody     -> return $ responseLBS st hdr' ""-        BodyLBS bd -> return $ responseLBS st hdr' bd-        BodyFile afile (Entire len) -> do-            let hdr'' = addLength hdr' len-            return $ ResponseFile st hdr'' (BS.unpack afile) Nothing-        BodyFile afile (Part skip len) -> do-            let hdr'' = addLength hdr' len-            return $ ResponseFile st hdr'' (BS.unpack afile) (Just (FilePart skip len))+    let hdr'= addServer hdr+        (response, mlen) = case body of+            NoBody     -> (responseLBS st hdr' "", Nothing)+            BodyLBS bd ->+                let len = fromIntegral $ BL.length bd+                in (responseLBS st hdr' bd, Just len)+            BodyFile afile rng ->+                let (len, mfp) = case rng of+                        Entire bytes    -> (bytes, Nothing)+                        Part skip bytes -> (bytes, Just (FilePart skip bytes))+                    hdr''  = addLength hdr' len+                    afile' = BS.unpack afile+                in (ResponseFile st hdr'' afile' mfp, Just len)+    liftIO $ logger spec req st mlen+    return response   where     method = requestMethod req     path = pathinfoToFilePath req filei
Network/Wai/Application/Classic/Types.hs view
@@ -13,7 +13,7 @@     -- | Whether this is an HTML or not.   , isHTML :: ByteString -> Bool     -- | A function for logging.-  , logger :: Request -> Status -> RspBody -> IO ()+  , logger :: Request -> Status -> Maybe Integer -> IO ()   }  data FileRoute = FileRoute {
wai-app-file-cgi.cabal view
@@ -1,5 +1,5 @@ Name:                   wai-app-file-cgi-Version:                0.2.0+Version:                0.2.1 Author:                 Kazu Yamamoto <kazu@iij.ad.jp> Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp> License:                BSD3@@ -17,16 +17,16 @@   else     GHC-Options:        -Wall   Exposed-Modules:      Network.Wai.Application.Classic-                        Network.Wai.Application.Classic.CGI-                        Network.Wai.Application.Classic.File-                        Network.Wai.Application.Classic.Types-                        Network.Wai.Application.Classic.Header-  Other-Modules:        Network.Wai.Application.Classic.EnumLine+  Other-Modules:        Network.Wai.Application.Classic.CGI+                        Network.Wai.Application.Classic.EnumLine                         Network.Wai.Application.Classic.Field+                        Network.Wai.Application.Classic.File                         Network.Wai.Application.Classic.FileInfo+                        Network.Wai.Application.Classic.Header                         Network.Wai.Application.Classic.Lang                         Network.Wai.Application.Classic.MaybeIter                         Network.Wai.Application.Classic.Range+                        Network.Wai.Application.Classic.Types                         Network.Wai.Application.Classic.Utils   Build-Depends:        base >= 4 && < 5, process, haskell98,                         network, transformers,@@ -35,7 +35,7 @@                         wai, enumerator >= 0.4.9,                         bytestring, blaze-builder,                         wai-app-static, http-types, http-date,-                        case-insensitive, hashmap, array+                        case-insensitive, static-hash Source-Repository head   Type:                 git   Location:             git://github.com/kazu-yamamoto/wai-app-file-cgi.git