]> git.rkrishnan.org Git - functorrent.git/commitdiff
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 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"
 
 import Text.ParserCombinators.Parsec
 
 printError :: ParseError -> IO ()
 printError e = putStrLn "parse error"
 
+genPeerId :: String
+genPeerId = "-HS0001-20150215"
+
 main :: IO ()
 main = do
   args <- getArgs
 main :: IO ()
 main = do
   args <- getArgs
@@ -19,6 +24,7 @@ main = do
                Just m -> do
                  let (Benc.Bdict d') = d
                  putStrLn (show m)
                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"
    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
                                              , 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
 
 module Tracker where
 
--- import qualified Bencode as Benc
 import qualified Data.ByteString.Char8 as BC
 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 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
 
 import Data.Char
 -- import Network.HTTP
 
@@ -29,6 +33,25 @@ urlEncode bs = concatMap (encode . BC.unpack) (splitN 2 bs)
                                   ['0'..'9'] ++
                                   ['-', '_', '.', '~']
 
                                   ['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
 -- (chr . read . ("0x" ++) . BC.unpack)
 -- connect :: Url -> String -> IO (Benc.BVal)
 -- connect url infoHash = case (parseUrl url) of