summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2013-12-16 15:32:01 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2013-12-16 15:32:01 +0400
commitf393a2ec1611d2e5587f6fc97317294377c72d5d (patch)
tree278edaafd24c59abf480e7be2bb5791c5b527813 /src
parent1bfd9cdb74a7ba70c54bf84949889253032f8869 (diff)
Test peer list encoding
Diffstat (limited to 'src')
-rw-r--r--src/Network/BitTorrent/Core/PeerAddr.hs6
-rw-r--r--src/Network/BitTorrent/Tracker/Message.hs23
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
163mergeIPLists :: [PeerAddr IPv4] -> Maybe [PeerAddr IPv6] -> [PeerAddr IP] 163mergeIPLists :: [PeerAddr IPv4] -> Maybe [PeerAddr IPv6] -> [PeerAddr IP]
164mergeIPLists v4 v6 = (fmap IPv4 `L.map` v4) 164mergeIPLists 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--
438data PeerList a 439data 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
443putCompactPeerList :: (Serialize a) => S.Putter [PeerAddr a] 444getPeerList :: PeerList IP -> [PeerAddr IP]
444putCompactPeerList = mapM_ put 445getPeerList (PeerList xs) = xs
446getPeerList (CompactPeerList xs) = xs
445 447
446getCompactPeerList :: (Serialize a) => S.Get [PeerAddr a] 448instance Serialize a => BEncode (PeerList a) where
447getCompactPeerList = many get
448
449instance (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