@@ -9,15 +9,16 @@ module Network.Wai.Handler.Warp.SendFile (
99import Control.Monad (void)
1010import Data.ByteString (ByteString)
1111import qualified Data.ByteString as BS
12−import Network.Sendfile
1312import Network.Socket (Socket)
1413import Network.Wai.Handler.Warp.Buffer
1514import Network.Wai.Handler.Warp.Types
1615
1716#ifdef WINDOWS
1817import Control.Monad (when)
19−import qualified System.IO as IO
18+import Data.ByteString.Internal (ByteString(..))
19+import Foreign.ForeignPtr (newForeignPtr_)
2020import Foreign.Ptr (plusPtr)
21+import qualified System.IO as IO
2122#else
2223# if __GLASGOW_HASKELL__ < 709
2324import Control.Applicative ((<$>))
@@ -26,6 +27,7 @@ import Data.Word (Word8)
2627import Control.Exception
2728import Foreign.C.Types
2829import Foreign.Ptr (Ptr, castPtr, plusPtr)
30+import Network.Sendfile
2931import System.Posix.IO (openFd, OpenFileFlags(..), defaultFileFlags, OpenMode(ReadOnly), closeFd)
3032import System.Posix.Types
3133#endif
@@ -93,10 +95,11 @@ readSendFile buf siz send fid off0 len0 hook headers = do
9395 IO.withBinaryFile path IO.ReadMode $ \h -> do
9496 IO.hSeek h IO.AbsoluteSeek off0
9597 n <- IO.hGetBufSome h buf' (mini room len0)
96− bs <- toBSD buf (hn + n)
98+ bs <- toBS buf (hn + n)
9799 let n' = fromIntegral n
98100 send bs
99101 hook
102+ fptr <- newForeignPtr_ buf
100103 loop h fptr (len0 - n')
101104 where
102105 path = fileIdPath fid