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 +19/−8
- Network/Wai/Application/Classic/CGI.hs +1/−1
- Network/Wai/Application/Classic/Field.hs +6/−6
- Network/Wai/Application/Classic/File.hs +16/−12
- Network/Wai/Application/Classic/Types.hs +1/−1
- wai-app-file-cgi.cabal +7/−7
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