diff options
author | Sam Truzjan <pxqr.sta@gmail.com> | 2013-11-23 04:29:59 +0400 |
---|---|---|
committer | Sam Truzjan <pxqr.sta@gmail.com> | 2013-11-23 04:29:59 +0400 |
commit | e3ee3bf4b174363f55c3af2195bd191e9c0d25b7 (patch) | |
tree | af432782fe94c10d901c15a1b9579975577edd77 | |
parent | ed25a297094b483dce06e14d52ced2f93f6dca41 (diff) |
Add mainline client implementation id
-rw-r--r-- | src/Data/Torrent/Client.hs | 1 | ||||
-rw-r--r-- | src/Network/BitTorrent/Core/PeerId.hs | 21 | ||||
-rw-r--r-- | tests/Data/Torrent/ClientSpec.hs | 4 |
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 | -- |
51 | data ClientImpl = | 51 | data 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 | |||
39 | import Data.Aeson | 39 | import Data.Aeson |
40 | import Data.BEncode as BE | 40 | import Data.BEncode as BE |
41 | import Data.ByteString as BS | 41 | import Data.ByteString as BS |
42 | import Data.ByteString.Internal as BS | ||
42 | import Data.ByteString.Char8 as BC | 43 | import Data.ByteString.Char8 as BC |
43 | import qualified Data.ByteString.Lazy as BL | 44 | import qualified Data.ByteString.Lazy as BL |
44 | import qualified Data.ByteString.Lazy.Builder as BS | 45 | import qualified Data.ByteString.Lazy.Builder as BS |
45 | import Data.Default | 46 | import Data.Default |
46 | import Data.Foldable (foldMap) | 47 | import Data.Foldable (foldMap) |
47 | import Data.List as L | 48 | import Data.List as L |
49 | import Data.List.Split as L | ||
48 | import Data.Maybe (fromMaybe) | 50 | import Data.Maybe (fromMaybe) |
49 | import Data.Monoid | 51 | import Data.Monoid |
50 | import Data.Serialize as S | 52 | import Data.Serialize as S |
@@ -279,9 +281,20 @@ parseImpl = f . BC.unpack | |||
279 | -- | 281 | -- |
280 | clientInfo :: PeerId -> ClientInfo | 282 | clientInfo :: PeerId -> ClientInfo |
281 | clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid) | 283 | clientInfo 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 | |||
9 | spec :: Spec | 9 | spec :: Spec |
10 | spec = do | 10 | spec = 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" |