]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Tracker.hs
fix hlint suggestions
[functorrent.git] / src / FuncTorrent / Tracker.hs
index b8166508d20980df85480c8047478388fa265b99..ab14b09e31920bb4da579e2a2c1a43d1693b80e9 100644 (file)
@@ -1,10 +1,7 @@
 {-# LANGUAGE OverloadedStrings #-}
 module FuncTorrent.Tracker
     (TrackerResponse(..),
-     tracker,
-     mkArgs,
-     mkTrackerResponse,
-     urlEncodeHash
+     getTrackerResponse
     ) where
 
 import Prelude hiding (lookup, splitAt)
@@ -14,10 +11,11 @@ import Data.ByteString.Char8 as BC (pack, unpack, splitAt)
 import Data.Char (chr)
 import Data.List (intercalate)
 import Data.Map as M (lookup)
+import Network (PortNumber)
 import Network.HTTP.Base (urlEncode)
 import qualified Data.ByteString.Base16 as B16 (encode)
 
-import FuncTorrent.Bencode (BVal(..))
+import FuncTorrent.Bencode (BVal(..), decode)
 import FuncTorrent.Metainfo (Info(..), Metainfo(..))
 import FuncTorrent.Network (get)
 import FuncTorrent.Peer (Peer(..))
@@ -66,8 +64,16 @@ mkTrackerResponse resp =
           where (ip', port') = splitAt 4 peer
 
 -- | Connect to a tracker and get peer info
-tracker :: Metainfo -> String -> IO ByteString
-tracker m peer_id = get (head . announceList $ m) $ mkArgs m peer_id
+tracker :: PortNumber -> String -> Metainfo -> IO ByteString
+tracker port peer_id m =
+  get (head . announceList $ m) $ mkArgs port peer_id m
+
+getTrackerResponse :: PortNumber -> String -> Metainfo -> IO (Either ByteString TrackerResponse)
+getTrackerResponse port peerId m = do
+  resp <- tracker port peerId m
+  case decode resp of
+   Right trackerInfo -> return $ mkTrackerResponse trackerInfo
+   Left e -> return $ Left (pack (show e))
 
 --- | URL encode hash as per RFC1738
 --- TODO: Add tests
@@ -85,12 +91,14 @@ urlEncodeHash bs = concatMap (encode' . unpack) (splitN 2 bs)
 
 -- | Make arguments that should be posted to tracker.
 -- This is a separate pure function for testability.
-mkArgs :: Metainfo -> String -> [(String, ByteString)]
-mkArgs m peer_id = [("info_hash", pack . urlEncodeHash . B16.encode . infoHash $ m),
-                    ("peer_id", pack . urlEncode $ peer_id),
-                    ("port", "6881"),
-                    ("uploaded", "0"),
-                    ("downloaded", "0"),
-                    ("left", pack . show . lengthInBytes $ info m),
-                    ("compact", "1"),
-                    ("event", "started")]
+mkArgs :: PortNumber -> String -> Metainfo -> [(String, ByteString)]
+mkArgs port peer_id m = [("info_hash", pack . urlEncodeHash . B16.encode . infoHash $ m),
+                         ("peer_id", pack . urlEncode $ peer_id),
+                         ("port", pack $ show port),
+                         ("uploaded", "0"),
+                         ("downloaded", "0"),
+                         ("left", pack . show . lengthInBytes $ info m),
+                         ("compact", "1"),
+                         ("event", "started")]
+
+