@@ -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'