, downloaded = down
, left = sz }
--- | Deserialize tracker response
-mkTrackerResponse :: BVal -> Either ByteString TrackerResponse
-mkTrackerResponse resp =
+-- | Deserialize HTTP tracker response
+parseTrackerResponse :: BVal -> Either ByteString TrackerResponse
+parseTrackerResponse resp =
case lookup "failure reason" body of
Just (Bstr err) -> Left err
Just _ -> Left "Unknown failure"
case Benc.decode resp of
Left e -> return $ pack (show e)
Right trackerInfo ->
- case mkTrackerResponse trackerInfo of
+ case parseTrackerResponse trackerInfo of
Left e -> return e
Right tresp -> do
_ <- threadDelay $ fromIntegral (interval tresp)
import Prelude hiding (writeFile, take)
import qualified Crypto.Hash.SHA1 as SHA1 (hash)
-import Control.Monad (unless)
+import Control.Exception.Base (IOException, try)
import Data.ByteString (ByteString, writeFile, hPut, hGet, take)
import qualified Data.ByteString.Char8 as BC
import System.IO (withFile, hSeek, IOMode(..), SeekMode(..))
| n < d = [n]
| otherwise = d : splitNum (n - d) d
-createDummyFile :: FilePath -> Int -> IO ()
+createDummyFile :: FilePath -> Int -> IO (Either IOException ())
createDummyFile path size = do
dfe <- doesFileExist path
- unless dfe $
- writeFile path (BC.replicate size '\0')
+ if not dfe
+ then do
+ try $ writeFile path (BC.replicate size '\0')
+ else
+ return $ Right ()
-- write into a file at a specific offet
writeFileAtOffset :: FilePath -> Integer -> ByteString -> IO ()