]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Tracker.hs
Tracker: refactor the tracker loop code
[functorrent.git] / src / FuncTorrent / Tracker.hs
index 5e059f75c0dda0fb4896ec3941a95869e3013d9f..ac99ce288d23b208319abf0972a8c78255b1c0f9 100644 (file)
@@ -36,61 +36,37 @@ import Network (PortNumber)
 import qualified FuncTorrent.Tracker.Http as HT (trackerLoop)
 import qualified FuncTorrent.Tracker.Udp as UT (trackerLoop)
 import FuncTorrent.Tracker.Types (TState(..), TrackerEventState(..), TrackerProtocol(..), TrackerMsg(..))
-import FuncTorrent.Utils (Port, toPort)
+import FuncTorrent.Utils (Port, toPort, getHostname)
 import qualified FuncTorrent.FileSystem as FS (MsgChannel)
-import FuncTorrent.Peer (Peer)
+import FuncTorrent.PeerMsgs (Peer)
 
 type MsgChannel = Chan TrackerMsg
 
-data TrackerUrl = TrackerUrl { protocol :: TrackerProtocol
-                             , host :: String
-                             , port :: Port
-                             , path :: String
-                             }
-
 newTracker :: IO MsgChannel
 newTracker = newChan
 
-parseUrl :: String -> TrackerUrl
-parseUrl url = TrackerUrl proto host port path
-  where proto = getTrackerType url
-        host = getHostname url
-        port = getPort url
-        path = getPath url
-
-getTrackerType :: String -> TrackerProtocol
-getTrackerType url | isPrefixOf "http://" url = Http
-                   | isPrefixOf "udp://" url  = Udp
-                   | otherwise                = UnknownProtocol
-
-getHostname :: String -> String
-getHostname url = takeWhile (/= ':') $ drop 2 $ dropWhile (/= '/') url
-
-getPort :: String -> Port
-getPort url = toPort . pack $ takeWhile (/= '/') $ drop 1 $ dropWhile (/= ':') $ drop 2 $ dropWhile (/= '/') url
-
-getPath :: String -> String
-getPath url = dropWhile (/= '/') $ dropWhile (/= ':') $ drop 1 $ dropWhile (/= ':') url
-
 runTracker :: MsgChannel -> FS.MsgChannel -> ByteString -> PortNumber
            -> String -> [String] -> Integer -> IO ()
 runTracker msgChannel fsChan infohash port peerId announceList sz = do
   ps <- newEmptyMVar
-  let initialTState = TState { currentState = None
-                             , connectedPeers = ps
-                             , left = sz }
-      turl = head announceList
-      host = getHostname turl
-  case getTrackerType turl of
-    Http -> do
-      _ <- forkIO $ HT.trackerLoop host port peerId infohash fsChan initialTState
-      runStateT (msgHandler msgChannel) initialTState
-      return ()
-    Udp -> do
-      _ <- forkIO $ UT.trackerLoop host (fromIntegral port) peerId infohash fsChan initialTState
-      return ()
-    _ ->
-      error "Tracker Protocol unimplemented"
+  forkIO $ (getTrackerLoopFn turl) turl port peerId infohash fsChan (initialTState ps)
+  runStateT (msgHandler msgChannel) (initialTState ps)
+  return ()
+    where getTrackerLoopFn turl =
+            case getTrackerType turl of
+              Http -> HT.trackerLoop
+              Udp -> UT.trackerLoop
+              _ -> error "Tracker Protocol unimplemented"
+          initialTState ps' = TState { currentState = None
+                                     , connectedPeers = ps'
+                                     , left = sz }
+          turl = head announceList
+
+getTrackerType :: String -> TrackerProtocol
+getTrackerType url | "http://" `isPrefixOf` url = Http
+                   | "udp://" `isPrefixOf` url  = Udp
+                   | otherwise                  = UnknownProtocol
+
 
 msgHandler :: MsgChannel -> StateT TState IO ()
 msgHandler c = forever $ do
@@ -102,14 +78,13 @@ msgHandler c = forever $ do
       recvMsg = readChan c
       sendResponse msg peers =
         case msg of
-          GetConnectedPeersMsg var -> do
+          GetConnectedPeersMsg var ->
             putMVar var peers
-          _ -> do
+          _ ->
             putStrLn "Unhandled Tracker Msg"
 
 getConnectedPeers :: MsgChannel -> IO [Peer]
 getConnectedPeers c = do
   v <- newEmptyMVar
   writeChan c (GetConnectedPeersMsg v)
-  ps <- readMVar v
-  return ps
+  readMVar v