Handle the `left' parameter for the tracker request.
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Tue, 17 Feb 2015 11:05:00 +0000 (16:35 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Tue, 17 Feb 2015 11:05:00 +0000 (16:35 +0530)
Tracker initial request includes a parameter called `left' to indicate
the size of the file left to be downloaded. When we contact the tracker
initially, we haven't downloaded anything yet. So, the left parameter
should be the length parameter. For now, we handle only single file
torrent files, so we just pick the length param from Metainfo and shove
it in into the tracker http request.

src/Main.hs
src/Tracker.hs

index b0f594a2f883b897027c9d63572b6233e60c9062..482b433cb12122ce99fcb2063599874c28a4b3ba 100644 (file)
@@ -8,6 +8,7 @@ import qualified Metainfo as MInfo
 import qualified Tracker as T
 import qualified Text.ParserCombinators.Parsec as Parsec
 import qualified Peer as P
+import qualified Data.Map as M
 import Data.Functor
 
 printError :: Parsec.ParseError -> IO ()
@@ -35,7 +36,8 @@ main = do
    Right d -> case MInfo.mkMetaInfo d of
                Nothing -> putStrLn "parse error"
                Just m -> do
-                 body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId)
+                 let length = MInfo.lengthInBytes (MInfo.info m)
+                 body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId length)
                  print (P.getPeers (P.getPeerResponse body))
    Left e -> printError e
   putStrLn "done"
index 52dccdd6d9bbcf9d31cd3dc64addbdee21db6db0..68cf28c731f2818c291fbc0482961fc3fccea183 100644 (file)
@@ -38,17 +38,18 @@ infoHash m = let info = m M.! Benc.Bstr (BC.pack "info")
 peerHash :: String -> BC.ByteString
 peerHash = B16.encode . SHA1.hash . BC.pack
 
-prepareRequest :: Benc.BVal -> String -> String
-prepareRequest (Benc.Bdict d) peer_id = let p = [("info_hash", urlEncode (infoHash d)),
-                                                 ("peer_id", urlEncode (peerHash peer_id)),
-                                                 ("port", "6881"),
-                                                 ("uploaded", "0"),
-                                                 ("downloaded", "0"),
-                                                 ("left", "0"),
-                                                 ("compact", "1"),
-                                                 ("event", "started")]
-                                        in
-                                         List.intercalate "&" [f ++ "=" ++ s | (f,s) <- p]
+prepareRequest :: Benc.BVal -> String -> Integer -> String
+prepareRequest (Benc.Bdict d) peer_id length =
+  let p = [("info_hash", urlEncode (infoHash d)),
+           ("peer_id", urlEncode (peerHash peer_id)),
+           ("port", "6881"),
+           ("uploaded", "0"),
+           ("downloaded", "0"),
+           ("left", show length),
+           ("compact", "1"),
+           ("event", "started")]
+  in
+   List.intercalate "&" [f ++ "=" ++ s | (f,s) <- p]
 
 connect :: Url -> String -> IO String
 connect baseurl qstr = let url = baseurl ++ "?" ++ qstr