on master help sign in
unifying readSendFile and preadSendFile.
72032ecKazu Yamamoto
warp/Network/Wai/Handler/Warp/SendFile.hs+12−7
@@ -2,7 +2,6 @@
2
2
3module Network.Wai.Handler.Warp.SendFile where
3module Network.Wai.Handler.Warp.SendFile where
4
4
5−import Control.Monad (when, void)
6import Data.ByteString.Internal
5import Data.ByteString.Internal
7import Data.Word (Word8)
6import Data.Word (Word8)
8import Foreign.ForeignPtr (newForeignPtr_, withForeignPtr)
7import Foreign.ForeignPtr (newForeignPtr_, withForeignPtr)
@@ -10,14 +9,18 @@ import Network.Sendfile
10import Network.Socket (Socket)
9import Network.Socket (Socket)
11import Network.Wai.Handler.Warp.Buffer
10import Network.Wai.Handler.Warp.Buffer
12import Network.Wai.Handler.Warp.Types
11import Network.Wai.Handler.Warp.Types
13−import qualified System.IO as IO
14
12
15−#ifndef WINDOWS
13+#ifdef WINDOWS
14+import Control.Monad (when, void)
15+import qualified System.IO as IO
16+#else
16import Foreign.C.Types
17import Foreign.C.Types
17import Foreign.Ptr (Ptr, castPtr, plusPtr)
18import Foreign.Ptr (Ptr, castPtr, plusPtr)
18import System.Posix.Types
19import System.Posix.Types
19#endif
20#endif
20
21
22+----------------------------------------------------------------
23+
21defaultSendFile :: Socket -> SendFile
24defaultSendFile :: Socket -> SendFile
22#ifdef SENDFILEFD
25#ifdef SENDFILEFD
23defaultSendFile s fid off len act hdr = case mfid of
26defaultSendFile s fid off len act hdr = case mfid of
@@ -33,6 +36,8 @@ defaultSendFile s fid off len act hdr =
33 path = fileIdPath fid
36 path = fileIdPath fid
34#endif
37#endif
35
38
39+----------------------------------------------------------------
40+
36packHeader :: Buffer -> BufSize -> (ByteString -> IO ())
41packHeader :: Buffer -> BufSize -> (ByteString -> IO ())
37 -> IO () -> [ByteString]
42 -> IO () -> [ByteString]
38 -> Int
43 -> Int
@@ -57,6 +62,7 @@ packHeader buf siz send hook (PS bsfp off len : bss) n
57 where
62 where
58 room = siz - n
63 room = siz - n
59
64
65+#ifdef WINDOWS
60readSendFile :: Buffer -> BufSize -> (ByteString -> IO ()) -> SendFile
66readSendFile :: Buffer -> BufSize -> (ByteString -> IO ()) -> SendFile
61readSendFile buf siz send fid off0 len0 hook headers = do
67readSendFile buf siz send fid off0 len0 hook headers = do
62 fptr <- newForeignPtr_ buf
68 fptr <- newForeignPtr_ buf
@@ -82,10 +88,9 @@ readSendFile buf siz send fid off0 len0 hook headers = do
82 send bs
88 send bs
83 void $ hook
89 void $ hook
84 loop fptr h $ len - fromIntegral n
90 loop fptr h $ len - fromIntegral n
85−
91+#else
86−#ifndef WINDOWS
87−preadSendFile :: Buffer -> BufSize -> (ByteString -> IO ()) -> SendFile
92+readSendFile :: Buffer -> BufSize -> (ByteString -> IO ()) -> SendFile
88−preadSendFile buf siz send fid off0 len0 hook headers = do
93+readSendFile buf siz send fid off0 len0 hook headers = do
89 fptr <- newForeignPtr_ buf
94 fptr <- newForeignPtr_ buf
90 hn <- packHeader buf siz send hook headers 0
95 hn <- packHeader buf siz send hook headers 0
91 let room = siz - hn
96 let room = siz - hn