on master help sign in
Reinstate connReadBuffer/connWriteBuffer #249
fb381bbMichael Snoyman
warp/Network/Wai/Handler/Warp/Response.hs+5−5
@@ -12,7 +12,6 @@ module Network.Wai.Handler.Warp.Response (
12 ) where
12 ) where
13
13
14import Blaze.ByteString.Builder (fromByteString, Builder, flush)
14import Blaze.ByteString.Builder (fromByteString, Builder, flush)
15−import Blaze.ByteString.Builder.Internal (defaultBufferSize)
16import Blaze.ByteString.Builder.HTTP (chunkedTransferEncoding, chunkedTransferTerminator)
15import Blaze.ByteString.Builder.HTTP (chunkedTransferEncoding, chunkedTransferTerminator)
17import Control.Applicative
16import Control.Applicative
18import Control.Exception
17import Control.Exception
@@ -25,7 +24,7 @@ import qualified Data.ByteString.Char8 as B (pack)
25import qualified Data.CaseInsensitive as CI
24import qualified Data.CaseInsensitive as CI
26import Data.Conduit
25import Data.Conduit
27import qualified Data.Conduit.List as CL
26import qualified Data.Conduit.List as CL
28−import Data.Conduit.Blaze (builderToByteStringWith, allocBuffer, reuseBufferStrategy)
27+import Data.Conduit.Blaze (unsafeBuilderToByteString)
29import Data.Function (on)
28import Data.Function (on)
30import Data.List (deleteBy)
29import Data.List (deleteBy)
31import Data.Maybe (isJust, listToMaybe)
30import Data.Maybe (isJust, listToMaybe)
@@ -38,6 +37,7 @@ import Data.Version (showVersion)
38import qualified Network.HTTP.Types as H
37import qualified Network.HTTP.Types as H
39import Network.Wai
38import Network.Wai
40import qualified Network.Wai.Handler.Warp.Date as D
39import qualified Network.Wai.Handler.Warp.Date as D
40+import Network.Wai.Handler.Warp.Buffer (toBlazeBuffer)
41import Network.Wai.Handler.Warp.Header
41import Network.Wai.Handler.Warp.Header
42import Network.Wai.Handler.Warp.IO (toBufIOWith)
42import Network.Wai.Handler.Warp.IO (toBufIOWith)
43import Network.Wai.Handler.Warp.ResponseHeader
43import Network.Wai.Handler.Warp.ResponseHeader
@@ -237,7 +237,7 @@ sendRsp conn ver s hs restore (RspBuilder body needsChunked) = restore $ do
237 | needsChunked = header <> chunkedTransferEncoding body
237 | needsChunked = header <> chunkedTransferEncoding body
238 <> chunkedTransferTerminator
238 <> chunkedTransferTerminator
239 | otherwise = header <> body
239 | otherwise = header <> body
240− buffer = connBuffer conn
240+ buffer = connWriteBuffer conn
241 size = connBufferSize conn
241 size = connBufferSize conn
242 toBufIOWith buffer size (connSendAll conn) hdrBdy
242 toBufIOWith buffer size (connSendAll conn) hdrBdy
243
243
@@ -246,9 +246,9 @@ sendRsp conn ver s hs restore (RspBuilder body needsChunked) = restore $ do
246sendRsp conn ver s hs restore (RspSource withBodyFlush needsChunked th) =
246sendRsp conn ver s hs restore (RspSource withBodyFlush needsChunked th) =
247 withBodyFlush $ \bodyFlush -> restore $ do
247 withBodyFlush $ \bodyFlush -> restore $ do
248 header <- composeHeaderBuilder ver s hs needsChunked
248 header <- composeHeaderBuilder ver s hs needsChunked
249+ buffer <- toBlazeBuffer (connWriteBuffer conn) (connBufferSize conn)
249 let src = yield header >> cbody bodyFlush
250 let src = yield header >> cbody bodyFlush
250− strategy = reuseBufferStrategy $ allocBuffer defaultBufferSize
251+ src $$ unsafeBuilderToByteString (return buffer) =$ connSink conn th
251− src $$ builderToByteStringWith strategy =$ connSink conn th
252 where
252 where
253 cbody bodyFlush = if needsChunked then body $= chunk else body
253 cbody bodyFlush = if needsChunked then body $= chunk else body
254 where
254 where
warp/Network/Wai/Handler/Warp/Run.hs+6−4
@@ -51,14 +51,16 @@ import Network.Socket (fdSocket)
51-- | Default action value for 'Connection'.
51-- | Default action value for 'Connection'.
52socketConnection :: Socket -> IO Connection
52socketConnection :: Socket -> IO Connection
53socketConnection s = do
53socketConnection s = do
54+ readBuf <- allocateBuffer bufferSize
54− buf <- allocateBuffer bufferSize
55+ writeBuf <- allocateBuffer bufferSize
55 return Connection {
56 return Connection {
56 connSendMany = Sock.sendMany s
57 connSendMany = Sock.sendMany s
57 , connSendAll = Sock.sendAll s
58 , connSendAll = Sock.sendAll s
58 , connSendFile = defaultSendFile s
59 , connSendFile = defaultSendFile s
59− , connClose = sClose s >> freeBuffer buf
60+ , connClose = sClose s >> freeBuffer readBuf >> freeBuffer writeBuf
60− , connRecv = receive s buf bufferSize
61+ , connRecv = receive s readBuf bufferSize
61− , connBuffer = buf
62+ , connReadBuffer = readBuf
63+ , connWriteBuffer = writeBuf
62 , connBufferSize = bufferSize
64 , connBufferSize = bufferSize
63 , connSendFileOverride = Override s
65 , connSendFileOverride = Override s
64 }
66 }
warp/Network/Wai/Handler/Warp/Types.hs+2−1
@@ -74,7 +74,8 @@ data Connection = Connection
74 , connSendFile :: FilePath -> Integer -> Integer -> IO () -> [ByteString] -> IO () -- ^ filepath, offset, length, hook action, HTTP headers
74 , connSendFile :: FilePath -> Integer -> Integer -> IO () -> [ByteString] -> IO () -- ^ filepath, offset, length, hook action, HTTP headers
75 , connClose :: IO ()
75 , connClose :: IO ()
76 , connRecv :: IO ByteString
76 , connRecv :: IO ByteString
77− , connBuffer :: Buffer
77+ , connReadBuffer :: Buffer
78+ , connWriteBuffer :: Buffer
78 , connBufferSize :: BufSize
79 , connBufferSize :: BufSize
79 , connSendFileOverride :: ConnSendFileOverride
80 , connSendFileOverride :: ConnSendFileOverride
80 }
81 }