refactor PeerID and associated functions.
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sat, 21 Feb 2015 02:41:42 +0000 (08:11 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sat, 21 Feb 2015 02:41:42 +0000 (08:11 +0530)
Until now we were hashing peer id string to get a 20-byte hash. But
that's not needed. Peer ID is just a 20-byte string that needs to be
unique per client and sent to the tracker (and peers).

functorrent.cabal
src/Main.hs
src/Peer.hs
src/Tracker.hs

index 77df828a6c52c23387785ed1006a6673f114ccb5..b55644c3b4102eee928f449c846314e23e5e4936 100644 (file)
@@ -27,7 +27,8 @@ executable functorrent
                        base16-bytestring,
                        doctest,
                        HTTP,
-                       cryptohash
+                       cryptohash,
+                       binary
   hs-source-dirs:      src
   ghc-options:         -Wall -fwarn-incomplete-patterns
   default-language:    Haskell2010
\ No newline at end of file
index 015c3238734282dd785b0201d2f634b1e6e2fb09..bb50a8be38f4116ea46d67c976c6711dca086e6f 100644 (file)
@@ -13,8 +13,8 @@ import Data.Functor
 printError :: Parsec.ParseError -> IO ()
 printError e = putStrLn $ "parse error: " ++ show e
 
-genPeerId :: String
-genPeerId = "-HS0001-20150215"
+peerId :: String
+peerId = "-HS0001-*-*-20150215"
 
 exit :: IO BC.ByteString
 exit = exitSuccess
@@ -37,7 +37,7 @@ main = do
             Nothing -> putStrLn "parse error"
             Just m -> do
               let len = MInfo.lengthInBytes (MInfo.info m)
-              body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d genPeerId len)
+              body <- BC.pack <$> T.connect (MInfo.announce m) (T.prepareRequest d peerId len)
               print (P.getPeers (P.getPeerResponse body))
       Left e -> printError e
     putStrLn "done"
index 16609999b0e904a29941099a3da60b86302a976b..52cc03f25829dbf27d9fc5a21237ae9c87e4a1fe 100644 (file)
@@ -58,6 +58,6 @@ handShakeMsg m peer_id = let pstrlen = BC.concat $ BL.toChunks $ Bin.encode (19
                              pstr = BC.pack "BitTorrent protocol"
                              reserved = BC.replicate 8 '\0'
                              infoH = T.infoHash m
-                             peerH = T.peerHash peer_id
+                             peerID = BC.pack peer_id
                          in
-                          BC.concat [pstrlen, pstr, reserved, infoH, peerH]
+                          BC.concat [pstrlen, pstr, reserved, infoH, peerID]
index c52368309512ed82285bdbbb798605c33a65420d..599c2938d8c0e8d8046768c2adcdb6d30b9b3275 100644 (file)
@@ -4,22 +4,23 @@ import qualified Data.ByteString.Char8 as BC
 import qualified Data.Map as M
 import qualified Data.List as List
 import qualified Network.HTTP as HTTP
+import qualified Network.HTTP.Base as HB
 import qualified Bencode as Benc
 import qualified Crypto.Hash.SHA1 as SHA1
 import qualified Data.ByteString.Base16 as B16
 import qualified Utils as U
 import Data.Char
--- import Network.HTTP
+
 
 type Url = String
 
 
--- | urlEncode
+-- | urlEncodeHash
 --
--- >>> urlEncode $ BC.pack "123456789abcdef123456789abcdef123456789a"
+-- >>> urlEncodeHash $ BC.pack "123456789abcdef123456789abcdef123456789a"
 -- "%124Vx%9a%bc%de%f1%23Eg%89%ab%cd%ef%124Vx%9a"
-urlEncode :: BC.ByteString -> String
-urlEncode bs = concatMap (encode . BC.unpack) (U.splitN 2 bs)
+urlEncodeHash :: BC.ByteString -> String
+urlEncodeHash bs = concatMap (encode . BC.unpack) (U.splitN 2 bs)
   where encode b@[c1, c2] = let c =  chr (read ("0x" ++ b))
                                   in
                                    escape c c1 c2
@@ -35,13 +36,10 @@ infoHash :: M.Map Benc.BVal Benc.BVal -> BC.ByteString
 infoHash m = let info = m M.! Benc.Bstr (BC.pack "info")
              in (B16.encode . SHA1.hash . BC.pack . Benc.encode) info
 
-peerHash :: String -> BC.ByteString
-peerHash = B16.encode . SHA1.hash . BC.pack
-
 prepareRequest :: Benc.BVal -> String -> Integer -> String
 prepareRequest (Benc.Bdict d) peer_id len =
-  let p = [("info_hash", urlEncode (infoHash d)),
-           ("peer_id", urlEncode (peerHash peer_id)),
+  let p = [("info_hash", urlEncodeHash (infoHash d)),
+           ("peer_id", HB.urlEncode peer_id),
            ("port", "6881"),
            ("uploaded", "0"),
            ("downloaded", "0"),