@@ -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,12 @@ 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+ -- second tuple item should not be necessary, but a test runner might mess it up
252+ case (requestBodyLength req, contentLength (requestHeaders req)) of
252253 -- log the request body if it is small
253− Just len | len <= 2048 -> getRequestBody req
254+ (KnownLength len, _) | len <= 2048 -> getRequestBody req
255+ (_, Just len) | len <= 2048 -> getRequestBody req
254256 _ -> return (req, [])
255257
256258 let reqbodylog _ = if null body then [""] else ansiColor White " Request Body: " <> body <> ["\n"]
@@ -308,10 +310,7 @@ detailedMiddleware' cb ansiColor ansiMethod ansiStatusCode app req sendResponse
308310 collectPostParams (postParams, files) = postParams ++
309311 map (\(k,v) -> (k, "FILE: " <> fileName v)) files
310312
311− readInt bs =
312− case reads $ unpack bs of
313− (i, _):_ -> Just (i :: Int)
314− [] -> Nothing
313+
315314
316315statusBS :: Response -> BS.ByteString
317316statusBS = pack . show . statusCode . responseStatus