summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Data/Torrent/Client.hs1
-rw-r--r--src/Network/BitTorrent/Core/PeerId.hs17
-rw-r--r--tests/Data/Torrent/ClientSpec.hs5
3 files changed, 23 insertions, 0 deletions
diff --git a/src/Data/Torrent/Client.hs b/src/Data/Torrent/Client.hs
index 1b24105f..7b178d41 100644
--- a/src/Data/Torrent/Client.hs
+++ b/src/Data/Torrent/Client.hs
@@ -62,6 +62,7 @@ data ClientImpl =
62 62
63-- UPnP(!) Bit Torrent !??? 63-- UPnP(!) Bit Torrent !???
64-- 'U' - UPnP NAT Bit Torrent 64-- 'U' - UPnP NAT Bit Torrent
65 | IBitLord
65 66
66 | IAres 67 | IAres
67 | IArctic 68 | IArctic
diff --git a/src/Network/BitTorrent/Core/PeerId.hs b/src/Network/BitTorrent/Core/PeerId.hs
index 5962a6e5..b8dd17e2 100644
--- a/src/Network/BitTorrent/Core/PeerId.hs
+++ b/src/Network/BitTorrent/Core/PeerId.hs
@@ -287,6 +287,8 @@ clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid)
287 case leading of 287 case leading of
288 '-' -> ClientInfo <$> getAzureusImpl <*> getAzureusVersion 288 '-' -> ClientInfo <$> getAzureusImpl <*> getAzureusVersion
289 'M' -> ClientInfo <$> pure IMainline <*> getMainlineVersion 289 'M' -> ClientInfo <$> pure IMainline <*> getMainlineVersion
290 'e' -> ClientInfo <$> getBitCometImpl <*> getBitCometVersion
291 'F' -> ClientInfo <$> getBitCometImpl <*> getBitCometVersion
290 c -> ClientInfo <$> pure (getShadowImpl c) <*> getShadowVersion 292 c -> ClientInfo <$> pure (getShadowImpl c) <*> getShadowVersion
291 293
292 getMainlineVersion = do 294 getMainlineVersion = do
@@ -299,6 +301,21 @@ clientInfo pid = either (const def) id $ runGet getCI (getPeerId pid)
299 where 301 where
300 mkVer bs = Version [fromMaybe 0 $ readMaybe $ BC.unpack bs] [] 302 mkVer bs = Version [fromMaybe 0 $ readMaybe $ BC.unpack bs] []
301 303
304 getBitCometImpl = do
305 bs <- getByteString 3
306 lookAhead $ do
307 _ <- getByteString 2
308 lr <- getByteString 4
309 return $
310 if lr == "LORD" then IBitLord else
311 if bs == "UTB" then IBitComet else
312 if bs == "xbc" then IBitComet else def
313
314 getBitCometVersion = do
315 x <- getWord8
316 y <- getWord8
317 return $ Version [fromIntegral x, fromIntegral y] []
318
302 getShadowImpl 'A' = IABC 319 getShadowImpl 'A' = IABC
303 getShadowImpl 'O' = IOspreyPermaseed 320 getShadowImpl 'O' = IOspreyPermaseed
304 getShadowImpl 'Q' = IBTQueue 321 getShadowImpl 'Q' = IBTQueue
diff --git a/tests/Data/Torrent/ClientSpec.hs b/tests/Data/Torrent/ClientSpec.hs
index c4c08798..8b3e7342 100644
--- a/tests/Data/Torrent/ClientSpec.hs
+++ b/tests/Data/Torrent/ClientSpec.hs
@@ -17,3 +17,8 @@ spec = do
17 it "decode Shad0w style peer id" $ do 17 it "decode Shad0w style peer id" $ do
18 clientInfo "S58B-----xxxxxxxxxxx" `shouldBe` "Shadow-5.8.11" 18 clientInfo "S58B-----xxxxxxxxxxx" `shouldBe` "Shadow-5.8.11"
19 clientInfo "T58B-----xxxxxxxxxxx" `shouldBe` "BitTornado-5.8.11" 19 clientInfo "T58B-----xxxxxxxxxxx" `shouldBe` "BitTornado-5.8.11"
20
21 it "decode bitcomet style peer id" $ do
22 clientInfo "exbc01xxxxxxxxxxxxxx" `shouldBe` "BitComet-48.49"
23 clientInfo "FUTB01xxxxxxxxxxxxxx" `shouldBe` "BitComet-48.49"
24 clientInfo "exbc01LORDxxxxxxxxxx" `shouldBe` "BitLord-48.49" \ No newline at end of file