@@ -35,12 +35,11 @@ module Network.Wai.Handler.WarpTLS (
35import Control.Applicative ((<$>))
35import Control.Applicative ((<$>))
37import Control.Exception (Exception, throwIO, bracket, finally, handle, fromException, try, IOException, onException)
37import Control.Exception (Exception, throwIO, bracket, finally, handle, fromException, try, IOException, onException)
38−import Control.Monad (unless, void)
38+import Control.Monad (void)
39import qualified Crypto.Random.AESCtr
39import qualified Crypto.Random.AESCtr
40import qualified Data.ByteString as B
40import qualified Data.ByteString as B
41import qualified Data.ByteString as S
41import qualified Data.ByteString as S
42import qualified Data.ByteString.Lazy as L
42import qualified Data.ByteString.Lazy as L
43−import Data.ByteString.Lazy.Internal (defaultChunkSize)
44import Data.Default.Class (def)
43import Data.Default.Class (def)
45import qualified Data.IORef as I
44import qualified Data.IORef as I
46import Data.Streaming.Network (bindPortTCP, safeRecv)
45import Data.Streaming.Network (bindPortTCP, safeRecv)
@@ -52,7 +51,6 @@ import qualified Network.TLS.Extra as TLSExtra
52import Network.Wai (Application)
51import Network.Wai (Application)
53import Network.Wai.Handler.Warp
52import Network.Wai.Handler.Warp
54import Network.Wai.Handler.Warp.Buffer (allocateBuffer, bufferSize, freeBuffer)
53import Network.Wai.Handler.Warp.Buffer (allocateBuffer, bufferSize, freeBuffer)
55−import qualified System.IO as IO
56import System.IO.Error (isEOFError)
54import System.IO.Error (isEOFError)
58----------------------------------------------------------------
56----------------------------------------------------------------
@@ -285,7 +283,7 @@ httpOverTls TLSSettings{..} s cachedRef params = do
286 conn ctx pool writeBuf = Connection {
284 conn ctx pool writeBuf = Connection {
287 connSendMany = TLS.sendData ctx . L.fromChunks
285 connSendMany = TLS.sendData ctx . L.fromChunks
288− , connSendAll = TLS.sendData ctx . L.fromChunks . return
286+ , connSendAll = sendall
289 , connSendFile = sendfile
287 , connSendFile = sendfile
290 , connClose = close
288 , connClose = close
291 , connRecv = recv
289 , connRecv = recv
@@ -294,21 +292,9 @@ httpOverTls TLSSettings{..} s cachedRef params = do
294 , connBufferSize = bufferSize
292 , connBufferSize = bufferSize
297− sendfile fid offset len tickle' headers = do
298− let fp = fileIdPath fid
299− TLS.sendData ctx $ L.fromChunks headers
295+ sendall = TLS.sendData ctx . L.fromChunks . return
300− IO.withBinaryFile fp IO.ReadMode $ \h -> do
296+ sendfile fid offset len hook headers =
301− IO.hSeek h IO.AbsoluteSeek offset
297+ readSendFile writeBuf bufferSize sendall fid offset len hook headers
302− loop h $ fromIntegral len
304− loop _ remaining | remaining <= 0 = return ()
305− loop h remaining = do
306− bs <- B.hGetSome h defaultChunkSize
307− unless (B.null bs) $ do
308− let x = B.take remaining bs
309− TLS.sendData ctx $ L.fromChunks [x]
310− void $ tickle' -- This tickles the Timer. It MUST be called per chunk.
311− loop h $ remaining - B.length x
313 close = freeBuffer writeBuf `finally`
299 close = freeBuffer writeBuf `finally`
314 void (tryIO $ TLS.bye ctx) `finally`
300 void (tryIO $ TLS.bye ctx) `finally`