packages feed

wai-extra 0.4.5.2 → 0.4.6

raw patch · 3 files changed

+115/−49 lines, 3 filesdep +fast-loggerPVP ok

version bump matches the API change (PVP)

Dependencies added: fast-logger

API changes (from Hackage documentation)

+ Network.Wai.Middleware.RequestLogger: logHandle :: (ByteString -> IO ()) -> Middleware
+ Network.Wai.Middleware.RequestLogger: logHandleDev :: (ByteString -> IO ()) -> Middleware
+ Network.Wai.Middleware.RequestLogger: logHandleDevLT :: (Text -> IO ()) -> Middleware
+ Network.Wai.Middleware.RequestLogger: logStdout :: Middleware
+ Network.Wai.Middleware.RequestLogger: logStdoutDev :: Middleware
+ Network.Wai.Middleware.RequestLogger: logStdoutDevLT :: Middleware

Files

Network/Wai/Middleware/Debug.hs view
@@ -1,56 +1,17 @@-{-# LANGUAGE OverloadedStrings #-} module Network.Wai.Middleware.Debug+    {-# DEPRECATED "functionality has been moved to the better named Network.Wai.Middleware.RequestLogger. Network.Wai.Middleware.Debug will be removed." #-}     ( debug     , debugHandle     ) where -import Network.Wai (Request(..), Middleware)-import Network.Wai.Parse (parseRequestBody, lbsSink, fileName, Param, File)-import Data.ByteString.Char8 (unpack)-import qualified Data.ByteString as S-import qualified Data.ByteString.Lazy as L-import System.IO (hPutStrLn, stderr)-import Control.Monad.IO.Class (liftIO)-import qualified Data.Text.Lazy as T-import Data.Enumerator (run_, ($$), enumList)-import Data.Enumerator.List (consume)+import Network.Wai.Middleware.RequestLogger (logStdoutDevLT, logHandleDevLT)+import Network.Wai (Middleware)+import qualified Data.Text.Lazy as LT --- | Prints a message to 'stderr' for each request.+-- | Deprecated. Use module Network.Wai.Middleware.RequestLogger debug :: Middleware-debug = debugHandle $ hPutStrLn stderr . T.unpack---- | Prints a message using the given callback function for each request.--- This is not for serious production use- it is inefficient.--- It immediately consumes a POST body and fills it back in and is otherwise inefficient-debugHandle :: (T.Text -> IO ()) -> Middleware-debugHandle cb app req = do-    body <- consume-    postParams <- if any (requestMethod req ==) ["GET", "HEAD"]-      then return []-      else do postParams <- liftIO $ allPostParams req body-              return $ collectPostParams postParams-    let getParams = map emptyGetParam $ queryString req--    liftIO $ cb $ T.pack $ concat-        [ unpack $ requestMethod req-        , " "-        , unpack $ rawPathInfo req-        , "\n"-        , (++) "Accept: " $ maybe "" unpack $ lookup "Accept" $ requestHeaders req-        , paramsToStr  "GET " getParams-        , paramsToStr "POST " postParams-        ]-    -- we just consumed the body- fill the enumerator back up so it is available again-    liftIO $ run_ $ enumList 1 body $$ app req-  where-    paramsToStr prefix params = if null params then "" else "\n" ++ prefix ++ (show params)--    allPostParams req' body = run_ $ enumList 1 body $$ parseRequestBody lbsSink req'--    emptyGetParam :: (S.ByteString, Maybe S.ByteString) -> (S.ByteString, S.ByteString)-    emptyGetParam (k, Just v) = (k,v)-    emptyGetParam (k, Nothing) = (k,"")+debug = logStdoutDevLT -    collectPostParams :: ([Param], [File L.ByteString]) -> [Param]-    collectPostParams (postParams, files) = postParams ++-      (map (\(k,v) -> (k, S.append "FILE: " (fileName v))) files)+-- | Deprecated. Use module Network.Wai.Middleware.RequestLogger+debugHandle :: (LT.Text -> IO ()) -> Middleware+debugHandle = logHandleDevLT
+ Network/Wai/Middleware/RequestLogger.hs view
@@ -0,0 +1,103 @@+{-# LANGUAGE OverloadedStrings #-}+module Network.Wai.Middleware.RequestLogger+    ( logStdout+    , logHandle+    , logStdoutDev+    , logHandleDev+    , logStdoutDevLT+    , logHandleDevLT+    ) where++import System.IO (stdout)+import qualified Data.ByteString as BS+import Data.ByteString.Char8 (pack)+import Control.Monad.IO.Class (liftIO)+import Network.Wai (Request(..), Middleware)+import System.Log.FastLogger+import Network.HTTP.Types as H+import qualified Data.Text.Lazy as LT+import qualified Data.Text.Encoding as TE++import Network.Wai.Parse (parseRequestBody, lbsSink, fileName, Param, File)+import qualified Data.ByteString.Lazy as LBS+import Data.Enumerator (run_, ($$), enumList)+import Data.Enumerator.List (consume)+import System.IO (hPutStrLn, stderr)++-- | like @logHandle@, but prints to 'stdout'+logStdout :: Middleware+logStdout = logHandle $ \bs -> hPutLogStr stdout [LB bs]++-- | like @logHandleDev@, but prints to 'stdout'+logStdoutDev :: Middleware+logStdoutDev = logHandleDev $ \bs -> hPutLogStr stdout [LB bs]++-- | Prints a message using the given callback function for each request.+-- Designed for fast production use at the expense of convenience.+-- In particular, no POST parameter information is currently given+-- For something with more useful output, use Network.Wai.Middleware.Debug+logHandle :: (BS.ByteString -> IO ()) -> Middleware+logHandle cb app req = do+    liftIO $ cb $ BS.concat+        [ requestMethod req+        , " "+        , rawPathInfo req+        , rawQueryString req+        , " "+        , "Accept: "+        , maybe "" toBS $ lookup "Accept" $ requestHeaders req+        ]+    app req++toBS :: H.Ascii -> BS.ByteString+toBS = id++-- | Inefficient, but convenient Development load logger middleware+-- Prints a message to 'stderr' for each request using logHandleDevLT+logStdoutDevLT :: Middleware+logStdoutDevLT = logHandleDevLT $ hPutStrLn stderr . LT.unpack++-- | logHandleDev, but expects Lazy Text instead of a ByteString+logHandleDevLT :: (LT.Text -> IO ()) -> Middleware+logHandleDevLT cb app req =+    logHandleDev (\msg -> cb $ LT.fromStrict $ TE.decodeUtf8 msg) app req++-- | Prints a message using the given callback function for each request.+-- This is not for serious production use- it is inefficient.+-- It immediately consumes a POST body and fills it back in and is otherwise inefficient+-- For production use use module Network.Wai.Middleware.RequestLogger+logHandleDev :: (BS.ByteString -> IO ()) -> Middleware+logHandleDev cb app req = do+    body <- consume+    postParams <- if any (requestMethod req ==) ["GET", "HEAD"]+      then return []+      else do postParams <- liftIO $ allPostParams req body+              return $ collectPostParams postParams+    let getParams = map emptyGetParam $ queryString req++    liftIO $ cb $ BS.concat+        [ requestMethod req+        , " "+        , rawPathInfo req+        , "\n"+        , "Accept: "+        , maybe "" id $ lookup "Accept" $ requestHeaders req+        , paramsToBS  "GET " getParams+        , paramsToBS "POST " postParams+        ]+    -- we just consumed the body- fill the enumerator back up so it is available again+    liftIO $ run_ $ enumList 1 body $$ app req+  where+    paramsToBS prefix params =+      if null params then ""+        else BS.concat ["\n", prefix, pack (show params)]++    allPostParams req' body = run_ $ enumList 1 body $$ parseRequestBody lbsSink req'++    emptyGetParam :: (BS.ByteString, Maybe BS.ByteString) -> (BS.ByteString, BS.ByteString)+    emptyGetParam (k, Just v) = (k,v)+    emptyGetParam (k, Nothing) = (k,"")++    collectPostParams :: ([Param], [File LBS.ByteString]) -> [Param]+    collectPostParams (postParams, files) = postParams +++      (map (\(k,v) -> (k, BS.append "FILE: " (fileName v))) files)
wai-extra.cabal view
@@ -1,5 +1,5 @@ Name:                wai-extra-Version:             0.4.5.2+Version:             0.4.6 Synopsis:            Provides some basic WAI handlers and middleware. Description:         The goal here is to provide common features without many dependencies. License:             BSD3@@ -37,12 +37,14 @@                    , case-insensitive          >= 0.2                    , zlib-enum                 >= 0.2.1    && < 0.3                    , data-default              >= 0.3      && < 0.4+                   , fast-logger                >= 0.0.1    Exposed-modules:   Network.Wai.Handler.CGI                      Network.Wai.Middleware.AcceptOverride                      Network.Wai.Middleware.Autohead                      Network.Wai.Middleware.CleanPath                      Network.Wai.Middleware.Debug+                     Network.Wai.Middleware.RequestLogger                      Network.Wai.Middleware.Gzip                      Network.Wai.Middleware.Jsonp                      Network.Wai.Middleware.MethodOverride