on master help sign in
add a contentLength helper
commite2e135ff3ea7033b5e144a2304c231880dae5656 authorGreg Weber <greg@gregweber.info> dateFri 16 Oct 2015, 12:37 (11 years ago) parent9f8f983
3 files changed+29−13
wai-extra/Network/Wai/Header.hs+18 wai-extra/Network/Wai/Middleware/RequestLogger.hs+10−13 wai-extra/wai-extra.cabal+1
wai-extra/Network/Wai/Header.hsnew file+18
@@ -0,0 +1,18 @@
1+-- | Some helpers for dealing with WAI 'Header's.
2+
3+module Network.Wai.Header
4+ ( contentLength
5+ ) where
6+
7+import qualified Data.ByteString.Char8 as S8
8+import Network.HTTP.Types as H
9+
10+-- | More useful for a response. A Wai Request already has a requestBodyLength
11+contentLength :: [(HeaderName, S8.ByteString)] -> Maybe Integer
12+contentLength hdrs = lookup H.hContentLength hdrs >>= readInt
13+
14+readInt :: S8.ByteString -> Maybe Integer
15+readInt bs =
16+ case S8.readInteger bs of
17+ Just (i, "") -> Just i
18+ _ -> Nothing
wai-extra/Network/Wai/Middleware/RequestLogger.hs+10−13
@@ -24,7 +24,11 @@ import qualified Blaze.ByteString.Builder as B
2424import qualified Data.ByteString as BS
2525import Data.ByteString.Char8 (pack, unpack)
2626import Control.Monad.IO.Class (liftIO)
27−import Network.Wai (Request(..), Middleware, responseStatus, Response, responseHeaders)
27+import Network.Wai
28+ ( Request(..), requestBodyLength, RequestBodyLength(..)
29+ , Middleware
30+ , Response, responseStatus, responseHeaders
31+ )
2832import System.Log.FastLogger
2933import Network.HTTP.Types as H
3034import Data.Maybe (fromMaybe)
@@ -41,6 +45,7 @@ import Network.Wai.Internal (Response (..))
4145import Data.Default.Class (Default (def))
4246import Network.Wai.Logger
4347import Network.Wai.Middleware.RequestLogger.Internal
48+import Network.Wai.Header (contentLength)
4449import Data.Text.Encoding (decodeUtf8')
4550
4651data OutputFormat = Apache IPAddrSource
@@ -106,11 +111,7 @@ mkRequestLogger RequestLoggerSettings{..} = do
106111
107112apacheMiddleware :: ApacheLoggerActions -> Middleware
108113apacheMiddleware ala app req sendResponse = app req $ \res -> do
109− let msize = lookup H.hContentLength (responseHeaders res) >>= readInt'
110− readInt' bs =
111− case S8.readInteger bs of
112− Just (i, "") -> Just i
113− _ -> Nothing
114+ let msize = contentLength (responseHeaders res)
114115 apacheLogger ala req (responseStatus res) msize
115116 sendResponse res
116117
@@ -246,11 +247,10 @@ detailedMiddleware' :: Callback
246247 -> (BS.ByteString -> BS.ByteString -> [BS.ByteString])
247248 -> Middleware
248249detailedMiddleware' cb ansiColor ansiMethod ansiStatusCode app req sendResponse = do
249− let mlen = lookup H.hContentLength (requestHeaders req) >>= readInt
250250 (req', body) <-
251− case mlen of
251+ case requestBodyLength req of
252252 -- log the request body if it is small
253− Just len | len <= 2048 -> getRequestBody req
253+ KnownLength len | len <= 2048 -> getRequestBody req
254254 _ -> return (req, [])
255255
256256 let reqbodylog _ = if null body then [""] else ansiColor White " Request Body: " <> body <> ["\n"]
@@ -308,10 +308,7 @@ detailedMiddleware' cb ansiColor ansiMethod ansiStatusCode app req sendResponse
308308 collectPostParams (postParams, files) = postParams ++
309309 map (\(k,v) -> (k, "FILE: " <> fileName v)) files
310310
311− readInt bs =
312− case reads $ unpack bs of
313− (i, _):_ -> Just (i :: Int)
314− [] -> Nothing
311+
315312
316313statusBS :: Response -> BS.ByteString
317314statusBS = pack . show . statusCode . responseStatus
wai-extra/wai-extra.cabal+1
@@ -123,6 +123,7 @@ Library
123123
124124 Exposed-modules: Network.Wai.Handler.CGI
125125 Network.Wai.Handler.SCGI
126+ Network.Wai.Header
126127 Network.Wai.Middleware.AcceptOverride
127128 Network.Wai.Middleware.AddHeaders
128129 Network.Wai.Middleware.Approot