diff options
author | Joey Hess <joey@kitenet.net> | 2014-11-03 19:50:33 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2014-11-03 19:50:33 -0400 |
commit | d16382e99f2c8651c1e850279b8a7b2cfa2ea7ba (patch) | |
tree | 1bea3922b0d57e83651adf57f534fb06b7cdee3a /Remote/Helper/Http.hs | |
parent | 5360417436a13e0671d2165159b48253fb072521 (diff) |
WIP 2
Diffstat (limited to 'Remote/Helper/Http.hs')
-rw-r--r-- | Remote/Helper/Http.hs | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/Remote/Helper/Http.hs b/Remote/Helper/Http.hs index 4088854ff3..cb3af335ab 100644 --- a/Remote/Helper/Http.hs +++ b/Remote/Helper/Http.hs @@ -11,7 +11,7 @@ import Common.Annex import Types.StoreRetrieve import Utility.Metered import Remote.Helper.Special -import Network.HTTP.Client (RequestBody(..), Response, responseStatus, responseBody, BodyReader) +import Network.HTTP.Client (RequestBody(..), Response, responseStatus, responseBody, BodyReader, NeedsPopper) import Network.HTTP.Types import qualified Data.ByteString.Lazy as L @@ -31,11 +31,14 @@ httpStorer a = fileStorer $ \k f m -> a k =<< liftIO (httpBodyStorer f m) httpBodyStorer :: FilePath -> MeterUpdate -> IO RequestBody httpBodyStorer src m = do size <- fromIntegral . fileSize <$> getFileStatus src :: IO Integer - let streamer sink = withMeteredFile src m $ \b -> do - mvar <- newMVar $ L.toChunks b - let getnextchunk = modifyMVar mvar $ pure . pop - sink getnextchunk + let streamer sink = withMeteredFile src m $ \b -> mkPopper b sink return $ RequestBodyStream (fromInteger size) streamer + +mkPopper :: L.ByteString -> NeedsPopper () -> IO () +mkPopper b sink = do + mvar <- newMVar $ L.toChunks b + let getnextchunk = modifyMVar mvar $ pure . pop + sink getnextchunk where pop [] = ([], S.empty) pop (c:cs) = (cs, c) |