WIP: tracker protocol
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 15 Feb 2015 16:19:18 +0000 (21:49 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 15 Feb 2015 16:19:18 +0000 (21:49 +0530)
src/Main.hs
src/Metainfo.hs
src/Tracker.hs

index 12d35151f68dcb39c435cc6425b74fdd4560accb..a8a8d1f2b8fe67ddb47407bf9f36bc2231da26b6 100644 (file)
@@ -4,11 +4,16 @@ import System.Environment (getArgs)
 import qualified Data.ByteString.Char8 as BC
 import qualified Bencode as Benc
 import qualified Metainfo as MInfo
+import qualified Tracker as T
+
 import Text.ParserCombinators.Parsec
 
 printError :: ParseError -> IO ()
 printError e = putStrLn "parse error"
 
+genPeerId :: String
+genPeerId = "-HS0001-20150215"
+
 main :: IO ()
 main = do
   args <- getArgs
@@ -19,6 +24,7 @@ main = do
                Just m -> do
                  let (Benc.Bdict d') = d
                  putStrLn (show m)
-                 putStrLn (MInfo.infoHash d')
+--                 putStrLn (T.infoHash d')
+                 putStrLn (T.prepareRequest d genPeerId)
    Left e -> printError e
   putStrLn "done"
index a153384529e1c65108133e533a2265c94ed32d1c..47a134cd811d16064ebd713897bcafbb1ea2000f 100644 (file)
@@ -65,7 +65,3 @@ mkMetaInfo (Benc.Bdict m) = let (Just info') = mkInfo (m M.! (Benc.Bstr (BC.pack
                                              , encoding = maybeBstrToString encoding'
                                              }
 mkMetaInfo _ = Nothing
-
-infoHash :: (M.Map Benc.BVal Benc.BVal) -> String
-infoHash m = let info = m M.! (Benc.Bstr (BC.pack "info"))
-             in show $ SHA1.hash $ BC.pack $ Benc.encode info
index 51877d72963352a19e704c33e2b4a7dd662cacda..d388039f1222e55c7fb0bdfa5db716d74a287210 100644 (file)
@@ -1,8 +1,12 @@
 module Tracker where
 
--- import qualified Bencode as Benc
 import qualified Data.ByteString.Char8 as BC
+import qualified Data.Map as M
+import qualified Data.List as List
 import qualified Network.HTTP.Base as HB
+import qualified Bencode as Benc
+import qualified Crypto.Hash as H
+import qualified Crypto.Hash.SHA1 as SHA1
 import Data.Char
 -- import Network.HTTP
 
@@ -29,6 +33,25 @@ urlEncode bs = concatMap (encode . BC.unpack) (splitN 2 bs)
                                   ['0'..'9'] ++
                                   ['-', '_', '.', '~']
 
+infoHash :: (M.Map Benc.BVal Benc.BVal) -> BC.ByteString
+infoHash m = let info = m M.! (Benc.Bstr (BC.pack "info"))
+             in SHA1.hash $ BC.pack $ Benc.encode info
+
+peerHash :: String -> BC.ByteString
+peerHash peer_id = SHA1.hash (BC.pack peer_id)
+
+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]
+
 -- (chr . read . ("0x" ++) . BC.unpack)
 -- connect :: Url -> String -> IO (Benc.BVal)
 -- connect url infoHash = case (parseUrl url) of