@@ -9,15 +9,16 @@ module Network.Wai.Handler.Warp.SendFile (
9import Control.Monad (void)
9import Control.Monad (void)
10import Data.ByteString (ByteString)
10import Data.ByteString (ByteString)
11import qualified Data.ByteString as BS
11import qualified Data.ByteString as BS
12−import Network.Sendfile
13import Network.Socket (Socket)
12import Network.Socket (Socket)
14import Network.Wai.Handler.Warp.Buffer
13import Network.Wai.Handler.Warp.Buffer
15import Network.Wai.Handler.Warp.Types
14import Network.Wai.Handler.Warp.Types
17#ifdef WINDOWS
16#ifdef WINDOWS
18import Control.Monad (when)
17import Control.Monad (when)
19−import qualified System.IO as IO
18+import Data.ByteString.Internal (ByteString(..))
19+import Foreign.ForeignPtr (newForeignPtr_)
20import Foreign.Ptr (plusPtr)
20import Foreign.Ptr (plusPtr)
21+import qualified System.IO as IO
22# if __GLASGOW_HASKELL__ < 709
23# if __GLASGOW_HASKELL__ < 709
23import Control.Applicative ((<$>))
24import Control.Applicative ((<$>))
@@ -26,6 +27,7 @@ import Data.Word (Word8)
26import Control.Exception
27import Control.Exception
27import Foreign.C.Types
28import Foreign.C.Types
28import Foreign.Ptr (Ptr, castPtr, plusPtr)
29import Foreign.Ptr (Ptr, castPtr, plusPtr)
30+import Network.Sendfile
29import System.Posix.IO (openFd, OpenFileFlags(..), defaultFileFlags, OpenMode(ReadOnly), closeFd)
31import System.Posix.IO (openFd, OpenFileFlags(..), defaultFileFlags, OpenMode(ReadOnly), closeFd)
30import System.Posix.Types
32import System.Posix.Types
@@ -93,10 +95,11 @@ readSendFile buf siz send fid off0 len0 hook headers = do
93 IO.withBinaryFile path IO.ReadMode $ \h -> do
95 IO.withBinaryFile path IO.ReadMode $ \h -> do
94 IO.hSeek h IO.AbsoluteSeek off0
96 IO.hSeek h IO.AbsoluteSeek off0
95 n <- IO.hGetBufSome h buf' (mini room len0)
97 n <- IO.hGetBufSome h buf' (mini room len0)
96− bs <- toBSD buf (hn + n)
98+ bs <- toBS buf (hn + n)
97 let n' = fromIntegral n
99 let n' = fromIntegral n
102+ fptr <- newForeignPtr_ buf
100 loop h fptr (len0 - n')
103 loop h fptr (len0 - n')
102 path = fileIdPath fid
105 path = fileIdPath fid