on master help sign in
sendfile support
commit65d31360fdaa4d1234fd2d99f18d26b2a7ab2db4 authorMichael Snoyman <michael@snoyman.com> dateSun 26 Dec 2010, 20:05 (16 years ago) parentbabcbfe
2 files changed+13−3
Network/Wai/Handler/Warp.hs+12−3 warp.cabal+1
Network/Wai/Handler/Warp.hs+12−3
@@ -25,6 +25,8 @@ import qualified System.IO
2525
2626import Data.ByteString (ByteString)
2727import qualified Data.ByteString.Char8 as B
28+import qualified Data.ByteString as S
29+import qualified Data.ByteString.Lazy as L
2830import Network
2931 ( listenOn, accept, sClose, PortID(PortNumber), Socket
3032 , withSocketsDo)
@@ -45,9 +47,10 @@ import Data.Enumerator.IO (iterHandle)
4547import Blaze.ByteString.Builder.Enumerator (builderToByteString)
4648import Blaze.ByteString.Builder.HTTP
4749 (chunkedTransferEncoding, chunkedTransferTerminator)
48−import Blaze.ByteString.Builder (fromByteString, Builder)
50+import Blaze.ByteString.Builder (fromByteString, Builder, toLazyByteString)
4951import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
5052import Data.Monoid (mconcat)
53+import Network.Socket.SendFile (unsafeSendFile)
5154
5255import Control.Monad.IO.Class (liftIO)
5356import Data.ByteString.Lazy.Internal (defaultChunkSize)
@@ -195,8 +198,14 @@ isChunked :: HttpVersion -> Bool
195198isChunked = (==) http11
196199
197200sendResponse :: HttpVersion -> Handle -> Response -> IO Bool
198−sendResponse hv handle res =
199− responseEnumerator res go
201+sendResponse hv handle (ResponseFile s hs fp) = do
202+ mapM_ (S.hPut handle) $ L.toChunks $ toLazyByteString $ headers hv s hs False
203+ unsafeSendFile handle fp
204+ if lookup "content-length" hs == Nothing
205+ then return False
206+ else S.hPut handle "\r\n\r\n" >> return True
207+sendResponse hv handle (ResponseEnumerator res) =
208+ res go
200209 where
201210 go s hs =
202211 chunk'
warp.cabal+1
@@ -20,6 +20,7 @@ Library
2020 , transformers >= 0.2 && < 0.3
2121 , enumerator >= 0.4 && < 0.5
2222 , blaze-builder >= 0.2.1.3 && < 0.3
23+ , sendfile >= 0.7.2 && < 0.8
2324 Exposed-modules: Network.Wai.Handler.Warp
2425 ghc-options: -Wall
2526