summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2013-11-23 04:29:59 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2013-11-23 04:29:59 +0400
commite3ee3bf4b174363f55c3af2195bd191e9c0d25b7 (patch)
treeaf432782fe94c10d901c15a1b9579975577edd77
parented25a297094b483dce06e14d52ced2f93f6dca41 (diff)
Add mainline client implementation id
-rw-r--r--src/Data/Torrent/Client.hs1
-rw-r--r--src/Network/BitTorrent/Core/PeerId.hs21
-rw-r--r--tests/Data/Torrent/ClientSpec.hs4
3 files changed, 22 insertions, 4 deletions
diff --git a/src/Data/Torrent/Client.hs b/src/Data/Torrent/Client.hs
index 0fd6722b..079b63c1 100644
--- a/src/Data/Torrent/Client.hs
+++ b/src/Data/Torrent/Client.hs
@@ -50,6 +50,7 @@ import Paths_bittorrent (version)
50-- 50--
51data ClientImpl = 51data ClientImpl =
52 IUnknown 52 IUnknown
53 | IMainline
53 | IAres 54 | IAres
54 | IArctic 55 | IArctic
55 | IAvicora 56 | IAvicora
diff --git a/src/Network/BitTorrent/Core/PeerId.hs b/src/Network/BitTorrent/Core/PeerId.hs
index 6aebe8d4..75a4d7a0 100644
--- a/src/Network/BitTorrent/Core/PeerId.hs
+++ b/src/Network/BitTorrent/Core/PeerId.hs
@@ -39,12 +39,14 @@ import Control.Applicative
39import Data.Aeson 39import Data.Aeson
40import Data.BEncode as BE 40import Data.BEncode as BE
41import Data.ByteString as BS 41import Data.ByteString as BS
42import Data.ByteString.Internal as BS
42import Data.ByteString.Char8 as BC 43import Data.ByteString.Char8 as BC
43import qualified Data.ByteString.Lazy as BL 44import qualified Data.ByteString.Lazy as BL
44import qualified Data.ByteString.Lazy.Builder as BS 45import qualified Data.ByteString.Lazy.Builder as BS
45import Data.Default 46import Data.Default
46import Data.Foldable (foldMap) 47import Data.Foldable (foldMap)
47import Data.List as L 48import Data.List as L
49import Data.List.Split as L
48import Data.Maybe (fromMaybe) 50import Data.Maybe (fromMaybe)
49import Data.Monoid 51import Data.Monoid
50import Data.Serialize as S 52import Data.Serialize as S
@@ -279,9 +281,20 @@ parseImpl = f . BC.unpack
279-- 281--
280clientInfo :: PeerId -> ClientInfo 282clientInfo :: PeerId -> ClientInfo
281clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid) 283clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid)
282 where -- TODO other styles 284 where
283 getCI = getWord8 >> ClientInfo <$> getClientImpl <*> getClientVersion 285 getCI = do
284 getClientImpl = parseImpl <$> getByteString 2 286 leading <- BS.w2c <$> getWord8
285 getClientVersion = mkVer <$> getByteString 4 287 case leading of
288 '-' -> ClientInfo <$> getAzureusImpl <*> getAzureusVersion
289 'M' -> ClientInfo <$> pure IMainline <*> getMainlineVersion
290 _ -> pure def
291
292 getMainlineVersion = do
293 str <- BC.unpack <$> getByteString 7
294 let mnums = L.filter (not . L.null) $ L.linesBy ('-' ==) str
295 return $ Version (fromMaybe [] $ sequence $ L.map readMaybe mnums) []
296
297 getAzureusImpl = parseImpl <$> getByteString 2
298 getAzureusVersion = mkVer <$> getByteString 4
286 where 299 where
287 mkVer bs = Version [fromMaybe 0 $ readMaybe $ BC.unpack bs] [] 300 mkVer bs = Version [fromMaybe 0 $ readMaybe $ BC.unpack bs] []
diff --git a/tests/Data/Torrent/ClientSpec.hs b/tests/Data/Torrent/ClientSpec.hs
index 890ee95e..94335ae9 100644
--- a/tests/Data/Torrent/ClientSpec.hs
+++ b/tests/Data/Torrent/ClientSpec.hs
@@ -9,6 +9,10 @@ import Network.BitTorrent.Core.PeerId
9spec :: Spec 9spec :: Spec
10spec = do 10spec = do
11 describe "client info" $ do 11 describe "client info" $ do
12 it "decode mainline encoded peer id" $ do
13 clientInfo "M4-3-6--xxxxxxxxxxxx" `shouldBe` "Mainline-4.3.6"
14 clientInfo "M4-20-8-xxxxxxxxxxxx" `shouldBe` "Mainline-4.20.8"
15
12 it "decode azureus encoded peer id" $ do 16 it "decode azureus encoded peer id" $ do
13 clientInfo "-AZ2060-xxxxxxxxxxxx" `shouldBe` "Azureus-2060" 17 clientInfo "-AZ2060-xxxxxxxxxxxx" `shouldBe` "Azureus-2060"
14 clientInfo "-BS0000-xxxxxxxxxxxx" `shouldBe` "BTSlave-0" 18 clientInfo "-BS0000-xxxxxxxxxxxx" `shouldBe` "BTSlave-0"