@@ -2,6 +2,7 @@
22{-# LANGUAGE ScopedTypeVariables #-}
33{-# LANGUAGE TupleSections #-}
44{-# LANGUAGE RankNTypes #-}
5+{-# LANGUAGE CPP #-}
56
67module Network.Wai.Handler.Warp.Response (
78 sendResponse
@@ -24,7 +25,11 @@ import Data.Conduit.Blaze (unsafeBuilderToByteString)
2425import Data.Function (on)
2526import Data.List (deleteBy)
2627import Data.Maybe (isJust, listToMaybe)
28+#if MIN_VERSION_base(4,5,0)
29+import Data.Monoid ((<>))
30+#else
2731import Data.Monoid (mappend)
32+#endif
2833import Data.Version (showVersion)
2934import Network.HTTP.Attoparsec (parseByteRanges)
3035import qualified Network.HTTP.Types as H
@@ -39,6 +44,11 @@ import Numeric (showInt)
3944import qualified Paths_warp
4045import qualified System.PosixCompat.Files as P
4146
47+#if !MIN_VERSION_base(4,5,0)
48+(<>) :: Monoid m => m -> m -> m
49+(<>) = mappend
50+#endif
51+
4252-- $setup
4353-- >>> :set -XOverloadedStrings
4454
@@ -199,13 +209,13 @@ sendRsp conn ver s0 hs0 (RspFile path mPart mRange hook) = do
199209
200210----------------------------------------------------------------
201211
202−sendRsp conn ver s hs (RspBuilder b needsChunked) = do
212+sendRsp conn ver s hs (RspBuilder body needsChunked) = do
203213 header <- composeHeaderBuilder ver s hs needsChunked
204− let body
205− | needsChunked = header `mappend` chunkedTransferEncoding b
206− `mappend` chunkedTransferTerminator
207− | otherwise = header `mappend` b
208− flip toByteStringIO body $ \bs -> connSendAll conn bs
214+ let hdrBdy
215+ | needsChunked = header <> chunkedTransferEncoding body
216+ <> chunkedTransferTerminator
217+ | otherwise = header <> body
218+ flip toByteStringIO hdrBdy $ connSendAll conn
209219
210220----------------------------------------------------------------
211221