1{-# LANGUAGE CPP #-}
2
3module Network.Wai.Handler.Warp.HTTP2.File where
4
5import Network.HTTP2.Server
6
7import Network.Wai.Handler.Warp.Types
8
9#ifdef WINDOWS
10pReadMaker :: InternalInfo -> PositionReadMaker
11pReadMaker _ = defaultPositionReadMaker
12#else
13import Network.Wai.Handler.Warp.FdCache
14import Network.Wai.Handler.Warp.SendFile (positionRead)
15
16pReadMaker :: InternalInfo -> PositionReadMaker
17pReadMaker ii path = do
18    (mfd, refresh) <- getFd ii path
19    case mfd of
20      Just fd -> return (pread fd, Refresher refresh)
21      Nothing -> do
22          fd <- openFile path
23          return (pread fd, Closer $ closeFile fd)
24  where
25    pread :: Fd -> PositionRead
26    pread fd off bytes buf = fromIntegral <$> positionRead fd buf bytes' off'
27      where
28        bytes' = fromIntegral bytes
29        off' = fromIntegral off
30#endif
31