summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Truzjan <pxqr.sta@gmail.com>2014-01-08 07:53:52 +0400
committerSam Truzjan <pxqr.sta@gmail.com>2014-01-08 07:53:52 +0400
commit64f26fba49e7ae933a0ccdcd7cdbb56c5c6a7df7 (patch)
tree05aa86f2dd3ecff40b6fde9b40e02a0d4e404e91
parent3ddfd24a0b158bdf06f654a373f82e0591cb9b8f (diff)
Use newer krpc package
-rw-r--r--bittorrent.cabal10
-rw-r--r--src/Network/BitTorrent/DHT/Message.hs4
-rw-r--r--src/Network/BitTorrent/DHT/Session.hs15
m---------sub/krpc10
-rw-r--r--tests/Network/BitTorrent/DHT/MessageSpec.hs16
5 files changed, 29 insertions, 26 deletions
diff --git a/bittorrent.cabal b/bittorrent.cabal
index 073329de..28c26baf 100644
--- a/bittorrent.cabal
+++ b/bittorrent.cabal
@@ -148,7 +148,7 @@ library
148 148
149 -- Network 149 -- Network
150 , network >= 2.4 150 , network >= 2.4
151 , krpc >= 0.5 151 , krpc >= 0.6
152 , http-types >= 0.8 152 , http-types >= 0.8
153 , http-conduit >= 1.9 && < 2.0 153 , http-conduit >= 1.9 && < 2.0
154 , wai >= 1.4 && < 2.0 154 , wai >= 1.4 && < 2.0
@@ -202,6 +202,7 @@ test-suite spec
202 , convertible 202 , convertible
203 , data-default 203 , data-default
204 , monad-loops 204 , monad-loops
205 , monad-logger
205 , containers 206 , containers
206 , iproute 207 , iproute
207 208
@@ -220,7 +221,7 @@ test-suite spec
220 , http-types 221 , http-types
221 , bencoding 222 , bencoding
222 , process 223 , process
223 , krpc >= 0.5.0.0 224 , krpc >= 0.6
224 , bittorrent 225 , bittorrent
225 ghc-options: -Wall -fno-warn-orphans 226 ghc-options: -Wall -fno-warn-orphans
226 227
@@ -250,11 +251,6 @@ executable mktorrent
250 hs-source-dirs: examples 251 hs-source-dirs: examples
251 main-is: MkTorrent.hs 252 main-is: MkTorrent.hs
252 other-modules: Paths_bittorrent 253 other-modules: Paths_bittorrent
253-- , MkTorrent.Amend
254-- , MkTorrent.Check
255-- , MkTorrent.Create
256-- , MkTorrent.Magnet
257-- , MkTorrent.Show
258 build-depends: base == 4.6.* 254 build-depends: base == 4.6.*
259 , bytestring 255 , bytestring
260 , text 256 , text
diff --git a/src/Network/BitTorrent/DHT/Message.hs b/src/Network/BitTorrent/DHT/Message.hs
index 461c8f83..ac4889fe 100644
--- a/src/Network/BitTorrent/DHT/Message.hs
+++ b/src/Network/BitTorrent/DHT/Message.hs
@@ -108,7 +108,7 @@ node_id_key = "id"
108data Query a = Query 108data Query a = Query
109 { thisNodeId :: NodeId -- ^ node id of /quering/ node; 109 { thisNodeId :: NodeId -- ^ node id of /quering/ node;
110 , queryParams :: a -- ^ query parameters. 110 , queryParams :: a -- ^ query parameters.
111 } deriving (Show, Eq) 111 } deriving (Show, Eq, Typeable)
112 112
113instance BEncode a => BEncode (Query a) where 113instance BEncode a => BEncode (Query a) where
114 toBEncode Query {..} = toDict $ 114 toBEncode Query {..} = toDict $
@@ -128,7 +128,7 @@ instance BEncode a => BEncode (Query a) where
128data Response a = Response 128data Response a = Response
129 { remoteNodeId :: NodeId -- ^ node id of /quered/ node; 129 { remoteNodeId :: NodeId -- ^ node id of /quered/ node;
130 , responseVals :: a -- ^ query result. 130 , responseVals :: a -- ^ query result.
131 } deriving (Show, Eq) 131 } deriving (Show, Eq, Typeable)
132 132
133instance BEncode a => BEncode (Response a) where 133instance BEncode a => BEncode (Response a) where
134 toBEncode = toBEncode . toQuery 134 toBEncode = toBEncode . toQuery
diff --git a/src/Network/BitTorrent/DHT/Session.hs b/src/Network/BitTorrent/DHT/Session.hs
index 4e6a6825..d7c6a7f7 100644
--- a/src/Network/BitTorrent/DHT/Session.hs
+++ b/src/Network/BitTorrent/DHT/Session.hs
@@ -76,8 +76,8 @@ import Text.PrettyPrint as PP hiding ((<>))
76import Text.PrettyPrint.Class 76import Text.PrettyPrint.Class
77 77
78import Data.Torrent.InfoHash 78import Data.Torrent.InfoHash
79import Network.KRPC 79import Network.KRPC hiding (Options, def)
80import Network.KRPC.Method 80import qualified Network.KRPC as KRPC (Options, def)
81import Network.BitTorrent.Core 81import Network.BitTorrent.Core
82import Network.BitTorrent.Core.PeerAddr as P 82import Network.BitTorrent.Core.PeerAddr as P
83import Network.BitTorrent.DHT.Message 83import Network.BitTorrent.DHT.Message
@@ -196,7 +196,8 @@ runDHT :: forall ip a. Address ip
196 -> IO a -- ^ result. 196 -> IO a -- ^ result.
197runDHT handlers opts naddr action = runResourceT $ do 197runDHT handlers opts naddr action = runResourceT $ do
198 runStderrLoggingT $ LoggingT $ \ logger -> do 198 runStderrLoggingT $ LoggingT $ \ logger -> do
199 (_, m) <- allocate (newManager (toSockAddr naddr) handlers) closeManager 199 let kopts = KRPC.def
200 (_, m) <- allocate (newManager kopts (toSockAddr naddr) handlers) closeManager
200 myId <- liftIO genNodeId 201 myId <- liftIO genNodeId
201 node <- liftIO $ Node opts m 202 node <- liftIO $ Node opts m
202 <$> newMVar (nullTable myId (optBucketCount opts)) 203 <$> newMVar (nullTable myId (optBucketCount opts))
@@ -254,14 +255,14 @@ grantToken addr = do
254 toks <- asks sessionTokens >>= liftIO . readTVarIO 255 toks <- asks sessionTokens >>= liftIO . readTVarIO
255 return $ T.lookup addr $ tokenMap toks 256 return $ T.lookup addr $ tokenMap toks
256 257
257-- | Throws 'ProtocolError' if token is invalid or already expired. 258-- | Throws 'HandlerError' if the token is invalid or already
259-- expired. See 'TokenMap' for details.
258checkToken :: Hashable a => NodeAddr a -> Token -> DHT ip () 260checkToken :: Hashable a => NodeAddr a -> Token -> DHT ip ()
259checkToken addr questionableToken = do 261checkToken addr questionableToken = do
260 tryUpdateSecret 262 tryUpdateSecret
261 toks <- asks sessionTokens >>= liftIO . readTVarIO 263 toks <- asks sessionTokens >>= liftIO . readTVarIO
262 unless (member addr questionableToken (tokenMap toks)) $ 264 unless (member addr questionableToken (tokenMap toks)) $
263 liftIO $ throwIO $ KError ProtocolError "bad token" "" 265 throw $ InvalidParameter "token"
264 -- todo reset transaction id in krpc
265 266
266{----------------------------------------------------------------------- 267{-----------------------------------------------------------------------
267-- Routing table 268-- Routing table
@@ -355,7 +356,7 @@ nodeHandler :: Address ip => KRPC (Query a) (Response b)
355 => (NodeAddr ip -> a -> DHT ip b) -> NodeHandler ip 356 => (NodeAddr ip -> a -> DHT ip b) -> NodeHandler ip
356nodeHandler action = handler $ \ sockAddr (Query remoteId q) -> do 357nodeHandler action = handler $ \ sockAddr (Query remoteId q) -> do
357 case fromSockAddr sockAddr of 358 case fromSockAddr sockAddr of
358 Nothing -> liftIO $ throwIO $ KError GenericError "bad address" "" 359 Nothing -> throwIO BadAddress
359 Just naddr -> do 360 Just naddr -> do
360 insertNode (NodeInfo remoteId naddr) 361 insertNode (NodeInfo remoteId naddr)
361 Response <$> getNodeId <*> action naddr q 362 Response <$> getNodeId <*> action naddr q
diff --git a/sub/krpc b/sub/krpc
Subproject 9a9a7d5750e24ee0810006f3dd2a7e7879b521e Subproject 41ca2fc6ece3e24542703035c4249f409eca390
diff --git a/tests/Network/BitTorrent/DHT/MessageSpec.hs b/tests/Network/BitTorrent/DHT/MessageSpec.hs
index af694470..0d84c919 100644
--- a/tests/Network/BitTorrent/DHT/MessageSpec.hs
+++ b/tests/Network/BitTorrent/DHT/MessageSpec.hs
@@ -1,6 +1,7 @@
1{-# LANGUAGE RecordWildCards #-} 1{-# LANGUAGE RecordWildCards #-}
2module Network.BitTorrent.DHT.MessageSpec (spec) where 2module Network.BitTorrent.DHT.MessageSpec (spec) where
3import Control.Monad.Reader 3import Control.Monad.Reader
4import Control.Monad.Logger
4import Control.Concurrent 5import Control.Concurrent
5import Data.BEncode as BE 6import Data.BEncode as BE
6import Data.ByteString.Lazy as BL 7import Data.ByteString.Lazy as BL
@@ -8,7 +9,8 @@ import Data.Default
8import Data.List as L 9import Data.List as L
9import Network.BitTorrent.Core 10import Network.BitTorrent.Core
10import Network.BitTorrent.DHT.Message 11import Network.BitTorrent.DHT.Message
11import Network.KRPC 12import qualified Network.KRPC as KRPC (def)
13import Network.KRPC hiding (def)
12import Network.Socket (PortNumber) 14import Network.Socket (PortNumber)
13import Test.Hspec 15import Test.Hspec
14import Test.QuickCheck 16import Test.QuickCheck
@@ -18,6 +20,10 @@ import Network.BitTorrent.CoreSpec ()
18import Network.BitTorrent.DHT.TokenSpec () 20import Network.BitTorrent.DHT.TokenSpec ()
19import Data.Torrent.InfoHashSpec () 21import Data.Torrent.InfoHashSpec ()
20 22
23
24instance MonadLogger IO where
25 monadLoggerLog _ _ _ _ = return ()
26
21remoteAddr :: SockAddr 27remoteAddr :: SockAddr
22remoteAddr = SockAddrInet 6881 (256 * 256 * 256 + 127) 28remoteAddr = SockAddrInet 6881 (256 * 256 * 256 + 127)
23 29
@@ -29,12 +35,12 @@ thisPort = 60001
29 35
30rpc :: ReaderT (Manager IO) IO a -> IO a 36rpc :: ReaderT (Manager IO) IO a -> IO a
31rpc action = do 37rpc action = do
32 withManager thisAddr [] $ runReaderT $ do 38 withManager KRPC.def thisAddr [] $ runReaderT $ do
33 listen 39 listen
34 action 40 action
35 41
36isProtocolError :: KError -> Bool 42isQueryError :: QueryFailure -> Bool
37isProtocolError KError {..} = errorCode == ProtocolError 43isQueryError _ = True
38 44
39prop_bencode :: Eq a => Show a => BEncode a => a -> Expectation 45prop_bencode :: Eq a => Show a => BEncode a => a -> Expectation
40prop_bencode x = BE.decode (BL.toStrict (BE.encode x)) `shouldBe` Right x 46prop_bencode x = BE.decode (BL.toStrict (BE.encode x)) `shouldBe` Right x
@@ -196,5 +202,5 @@ spec = do
196 let _ = peers :: Either [NodeInfo IPv4] [PeerAddr IPv4] 202 let _ = peers :: Either [NodeInfo IPv4] [PeerAddr IPv4]
197 let invalidToken = "" 203 let invalidToken = ""
198 query remoteAddr (Query nid (Announce False def thisPort invalidToken))) 204 query remoteAddr (Query nid (Announce False def thisPort invalidToken)))
199 `shouldThrow` isProtocolError 205 `shouldThrow` isQueryError
200 return () 206 return ()