diff options
Diffstat (limited to 'src/Network')
-rw-r--r-- | src/Network/BitTorrent/Core/PeerAddr.hs | 6 | ||||
-rw-r--r-- | src/Network/BitTorrent/Tracker/Message.hs | 23 |
2 files changed, 14 insertions, 15 deletions
diff --git a/src/Network/BitTorrent/Core/PeerAddr.hs b/src/Network/BitTorrent/Core/PeerAddr.hs index c9ec6b96..6c6056c9 100644 --- a/src/Network/BitTorrent/Core/PeerAddr.hs +++ b/src/Network/BitTorrent/Core/PeerAddr.hs | |||
@@ -154,11 +154,11 @@ instance (Typeable a, BEncode a) => BEncode (PeerAddr a) where | |||
154 | .: endDict | 154 | .: endDict |
155 | 155 | ||
156 | fromBEncode = fromDict $ do | 156 | fromBEncode = fromDict $ do |
157 | peerAddr <$>? peer_id_key | 157 | peerAddr <$>! peer_ip_key |
158 | <*>! peer_ip_key | 158 | <*>? peer_id_key |
159 | <*>! peer_port_key | 159 | <*>! peer_port_key |
160 | where | 160 | where |
161 | peerAddr ip pid port = PeerAddr ip pid port | 161 | peerAddr = flip PeerAddr |
162 | 162 | ||
163 | mergeIPLists :: [PeerAddr IPv4] -> Maybe [PeerAddr IPv6] -> [PeerAddr IP] | 163 | mergeIPLists :: [PeerAddr IPv4] -> Maybe [PeerAddr IPv6] -> [PeerAddr IP] |
164 | mergeIPLists v4 v6 = (fmap IPv4 `L.map` v4) | 164 | mergeIPLists v4 v6 = (fmap IPv4 `L.map` v4) |
diff --git a/src/Network/BitTorrent/Tracker/Message.hs b/src/Network/BitTorrent/Tracker/Message.hs index 0d720471..d0be1c36 100644 --- a/src/Network/BitTorrent/Tracker/Message.hs +++ b/src/Network/BitTorrent/Tracker/Message.hs | |||
@@ -45,6 +45,7 @@ module Network.BitTorrent.Tracker.Message | |||
45 | 45 | ||
46 | -- ** Info | 46 | -- ** Info |
47 | , PeerList (..) | 47 | , PeerList (..) |
48 | , getPeerList | ||
48 | , AnnounceInfo(..) | 49 | , AnnounceInfo(..) |
49 | , defaultNumWant | 50 | , defaultNumWant |
50 | , defaultMaxNumWant | 51 | , defaultMaxNumWant |
@@ -435,24 +436,22 @@ renderAnnounceRequest = queryToSimpleQuery . toQuery | |||
435 | -- | 436 | -- |
436 | -- For more info see: <http://www.bittorrent.org/beps/bep_0023.html> | 437 | -- For more info see: <http://www.bittorrent.org/beps/bep_0023.html> |
437 | -- | 438 | -- |
438 | data PeerList a | 439 | data PeerList ip |
439 | = PeerList { getPeerList :: [PeerAddr a] } | 440 | = PeerList [PeerAddr IP] |
440 | | CompactPeerList { getPeerList :: [PeerAddr a] } | 441 | | CompactPeerList [PeerAddr ip] |
441 | deriving (Show, Eq, Typeable, Functor) | 442 | deriving (Show, Eq, Typeable, Functor) |
442 | 443 | ||
443 | putCompactPeerList :: (Serialize a) => S.Putter [PeerAddr a] | 444 | getPeerList :: PeerList IP -> [PeerAddr IP] |
444 | putCompactPeerList = mapM_ put | 445 | getPeerList (PeerList xs) = xs |
446 | getPeerList (CompactPeerList xs) = xs | ||
445 | 447 | ||
446 | getCompactPeerList :: (Serialize a) => S.Get [PeerAddr a] | 448 | instance Serialize a => BEncode (PeerList a) where |
447 | getCompactPeerList = many get | ||
448 | |||
449 | instance (Typeable a, BEncode a, Serialize a) => BEncode (PeerList a) where | ||
450 | toBEncode (PeerList xs) = toBEncode xs | 449 | toBEncode (PeerList xs) = toBEncode xs |
451 | toBEncode (CompactPeerList xs) = toBEncode $ runPut (putCompactPeerList xs) | 450 | toBEncode (CompactPeerList xs) = toBEncode $ runPut (mapM_ put xs) |
452 | 451 | ||
453 | fromBEncode (BList l ) = PeerList <$> fromBEncode (BList l) | 452 | fromBEncode (BList l ) = PeerList <$> fromBEncode (BList l) |
454 | fromBEncode (BString s ) = CompactPeerList <$> runGet getCompactPeerList s | 453 | fromBEncode (BString s ) = CompactPeerList <$> runGet (many get) s |
455 | fromBEncode _ = decodingError "Peer list" | 454 | fromBEncode _ = decodingError "PeerList: should be a BString or BList" |
456 | 455 | ||
457 | -- | The tracker response includes a peer list that helps the client | 456 | -- | The tracker response includes a peer list that helps the client |
458 | -- participate in the torrent. The most important is 'respPeer' list | 457 | -- participate in the torrent. The most important is 'respPeer' list |