module Network.Wai.Handler.Helper ( requestBodyHandle , requestBodyFunc ) where import System.IO (Handle) import qualified Data.ByteString as B import Data.ByteString.Lazy.Internal (defaultChunkSize) import Network.Wai (Source (..)) requestBodyHandle :: Handle -> Int -> Source requestBodyHandle h = requestBodyFunc go where go i = Just `fmap` B.hGet h (min i defaultChunkSize) requestBodyFunc :: (Int -> IO (Maybe B.ByteString)) -> Int -> Source requestBodyFunc _ 0 = Source $ return Nothing requestBodyFunc h len = Source $ do mbs <- h len case mbs of Nothing -> return Nothing Just bs -> do let newLen = len - B.length bs return $ Just (bs, requestBodyFunc h $ max 0 newLen)