Hello community, here is the log from the commit of package ghc-wai-extra for openSUSE:Factory checked in at 2015-10-19 22:50:33 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-wai-extra (Old) and /work/SRC/openSUSE:Factory/.ghc-wai-extra.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-wai-extra" Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-wai-extra/ghc-wai-extra.changes 2015-08-05 06:50:57.000000000 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-wai-extra.new/ghc-wai-extra.changes 2015-10-20 00:04:38.000000000 +0200 @@ -1,0 +2,7 @@ +Mon Oct 12 19:04:07 UTC 2015 - [email protected] + +- update to 3.0.11.1 +* Add constructor for more detailed custom output formats for RequestLogger +* Add JSON output formatter for RequestLogger + +------------------------------------------------------------------- Old: ---- wai-extra-3.0.10.tar.gz New: ---- wai-extra-3.0.11.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-wai-extra.spec ++++++ --- /var/tmp/diff_new_pack.H8EeHx/_old 2015-10-20 00:04:39.000000000 +0200 +++ /var/tmp/diff_new_pack.H8EeHx/_new 2015-10-20 00:04:39.000000000 +0200 @@ -21,7 +21,7 @@ %bcond_with tests Name: ghc-wai-extra -Version: 3.0.10 +Version: 3.0.11.1 Release: 0 Summary: Provides some basic WAI handlers and middleware License: MIT @@ -34,6 +34,7 @@ BuildRequires: ghc-Cabal-devel BuildRequires: ghc-rpm-macros # Begin cabal-rpm deps: +BuildRequires: ghc-aeson-devel BuildRequires: ghc-ansi-terminal-devel BuildRequires: ghc-base64-bytestring-devel BuildRequires: ghc-blaze-builder-devel @@ -46,6 +47,7 @@ BuildRequires: ghc-directory-devel BuildRequires: ghc-fast-logger-devel BuildRequires: ghc-http-types-devel +BuildRequires: ghc-iproute-devel BuildRequires: ghc-lifted-base-devel BuildRequires: ghc-network-devel BuildRequires: ghc-old-locale-devel ++++++ wai-extra-3.0.10.tar.gz -> wai-extra-3.0.11.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/ChangeLog.md new/wai-extra-3.0.11.1/ChangeLog.md --- old/wai-extra-3.0.10/ChangeLog.md 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/ChangeLog.md 2015-10-06 20:41:51.000000000 +0200 @@ -1,3 +1,8 @@ +## 3.0.11 + +* Add constructor for more detailed custom output formats for RequestLogger +* Add JSON output formatter for RequestLogger + ## 3.0.10 * Adding Request Body to RequestLogger [#401](https://github.com/yesodweb/wai/pull/401) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/EventSource/EventStream.hs new/wai-extra-3.0.11.1/Network/Wai/EventSource/EventStream.hs --- old/wai-extra-3.0.10/Network/Wai/EventSource/EventStream.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/EventSource/EventStream.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE CPP #-} {- code adapted by Mathias Billman originaly from Chris Smith https://github.com/cdsmith/gloss-web -} {-| @@ -11,7 +11,9 @@ import Blaze.ByteString.Builder import Blaze.ByteString.Builder.Char8 +#if __GLASGOW_HASKELL__ < 710 import Data.Monoid +#endif {-| Type representing a communication over an event stream. This can be an diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/EventSource.hs new/wai-extra-3.0.11.1/Network/Wai/EventSource.hs --- old/wai-extra-3.0.10/Network/Wai/EventSource.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/EventSource.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} {-| A WAI adapter to the HTML5 Server-Sent Events API. -} @@ -8,12 +7,11 @@ eventSourceAppIO ) where -import Blaze.ByteString.Builder (Builder) import Data.Function (fix) import Control.Concurrent.Chan (Chan, dupChan, readChan) import Control.Monad.IO.Class (liftIO) -import Network.HTTP.Types (status200) -import Network.Wai (Application, Response, responseStream) +import Network.HTTP.Types (status200, hContentType) +import Network.Wai (Application, responseStream) import Network.Wai.EventSource.EventStream @@ -30,7 +28,7 @@ eventSourceAppIO src _ sendResponse = sendResponse $ responseStream status200 - [("Content-Type", "text/event-stream")] + [(hContentType, "text/event-stream")] $ \sendChunk flush -> fix $ \loop -> do se <- src case eventToBuilder se of diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Handler/CGI.hs new/wai-extra-3.0.11.1/Network/Wai/Handler/CGI.hs --- old/wai-extra-3.0.10/Network/Wai/Handler/CGI.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Handler/CGI.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,6 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RankNTypes #-} -{-# LANGUAGE CPP #-} +{-# LANGUAGE RankNTypes, CPP #-} -- | Backend for Common Gateway Interface. Almost all users should use the -- 'run' function. module Network.Wai.Handler.CGI @@ -21,15 +19,16 @@ import Data.Char (toLower) import qualified System.IO import qualified Data.String as String -import Data.Monoid (mconcat, mempty) import Blaze.ByteString.Builder (fromByteString, toLazyByteString, flush) import Blaze.ByteString.Builder.Char8 (fromChar, fromString) import Data.ByteString.Lazy.Internal (defaultChunkSize) import System.IO (Handle) -import Network.HTTP.Types (Status (..)) +import Network.HTTP.Types (Status (..), hRange, hContentType, hContentLength) import qualified Network.HTTP.Types as H import qualified Data.CaseInsensitive as CI -import Data.Monoid (mappend) +#if __GLASGOW_HASKELL__ < 710 +import Data.Monoid (mconcat, mempty, mappend) +#endif import qualified Data.Streaming.Blaze as Blaze import Data.Function (fix) import Control.Monad (unless, void) @@ -118,7 +117,7 @@ , vault = mempty , requestBodyLength = KnownLength $ fromIntegral contentLength , requestHeaderHost = lookup "host" reqHeaders - , requestHeaderRange = lookup "range" reqHeaders + , requestHeaderRange = lookup hRange reqHeaders } void $ app env $ \res -> case (xsendfile, res) of @@ -162,13 +161,13 @@ , fromByteString " not supported" ] fixHeaders h = - case lookup "content-type" h of - Nothing -> ("Content-Type", "text/html; charset=utf-8") : h + case lookup hContentType h of + Nothing -> (hContentType, "text/html; charset=utf-8") : h Just _ -> h cleanupVarName :: String -> CI.CI B.ByteString -cleanupVarName "CONTENT_TYPE" = "Content-Type" -cleanupVarName "CONTENT_LENGTH" = "Content-Length" +cleanupVarName "CONTENT_TYPE" = hContentType +cleanupVarName "CONTENT_LENGTH" = hContentLength cleanupVarName "SCRIPT_NAME" = "CGI-Script-Name" cleanupVarName s = case s of diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/AcceptOverride.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/AcceptOverride.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/AcceptOverride.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/AcceptOverride.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} - module Network.Wai.Middleware.AcceptOverride ( acceptOverride ) where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/AddHeaders.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/AddHeaders.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/AddHeaders.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/AddHeaders.hs 2015-08-14 22:03:39.000000000 +0200 @@ -5,7 +5,7 @@ ( addHeaders ) where -import Network.HTTP.Types (ResponseHeaders, Header) +import Network.HTTP.Types (Header) import Network.Wai (Middleware, modifyResponse, mapResponseHeaders) import Network.Wai.Internal (Response(..)) import Data.ByteString (ByteString) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Approot.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Approot.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Approot.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Approot.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,4 @@ {-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE OverloadedStrings #-} -- | Middleware for establishing the root of the application. -- -- Many application need the ability to create URLs referring back to the @@ -29,13 +28,12 @@ import Control.Exception (Exception, throw) import Data.ByteString (ByteString) -import qualified Data.ByteString as S import qualified Data.ByteString.Char8 as S8 import Data.Maybe (fromMaybe) import Data.Typeable (Typeable) import qualified Data.Vault.Lazy as V -import Network.Wai (Request, vault, Middleware, requestHeaderHost) -import Network.Wai.Request (appearsSecure, guessApproot) +import Network.Wai (Request, vault, Middleware) +import Network.Wai.Request (guessApproot) import System.Environment (getEnvironment) import System.IO.Unsafe (unsafePerformIO) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Autohead.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Autohead.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Autohead.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Autohead.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,10 +1,12 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE CPP #-} -- | Automatically produce responses to HEAD requests based on the underlying -- applications GET response. module Network.Wai.Middleware.Autohead (autohead) where import Network.Wai +#if __GLASGOW_HASKELL__ < 710 import Data.Monoid (mempty) +#endif autohead :: Middleware autohead app req sendResponse diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/CleanPath.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/CleanPath.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/CleanPath.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/CleanPath.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE CPP #-} module Network.Wai.Middleware.CleanPath ( cleanPath ) where @@ -6,9 +6,11 @@ import Network.Wai import qualified Data.ByteString.Char8 as B import qualified Data.ByteString.Lazy as L -import Network.HTTP.Types (status301) +import Network.HTTP.Types (status301, hLocation) import Data.Text (Text) +#if __GLASGOW_HASKELL__ < 710 import Data.Monoid (mconcat) +#endif cleanPath :: ([Text] -> Either B.ByteString [Text]) -> B.ByteString @@ -19,7 +21,7 @@ Right pieces -> app pieces env sendResponse Left p -> sendResponse $ responseLBS status301 - [("Location", mconcat [prefix, p, suffix])] + [(hLocation, mconcat [prefix, p, suffix])] $ L.empty where -- include the query string if present diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/ForceSSL.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/ForceSSL.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/ForceSSL.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/ForceSSL.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} -- | Redirect non-SSL requests to https -- -- Since 3.0.7 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Gzip.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Gzip.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Gzip.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Gzip.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,6 +1,4 @@ -{-# LANGUAGE Rank2Types #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE Rank2Types, ScopedTypeVariables #-} --------------------------------------------------------- -- | -- Module : Network.Wai.Middleware.Gzip @@ -29,9 +27,8 @@ import qualified Data.ByteString.Char8 as S8 import qualified Data.ByteString as S import Data.Default.Class -import Network.HTTP.Types (Status, Header) -import Control.Monad.IO.Class (liftIO) -import Control.Monad.Trans.Resource (runResourceT) +import Network.HTTP.Types ( Status, Header, hContentEncoding, hUserAgent + , hContentType, hContentLength) import System.Directory (doesFileExist, createDirectoryIfMissing) import Blaze.ByteString.Builder (fromByteString) import Control.Exception (try, SomeException) @@ -45,6 +42,7 @@ import Control.Exception (throwIO) import qualified System.IO as IO import Data.ByteString.Lazy.Internal (defaultChunkSize) +import Data.Word8 (_semicolon) data GzipSettings = GzipSettings { gzipFiles :: GzipFiles @@ -61,7 +59,7 @@ defaultCheckMime bs = S8.isPrefixOf "text/" bs || bs' `Set.member` toCompress where - bs' = fst $ S.breakByte 59 bs -- semicolon + bs' = fst $ S.break (== _semicolon) bs toCompress = Set.fromList [ "application/json" , "application/javascript" @@ -85,7 +83,7 @@ then case (res, gzipFiles set) of (ResponseFile s hs file Nothing, GzipCacheFolder cache) -> - case lookup "content-type" hs of + case lookup hContentType hs of Just m | gzipCheckMime set m -> compressFile s hs file cache sendResponse _ -> sendResponse res @@ -94,9 +92,9 @@ where enc = fromMaybe [] $ (splitCommas . S8.unpack) `fmap` lookup "Accept-Encoding" (requestHeaders env) - ua = fromMaybe "" $ lookup "user-agent" $ requestHeaders env + ua = fromMaybe "" $ lookup hUserAgent $ requestHeaders env isMSIE6 = "MSIE 6" `S.isInfixOf` ua - isEncoded res = isJust $ lookup "Content-Encoding" $ responseHeaders res + isEncoded res = isJust $ lookup hContentEncoding $ responseHeaders res compressFile :: Status -> [Header] -> FilePath -> FilePath -> (Response -> IO a) -> IO a compressFile s hs file cache sendResponse = do @@ -118,7 +116,7 @@ Z.PRNext bs -> do S.hPut outH bs loop - Z.PRError e -> throwIO e + Z.PRError ex -> throwIO ex fix $ \loop -> do bs <- S.hGetSome inH defaultChunkSize unless (S.null bs) $ do @@ -145,11 +143,11 @@ -> (Response -> IO a) -> IO a compressE set res sendResponse = - case lookup "content-type" hs of + case lookup hContentType hs of Just m | gzipCheckMime set m -> let hs' = fixHeaders hs in wb $ \body -> sendResponse $ responseStream s hs' $ \sendChunk flush -> do - (blazeRecv, blazeFinish) <- B.newBlazeRecv B.defaultStrategy + (blazeRecv, _) <- B.newBlazeRecv B.defaultStrategy deflate <- Z.initDeflate 1 (Z.WindowBits 31) let sendBuilder builder = do popper <- blazeRecv builder @@ -164,8 +162,8 @@ deflatePopper $ Z.flushDeflate deflate flush deflatePopper popper = fix $ \loop -> do - res <- popper - case res of + result <- popper + case result of Z.PRDone -> return () Z.PRNext bs' -> do sendChunk $ fromByteString bs' @@ -183,9 +181,9 @@ -- different length after gzip compression. fixHeaders :: [Header] -> [Header] fixHeaders = - (("Content-Encoding", "gzip") :) . filter notLength + ((hContentEncoding, "gzip") :) . filter notLength where - notLength (x, _) = x /= "content-length" + notLength (x, _) = x /= hContentLength splitCommas :: String -> [String] splitCommas [] = [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/HttpAuth.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/HttpAuth.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/HttpAuth.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/HttpAuth.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE RecordWildCards, OverloadedStrings, TupleSections #-} +{-# LANGUAGE RecordWildCards, TupleSections, CPP #-} -- | Implements HTTP Basic Authentication. -- -- This module may add digest authentication in the future. @@ -14,13 +14,14 @@ , extractBasicAuth , extractBearerAuth ) where - +#if __GLASGOW_HASKELL__ < 710 import Control.Applicative +#endif import Data.ByteString (ByteString) import Data.ByteString.Base64 (decodeLenient) import Data.String (IsString (..)) import Data.Word8 (isSpace, _colon, toLower) -import Network.HTTP.Types (status401) +import Network.HTTP.Types (status401, hContentType, hAuthorization) import Network.Wai import qualified Data.ByteString as S @@ -47,7 +48,7 @@ else authOnNoAuth authRealm req sendResponse where check = - case (lookup "Authorization" $ requestHeaders req) + case (lookup hAuthorization $ requestHeaders req) >>= extractBasicAuth of Nothing -> return False Just (username, password) -> checkCreds username password @@ -84,7 +85,7 @@ { authRealm = fromString s , authOnNoAuth = \realm _req f -> f $ responseLBS status401 - [ ("Content-Type", "text/plain") + [ (hContentType, "text/plain") , ("WWW-Authenticate", S.concat [ "Basic realm=\"" , realm @@ -108,7 +109,7 @@ where extract encoded = let raw = decodeLenient encoded - (username, password') = S.breakByte _colon raw + (username, password') = S.break (== _colon) raw in ((username,) . snd) <$> S.uncons password' -- | Extract bearer authentication data from __Authorization__ header diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Jsonp.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Jsonp.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Jsonp.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Jsonp.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE RankNTypes, CPP #-} --------------------------------------------------------- -- | -- Module : Network.Wai.Middleware.Jsonp @@ -19,14 +18,15 @@ import Network.Wai.Internal import Data.ByteString (ByteString) import qualified Data.ByteString.Char8 as B8 -import Blaze.ByteString.Builder (Builder, copyByteString) +import Blaze.ByteString.Builder (copyByteString) import Blaze.ByteString.Builder.Char8 (fromChar) +#if __GLASGOW_HASKELL__ < 710 import Data.Monoid (mappend) +#endif import Control.Monad (join) import Data.Maybe (fromMaybe) import qualified Data.ByteString as S -import Data.CaseInsensitive (CI) -import Network.HTTP.Types (Status) +import Network.HTTP.Types (hAccept, hContentType) -- | Wrap json responses in a jsonp callback. -- @@ -37,7 +37,7 @@ -- callback function. jsonp :: Middleware jsonp app env sendResponse = do - let accept = fromMaybe B8.empty $ lookup "Accept" $ requestHeaders env + let accept = fromMaybe B8.empty $ lookup hAccept $ requestHeaders env let callback :: Maybe B8.ByteString callback = if B8.pack "text/javascript" `B8.isInfixOf` accept @@ -47,7 +47,7 @@ case callback of Nothing -> env Just _ -> env - { requestHeaders = changeVal "Accept" + { requestHeaders = changeVal hAccept "application/json" $ requestHeaders env } @@ -72,17 +72,17 @@ (s, hs, wb) = responseToStream r checkJSON hs = - case lookup "Content-Type" hs of + case lookup hContentType hs of Just x | B8.pack "application/json" `S.isPrefixOf` x -> Just $ fixHeaders hs _ -> Nothing - fixHeaders = changeVal "Content-Type" "text/javascript" + fixHeaders = changeVal hContentType "text/javascript" addCallback cb s hs wb = wb $ \body -> sendResponse $ responseStream s hs $ \sendChunk flush -> do sendChunk $ copyByteString cb `mappend` fromChar '(' - body sendChunk flush + _ <- body sendChunk flush sendChunk $ fromChar ')' changeVal :: Eq a diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Local.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Local.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Local.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Local.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings, CPP #-} +{-# LANGUAGE CPP #-} -- | Only allow local connections. -- module Network.Wai.Middleware.Local diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/MethodOverride.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/MethodOverride.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/MethodOverride.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/MethodOverride.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} module Network.Wai.Middleware.MethodOverride ( methodOverride ) where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/MethodOverridePost.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/MethodOverridePost.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/MethodOverridePost.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/MethodOverridePost.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE CPP #-} ----------------------------------------------------------------- -- | Module : Network.Wai.Middleware.MethodOverridePost -- @@ -9,8 +9,11 @@ ) where import Network.Wai -import Network.HTTP.Types (parseQuery) +import Network.HTTP.Types (parseQuery, hContentType) + +#if __GLASGOW_HASKELL__ < 710 import Data.Monoid (mconcat, mempty) +#endif import Data.IORef import Data.ByteString.Lazy (toChunks) @@ -27,7 +30,7 @@ -- methodOverridePost :: Middleware methodOverridePost app req send = - case (requestMethod req, lookup "Content-Type" (requestHeaders req)) of + case (requestMethod req, lookup hContentType (requestHeaders req)) of ("POST", Just "application/x-www-form-urlencoded") -> setPost req >>= flip app send _ -> app req send diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/RequestLogger/Internal.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/RequestLogger/Internal.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/RequestLogger/Internal.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/RequestLogger/Internal.hs 2015-08-14 22:03:39.000000000 +0200 @@ -8,9 +8,10 @@ import Data.ByteString (ByteString) import Network.Wai.Logger (clockDateCacher) +#if !MIN_VERSION_wai_logger(2, 2, 0) import Control.Concurrent (forkIO, threadDelay) import Control.Monad (forever) - +#endif import System.Log.FastLogger (LogStr, fromLogStr) logToByteString :: LogStr -> ByteString @@ -18,12 +19,15 @@ getDateGetter :: IO () -- ^ flusher -> IO (IO ByteString) +#if !MIN_VERSION_wai_logger(2, 2, 0) getDateGetter flusher = do (getter, updater) <- clockDateCacher -#if !MIN_VERSION_wai_logger(2, 2, 0) _ <- forkIO $ forever $ do threadDelay 1000000 updater flusher +#else +getDateGetter _ = do + (getter, _) <- clockDateCacher #endif return getter diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/RequestLogger/JSON.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/RequestLogger/JSON.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/RequestLogger/JSON.hs 1970-01-01 01:00:00.000000000 +0100 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/RequestLogger/JSON.hs 2015-10-06 20:41:51.000000000 +0200 @@ -0,0 +1,99 @@ +{-# LANGUAGE RecordWildCards #-} + +module Network.Wai.Middleware.RequestLogger.JSON (formatAsJSON) where + +import qualified Blaze.ByteString.Builder as BB +import Data.Aeson +import Data.CaseInsensitive (original) +import Data.Monoid ((<>)) +import qualified Data.ByteString.Char8 as S8 +import Data.IP +import qualified Data.Text as T +import Data.Text (Text) +import Data.Text.Encoding (decodeUtf8) +import Data.Time (NominalDiffTime) +import Data.Word (Word32) +import Network.HTTP.Types as H +import Network.Socket (SockAddr (..), PortNumber) +import Network.Wai +import Network.Wai.Middleware.RequestLogger +import System.Log.FastLogger (toLogStr) +import Text.Printf (printf) + +formatAsJSON :: OutputFormatterWithDetails +formatAsJSON date req status responseSize duration reqBody response = + toLogStr (encode $ + object + [ "request" .= requestToJSON duration req reqBody + , "response" .= + object + [ "status" .= statusCode status + , "size" .= responseSize + , "body" .= + if statusCode status >= 400 + then Just . decodeUtf8 . BB.toByteString $ response + else Nothing + ] + , "time" .= decodeUtf8 date + ]) <> "\n" + +word32ToHostAddress :: Word32 -> Text +word32ToHostAddress = T.intercalate "." . map (T.pack . show) . fromIPv4 . fromHostAddress + +readAsDouble :: String -> Double +readAsDouble = read + +requestToJSON :: NominalDiffTime -> Request -> [S8.ByteString] -> Value +requestToJSON duration req reqBody = + object + [ "method" .= decodeUtf8 (requestMethod req) + , "path" .= decodeUtf8 (rawPathInfo req) + , "queryString" .= map queryItemToJSON (queryString req) + , "durationMs" .= (readAsDouble . printf "%.2f" . rationalToDouble $ toRational duration * 1000) + , "size" .= requestBodyLengthToJSON (requestBodyLength req) + , "body" .= decodeUtf8 (S8.concat reqBody) + , "remoteHost" .= sockToJSON (remoteHost req) + , "httpVersion" .= httpVersionToJSON (httpVersion req) + , "headers" .= requestHeadersToJSON (requestHeaders req) + ] + where + rationalToDouble :: Rational -> Double + rationalToDouble = fromRational + +sockToJSON :: SockAddr -> Value +sockToJSON (SockAddrInet pn ha) = + object + [ "port" .= portToJSON pn + , "hostAddress" .= word32ToHostAddress ha + ] +sockToJSON (SockAddrInet6 pn _ ha _) = + object + [ "port" .= portToJSON pn + , "hostAddress" .= ha + ] +sockToJSON (SockAddrUnix sock) = + object [ "unix" .= sock ] +sockToJSON (SockAddrCan i) = + object [ "can" .= i ] + +queryItemToJSON :: QueryItem -> Value +queryItemToJSON (name, mValue) = toJSON (decodeUtf8 name, fmap decodeUtf8 mValue) + +requestHeadersToJSON :: RequestHeaders -> Value +requestHeadersToJSON = toJSON . map hToJ where + -- Redact cookies + hToJ ("Cookie", _) = toJSON ("Cookie" :: Text, "-RDCT-" :: Text) + hToJ hd = headerToJSON hd + +headerToJSON :: Header -> Value +headerToJSON (headerName, header) = toJSON (decodeUtf8 . original $ headerName, decodeUtf8 header) + +portToJSON :: PortNumber -> Value +portToJSON = toJSON . toInteger + +httpVersionToJSON :: HttpVersion -> Value +httpVersionToJSON (HttpVersion major minor) = String $ T.pack (show major) <> "." <> T.pack (show minor) + +requestBodyLengthToJSON :: RequestBodyLength -> Value +requestBodyLengthToJSON ChunkedBody = String "Unknown" +requestBodyLengthToJSON (KnownLength l) = toJSON l diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/RequestLogger.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/RequestLogger.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/RequestLogger.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/RequestLogger.hs 2015-10-09 21:47:57.000000000 +0200 @@ -1,6 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} - -- NOTE: Due to https://github.com/yesodweb/wai/issues/192, this module should -- not use CPP. module Network.Wai.Middleware.RequestLogger @@ -15,12 +13,14 @@ , destination , OutputFormat (..) , OutputFormatter + , OutputFormatterWithDetails , Destination (..) , Callback , IPAddrSource (..) ) where import System.IO (Handle, stdout) +import qualified Blaze.ByteString.Builder as B import qualified Data.ByteString as BS import Data.ByteString.Char8 (pack, unpack) import Control.Monad.IO.Class (liftIO) @@ -29,18 +29,15 @@ import Network.HTTP.Types as H import Data.Maybe (fromMaybe) import Data.Monoid (mconcat, (<>)) -import Data.Time (getCurrentTime, diffUTCTime) - -import Network.Wai.Parse (sinkRequestBody, lbsBackEnd, fileName, Param, File, getRequestBodyType) +import Data.Time (getCurrentTime, diffUTCTime, NominalDiffTime) +import Network.Wai.Parse (sinkRequestBody, lbsBackEnd, fileName, Param, File + , getRequestBodyType) import qualified Data.ByteString.Lazy as LBS import qualified Data.ByteString.Char8 as S8 - import System.Console.ANSI import Data.IORef.Lifted import System.IO.Unsafe -import Control.Monad (unless) -import Network.Wai.Internal (Response (ResponseRaw)) - +import Network.Wai.Internal (Response (..)) import Data.Default.Class (Default (def)) import Network.Wai.Logger import Network.Wai.Middleware.RequestLogger.Internal @@ -49,8 +46,11 @@ data OutputFormat = Apache IPAddrSource | Detailed Bool -- ^ use colors? | CustomOutputFormat OutputFormatter + | CustomOutputFormatWithDetails OutputFormatterWithDetails type OutputFormatter = ZonedDate -> Request -> Status -> Maybe Integer -> LogStr +type OutputFormatterWithDetails = + ZonedDate -> Request -> Status -> Maybe Integer -> NominalDiffTime -> [S8.ByteString] -> B.Builder -> LogStr data Destination = Handle Handle | Logger LoggerSet @@ -98,12 +98,15 @@ (\str -> callback str >> flusher) useColors CustomOutputFormat formatter -> do + getDate <- getDateGetter flusher + return $ customMiddleware callback getDate formatter + CustomOutputFormatWithDetails formatter -> do getdate <- getDateGetter flusher - return $ customMiddleware callback getdate formatter + return $ customMiddlewareWithDetails callback getdate formatter apacheMiddleware :: ApacheLoggerActions -> Middleware apacheMiddleware ala app req sendResponse = app req $ \res -> do - let msize = lookup "content-length" (responseHeaders res) >>= readInt' + let msize = lookup H.hContentLength (responseHeaders res) >>= readInt' readInt' bs = case S8.readInteger bs of Just (i, "") -> Just i @@ -118,6 +121,22 @@ liftIO $ cb $ formatter date req (responseStatus res) Nothing sendResponse res +customMiddlewareWithDetails :: Callback -> IO ZonedDate -> OutputFormatterWithDetails -> Middleware +customMiddlewareWithDetails cb getdate formatter app req sendResponse = do + (req', reqBody) <- getRequestBody req + t0 <- getCurrentTime + app req' $ \res -> do + t1 <- getCurrentTime + date <- liftIO getdate + -- We use Nothing for the response size since we generally don't know it + builderIO <- newIORef $ B.fromByteString "" + res' <- recordChunks builderIO res + rspRcv <- sendResponse res' + _ <- liftIO . cb . + formatter date req' (responseStatus res') Nothing (t1 `diffUTCTime` t0) reqBody =<< + readIORef builderIO + return rspRcv + -- | Production request logger middleware. {-# NOINLINE logStdout #-} logStdout :: Middleware @@ -187,40 +206,51 @@ "5" -> ansiColor' Magenta t _ -> ansiColor' Blue t +recordChunks :: IORef B.Builder -> Response -> IO Response +recordChunks i (ResponseStream s h sb) = + return . ResponseStream s h $ (\send flush -> sb (\b -> modifyIORef i (<> b) >> send b) flush) +recordChunks i (ResponseBuilder s h b) = + modifyIORef i (<> b) >> (return $ ResponseBuilder s h b) +recordChunks _ r = + return r + +getRequestBody :: Request -> IO (Request, [S8.ByteString]) +getRequestBody req = do + let loop front = do + bs <- requestBody req + if S8.null bs + then return $ front [] + else loop $ front . (bs:) + body <- loop id + -- logging the body here consumes it, so fill it back up + -- obviously not efficient, but this is the development logger + -- + -- Note: previously, we simply used CL.sourceList. However, + -- that meant that you could read the request body in twice. + -- While that in itself is not a problem, the issue is that, + -- in production, you wouldn't be able to do this, and + -- therefore some bugs wouldn't show up during testing. This + -- implementation ensures that each chunk is only returned + -- once. + ichunks <- newIORef body + let rbody = atomicModifyIORef ichunks $ \chunks -> + case chunks of + [] -> ([], S8.empty) + x:y -> (y, x) + let req' = req { requestBody = rbody } + return (req', body) + detailedMiddleware' :: Callback -> (Color -> BS.ByteString -> [BS.ByteString]) -> (BS.ByteString -> [BS.ByteString]) -> (BS.ByteString -> BS.ByteString -> [BS.ByteString]) -> Middleware detailedMiddleware' cb ansiColor ansiMethod ansiStatusCode app req sendResponse = do - let mlen = lookup "content-length" (requestHeaders req) >>= readInt + let mlen = lookup H.hContentLength (requestHeaders req) >>= readInt (req', body) <- case mlen of -- log the request body if it is small - Just len | len <= 2048 -> do - let loop front = do - bs <- requestBody req - if S8.null bs - then return $ front [] - else loop $ front . (bs:) - body <- loop id - -- logging the body here consumes it, so fill it back up - -- obviously not efficient, but this is the development logger - -- - -- Note: previously, we simply used CL.sourceList. However, - -- that meant that you could read the request body in twice. - -- While that in itself is not a problem, the issue is that, - -- in production, you wouldn't be able to do this, and - -- therefore some bugs wouldn't show up during testing. This - -- implementation ensures that each chunk is only returned - -- once. - ichunks <- newIORef body - let rbody = atomicModifyIORef ichunks $ \chunks -> - case chunks of - [] -> ([], S8.empty) - x:y -> (y, x) - let req' = req { requestBody = rbody } - return (req', body) + Just len | len <= 2048 -> getRequestBody req _ -> return (req, []) let reqbodylog _ = if null body then [""] else ansiColor White " Request Body: " <> body <> ["\n"] @@ -231,7 +261,7 @@ return $ collectPostParams postParams let getParams = map emptyGetParam $ queryString req - accept = fromMaybe "" $ lookup "Accept" $ requestHeaders req + accept = fromMaybe "" $ lookup H.hAccept $ requestHeaders req params = let par | not $ null postParams = [pack (show postParams)] | not $ null getParams = [pack (show getParams)] | otherwise = [] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Rewrite.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Rewrite.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Rewrite.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Rewrite.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} module Network.Wai.Middleware.Rewrite ( rewrite, rewritePure ) where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/StreamFile.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/StreamFile.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/StreamFile.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/StreamFile.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} - -- | -- -- Since 3.0.4 @@ -11,6 +9,7 @@ import Network.Wai (Middleware, responseToStream) import qualified Data.ByteString.Char8 as S8 import System.PosixCompat (getFileStatus, fileSize, FileOffset) +import Network.HTTP.Types (hContentLength) -- |Convert ResponseFile type responses into ResponseStream type -- @@ -34,7 +33,7 @@ sendBody :: StreamingBody -> IO ResponseReceived sendBody body = do len <- getFileSize fp - let hs' = ("Content-Length", (S8.pack (show len))) : hs + let hs' = (hContentLength, (S8.pack (show len))) : hs sendResponse $ responseStream s hs' body _ -> sendResponse res diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Middleware/Vhost.hs new/wai-extra-3.0.11.1/Network/Wai/Middleware/Vhost.hs --- old/wai-extra-3.0.10/Network/Wai/Middleware/Vhost.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Middleware/Vhost.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,5 @@ -{-# LANGUAGE OverloadedStrings #-} -module Network.Wai.Middleware.Vhost (vhost, redirectWWW, redirectTo, redirectToLogged) where +{-# LANGUAGE CPP #-} + module Network.Wai.Middleware.Vhost (vhost, redirectWWW, redirectTo, redirectToLogged) where import Network.Wai @@ -7,7 +7,9 @@ import qualified Data.Text.Encoding as TE import Data.Text (Text) import qualified Data.ByteString as BS +#if __GLASGOW_HASKELL__ < 710 import Data.Monoid (mappend) +#endif vhost :: [(Request -> Bool, Application)] -> Application -> Application vhost vhosts def req = @@ -27,7 +29,7 @@ redirectTo :: BS.ByteString -> Response redirectTo location = responseLBS H.status301 - [ ("Content-Type", "text/plain") , ("Location", location) ] "Redirect" + [ (H.hContentType, "text/plain") , (H.hLocation, location) ] "Redirect" redirectToLogged :: (Text -> IO ()) -> BS.ByteString -> IO Response redirectToLogged logger loc = do diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Parse.hs new/wai-extra-3.0.11.1/Network/Wai/Parse.hs --- old/wai-extra-3.0.10/Network/Wai/Parse.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Parse.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,5 +1,4 @@ {-# LANGUAGE CPP #-} -{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE PatternGuards #-} {-# LANGUAGE TypeFamilies #-} @@ -45,6 +44,7 @@ import Control.Monad (when, unless) import Control.Monad.Trans.Resource (allocate, release, register, InternalState, runInternalState) import Data.IORef +import Network.HTTP.Types (hContentType) breakDiscard :: Word8 -> S.ByteString -> (S.ByteString, S.ByteString) breakDiscard w s = @@ -140,7 +140,7 @@ getRequestBodyType :: Request -> Maybe RequestBodyType getRequestBodyType req = do - ctype' <- lookup "Content-Type" $ requestHeaders req + ctype' <- lookup hContentType $ requestHeaders req let (ctype, attrs) = parseContentType ctype' case ctype of "application/x-www-form-urlencoded" -> return UrlEncoded diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/Request.hs new/wai-extra-3.0.11.1/Network/Wai/Request.hs --- old/wai-extra-3.0.10/Network/Wai/Request.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/Request.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,3 @@ -{-# LANGUAGE OverloadedStrings #-} -- | Some helpers for interrogating a WAI 'Request'. module Network.Wai.Request @@ -32,6 +31,7 @@ , ("HTTP_X_FORWARDED_SSL" , (== "on")) , ("HTTP_X_FORWARDED_SCHEME", (== "https")) , ("HTTP_X_FORWARDED_PROTO" , ((== ["https"]) . take 1 . C.split ',')) + , ("X-Forwarded-Proto" , (== "https")) -- Used by Nginx and AWS ELB. ] where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/Network/Wai/UrlMap.hs new/wai-extra-3.0.11.1/Network/Wai/UrlMap.hs --- old/wai-extra-3.0.10/Network/Wai/UrlMap.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/Network/Wai/UrlMap.hs 2015-08-14 22:03:39.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings, TypeSynonymInstances, FlexibleInstances #-} +{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} {-# LANGUAGE ExistentialQuantification #-} {- | This module gives you a way to mount applications under sub-URIs. For example: @@ -93,7 +93,7 @@ Nothing -> sendResponse $ responseLBS status404 - [("content-type", "text/plain")] + [(hContentType, "text/plain")] "Not found\n" where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/test/Network/Wai/Middleware/RoutedSpec.hs new/wai-extra-3.0.11.1/test/Network/Wai/Middleware/RoutedSpec.hs --- old/wai-extra-3.0.10/test/Network/Wai/Middleware/RoutedSpec.hs 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/test/Network/Wai/Middleware/RoutedSpec.hs 2015-08-14 22:03:39.000000000 +0200 @@ -9,7 +9,7 @@ import Network.Wai.Middleware.Routed import Network.Wai.Middleware.ForceSSL (forceSSL) -import Network.HTTP.Types (methodPost, status200, status301, status307) +import Network.HTTP.Types (hContentType, status200) import Network.Wai import Network.Wai.Test import Data.ByteString (ByteString) @@ -39,7 +39,7 @@ jsonApp :: Application jsonApp _req cps = cps $ responseLBS status200 - [("Content-Type", "application/json")] + [(hContentType, "application/json")] "{\"foo\":\"bar\"}" testDPath :: ByteString -> Session SResponse diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/wai-extra-3.0.10/wai-extra.cabal new/wai-extra-3.0.11.1/wai-extra.cabal --- old/wai-extra-3.0.10/wai-extra.cabal 2015-07-24 19:15:26.000000000 +0200 +++ new/wai-extra-3.0.11.1/wai-extra.cabal 2015-10-10 00:52:55.000000000 +0200 @@ -1,5 +1,5 @@ Name: wai-extra -Version: 3.0.10 +Version: 3.0.11.1 Synopsis: Provides some basic WAI handlers and middleware. description: Provides basic WAI handler and middleware functionality: @@ -87,7 +87,7 @@ , wai >= 3.0.3.0 && < 3.1 , old-locale >= 1.0.0.2 && < 1.1 , time >= 1.1.4 - , network >= 2.2.1.5 + , network >= 2.6.1.0 , directory >= 1.0.1 , transformers >= 0.2.2 , blaze-builder >= 0.2.1.4 && < 0.5 @@ -110,12 +110,17 @@ , unix-compat , cookie , vault + , zlib + , aeson + , iproute if os(windows) cpp-options: -DWINDOWS else build-depends: unix + extensions: OverloadedStrings + Exposed-modules: Network.Wai.Handler.CGI Network.Wai.Handler.SCGI Network.Wai.Middleware.AcceptOverride @@ -125,6 +130,7 @@ Network.Wai.Middleware.CleanPath Network.Wai.Middleware.Local Network.Wai.Middleware.RequestLogger + Network.Wai.Middleware.RequestLogger.JSON Network.Wai.Middleware.Gzip Network.Wai.Middleware.Jsonp Network.Wai.Middleware.MethodOverride
