refactoring: return type of tracker
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 19 Jun 2016 15:20:27 +0000 (20:50 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 19 Jun 2016 15:20:48 +0000 (20:50 +0530)
Needs DuplicateRecordFields from GHC 8.0.x to compile

src/FuncTorrent/Tracker/Http.hs
src/FuncTorrent/Tracker/Types.hs
src/FuncTorrent/Tracker/Udp.hs
stack.yaml

index 9edf3fca6691149ed218f012df2a5784b826ef02..13395cc72dfc789940646eb3fb5c8f2aae3e6c7f 100644 (file)
@@ -42,7 +42,7 @@ import qualified FuncTorrent.FileSystem as FS (MsgChannel, Stats(..), getStats)
 import FuncTorrent.Network (sendGetRequest)
 import FuncTorrent.PeerMsgs (makePeer)
 import FuncTorrent.Utils (splitN, IP, Port)
-import FuncTorrent.Tracker.Types(TState(..), TrackerResponse(..))
+import FuncTorrent.Tracker.Types(TState(..), HttpTrackerResponse(..))
 
 
 --- | URL encode hash as per RFC1738
@@ -93,7 +93,7 @@ trackerLoop url sport peerId infohash fschan tstate = forever $ do
             void $ swapMVar (connectedPeers tstate) (peers tresp)
           threadDelay $ fromIntegral (interval tresp)
 
-parseTrackerResponse :: BVal -> Either ByteString TrackerResponse
+parseTrackerResponse :: BVal -> Either ByteString HttpTrackerResponse
 parseTrackerResponse resp =
     case lookup "failure reason" body of
       Just (Bstr err) -> Left err
@@ -102,7 +102,7 @@ parseTrackerResponse resp =
           let (Just (Bint i)) = lookup "interval" body
               (Just (Bstr peersBS)) = lookup "peers" body
               pl = map makePeer (splitN 6 peersBS)
-          in Right TrackerResponse {
+          in Right HttpTrackerResponse {
                    interval = i
                  , peers = pl
                  , complete = Nothing
index 3adcacc8bc6ac35c24b017dc83675f37635a11a6..1c47d3191f593471457972497d490555caf549e9 100644 (file)
  -}
 
 {-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DuplicateRecordFields #-}
 module FuncTorrent.Tracker.Types
        ( TrackerProtocol(..)
-       , TrackerResponse(..)
+       , HttpTrackerResponse(..)
+       , UdpTrackerResponse(..)
        , TrackerEventState(..)
        , TState(..)
        , TrackerMsg(..)
        ) where
 
 import Data.ByteString (ByteString)
+import Data.Word (Word32)
 import Control.Concurrent.MVar (MVar)
 
 import FuncTorrent.PeerMsgs (Peer)
@@ -51,9 +54,16 @@ data TState = TState { left :: Integer
                      }
 
 -- | Tracker response
-data TrackerResponse = TrackerResponse {
+data HttpTrackerResponse = HttpTrackerResponse {
   interval :: Integer
   , peers :: [Peer]
   , complete :: Maybe Integer
   , incomplete :: Maybe Integer
   } deriving (Show, Eq)
+
+data UdpTrackerResponse = UdpTrackerResponse {
+  leechers :: Word32
+  , seeders :: Word32
+  , interval :: Word32
+  , peers :: [Peer]
+  } deriving (Show)
index 5e98879f976a082d4611def19bef7224e20077a2..aaa99472b44c3a9d72f955afd0f35a5e8c05d534 100644 (file)
@@ -40,7 +40,7 @@ import System.Random (randomIO)
 import System.Timeout (timeout)
 
 import FuncTorrent.PeerMsgs (Peer(..))
-import FuncTorrent.Tracker.Types (TrackerEventState(..), TState(..))
+import FuncTorrent.Tracker.Types (TrackerEventState(..), TState(..), UdpTrackerResponse(..))
 import FuncTorrent.Utils (IP, Port, toIP, toPort, getHostname, getPort)
 import qualified FuncTorrent.FileSystem as FS (MsgChannel, Stats(..), getStats)
 
@@ -171,13 +171,7 @@ announceRequest cid infohash peerId up down left port = do
   liftIO $ sendRequest h (toStrict pkt)
   return tidi
 
-data PeerStats = PeerStats { leechers :: Word32
-                           , seeders :: Word32
-                           , interval :: Word32
-                           , peers :: [Peer]
-                           } deriving (Show)
-
-announceResponse :: Word32 -> ReaderT UDPTrackerHandle IO PeerStats
+announceResponse :: Word32 -> ReaderT UDPTrackerHandle IO UdpTrackerResponse
 announceResponse tid = do
   h <- ask
   resp <- liftIO $ recvResponse h
@@ -186,10 +180,10 @@ announceResponse tid = do
       if tidr == tid
       then do
         liftIO $ putStrLn "announce succeeded"
-        return $ PeerStats ls ss interval xs
+        return $ UdpTrackerResponse ls ss interval xs
       else
-        return $ PeerStats 0 0 0 []
-    _ -> return $ PeerStats 0 0 0 []
+        return $ UdpTrackerResponse 0 0 0 []
+    _ -> return $ UdpTrackerResponse 0 0 0 []
 
 getIPPortPairs :: Get [Peer]
 getIPPortPairs = do
index d652a8c5a8cd9c778b15cef57fff55f17d3485ac..5b69a9a0ef7257ef2f92a9a0c2e24e8efcad72ef 100644 (file)
@@ -13,7 +13,7 @@ packages:
 extra-deps: []
 
 # Specifies the GHC version and set of packages available (e.g., lts-3.5, nightly-2015-09-21, ghc-7.10.2)
-resolver: lts-5.2
+resolver: nightly-2016-06-19
 
 rebuild-ghc-options: true
 ghc-options: