@@ -25,6 +25,8 @@ import qualified System.IO
26import Data.ByteString (ByteString)
26import Data.ByteString (ByteString)
27import qualified Data.ByteString.Char8 as B
27import qualified Data.ByteString.Char8 as B
28+import qualified Data.ByteString as S
29+import qualified Data.ByteString.Lazy as L
28import Network
30import Network
29 ( listenOn, accept, sClose, PortID(PortNumber), Socket
31 ( listenOn, accept, sClose, PortID(PortNumber), Socket
30 , withSocketsDo)
32 , withSocketsDo)
@@ -45,9 +47,10 @@ import Data.Enumerator.IO (iterHandle)
45import Blaze.ByteString.Builder.Enumerator (builderToByteString)
47import Blaze.ByteString.Builder.Enumerator (builderToByteString)
46import Blaze.ByteString.Builder.HTTP
48import Blaze.ByteString.Builder.HTTP
47 (chunkedTransferEncoding, chunkedTransferTerminator)
49 (chunkedTransferEncoding, chunkedTransferTerminator)
48−import Blaze.ByteString.Builder (fromByteString, Builder)
50+import Blaze.ByteString.Builder (fromByteString, Builder, toLazyByteString)
49import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
51import Blaze.ByteString.Builder.Char8 (fromChar, fromString)
50import Data.Monoid (mconcat)
52import Data.Monoid (mconcat)
53+import Network.Socket.SendFile (unsafeSendFile)
52import Control.Monad.IO.Class (liftIO)
55import Control.Monad.IO.Class (liftIO)
53import Data.ByteString.Lazy.Internal (defaultChunkSize)
56import Data.ByteString.Lazy.Internal (defaultChunkSize)
@@ -195,8 +198,14 @@ isChunked :: HttpVersion -> Bool
195isChunked = (==) http11
198isChunked = (==) http11
197sendResponse :: HttpVersion -> Handle -> Response -> IO Bool
200sendResponse :: HttpVersion -> Handle -> Response -> IO Bool
198−sendResponse hv handle res =
201+sendResponse hv handle (ResponseFile s hs fp) = do
199− responseEnumerator res go
202+ mapM_ (S.hPut handle) $ L.toChunks $ toLazyByteString $ headers hv s hs False
203+ unsafeSendFile handle fp
204+ if lookup "content-length" hs == Nothing
206+ else S.hPut handle "\r\n\r\n" >> return True
207+sendResponse hv handle (ResponseEnumerator res) =
201 go s hs =
210 go s hs =