diff options
author | Joe Crayne <joe@jerkface.net> | 2020-01-03 17:12:14 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2020-01-03 17:26:06 -0500 |
commit | 5181c77ce7dd73d622ff3921b90bf2741bedb646 (patch) | |
tree | 16ba93b83ad0c137a013e47f593d7d40ace68ce6 /dht/src | |
parent | 31b799222cb76cd0002d9a3cc5b340a7b6fed139 (diff) |
QueryResponse: Use three-way sum to distinguish Canceled and Timedout.
Diffstat (limited to 'dht/src')
-rw-r--r-- | dht/src/Network/BitTorrent/MainlineDHT.hs | 21 | ||||
-rw-r--r-- | dht/src/Network/Tox/DHT/Handlers.hs | 8 | ||||
-rw-r--r-- | dht/src/Network/Tox/Onion/Handlers.hs | 2 | ||||
-rw-r--r-- | dht/src/Network/Tox/Onion/Routes.hs | 2 | ||||
-rw-r--r-- | dht/src/Network/Tox/TCP.hs | 10 |
5 files changed, 22 insertions, 21 deletions
diff --git a/dht/src/Network/BitTorrent/MainlineDHT.hs b/dht/src/Network/BitTorrent/MainlineDHT.hs index bb556bc6..e604f5e5 100644 --- a/dht/src/Network/BitTorrent/MainlineDHT.hs +++ b/dht/src/Network/BitTorrent/MainlineDHT.hs | |||
@@ -1033,21 +1033,22 @@ announceH (SwarmsDatabase peers toks _) naddr announcement = do | |||
1033 | isReadonlyClient :: MainlineClient -> Bool | 1033 | isReadonlyClient :: MainlineClient -> Bool |
1034 | isReadonlyClient client = False -- TODO | 1034 | isReadonlyClient client = False -- TODO |
1035 | 1035 | ||
1036 | mainlineSend :: ( BEncode a | 1036 | mainlineSend :: ( BEncode xqry |
1037 | , BEncode a2 | 1037 | , BEncode xrsp |
1038 | ) => Method | 1038 | ) => Method |
1039 | -> (a2 -> b) | 1039 | -> (xrsp -> rsp) |
1040 | -> (t -> a) | 1040 | -> (qry -> xqry) |
1041 | -> MainlineClient | 1041 | -> MainlineClient |
1042 | -> t | 1042 | -> qry |
1043 | -> NodeInfo | 1043 | -> NodeInfo |
1044 | -> IO (Maybe b) | 1044 | -> IO (Maybe rsp) |
1045 | mainlineSend meth unwrap msg client nid addr = do | 1045 | mainlineSend meth unwrap msg client nid addr = do |
1046 | reply <- sendQuery client serializer (msg nid) addr | 1046 | reply <- sendQuery client serializer (msg nid) addr |
1047 | -- sendQuery will return (Just (Left _)) on a parse error. We're going to | 1047 | return $ case reply of |
1048 | -- blow it away with the join-either sequence. | 1048 | Success (Right x) -> Just x |
1049 | -- TODO: Do something with parse errors. | 1049 | Success (Left e) -> Nothing -- TODO: Do something with parse errors. |
1050 | return $ join $ either (const Nothing) Just <$> reply | 1050 | Canceled -> Nothing |
1051 | TimedOut -> Nothing | ||
1051 | where | 1052 | where |
1052 | serializer = MethodSerializer | 1053 | serializer = MethodSerializer |
1053 | { methodTimeout = \ni -> return (ni, 5000000) | 1054 | { methodTimeout = \ni -> return (ni, 5000000) |
diff --git a/dht/src/Network/Tox/DHT/Handlers.hs b/dht/src/Network/Tox/DHT/Handlers.hs index 7806da78..dc4ca5fa 100644 --- a/dht/src/Network/Tox/DHT/Handlers.hs +++ b/dht/src/Network/Tox/DHT/Handlers.hs | |||
@@ -353,7 +353,7 @@ ping client addr = do | |||
353 | dput XPing $ show addr ++ " <-- ping" | 353 | dput XPing $ show addr ++ " <-- ping" |
354 | reply <- QR.sendQuery client (serializer PingType DHTPing unpong) Ping addr | 354 | reply <- QR.sendQuery client (serializer PingType DHTPing unpong) Ping addr |
355 | dput XPing $ show addr ++ " -pong-> " ++ show reply | 355 | dput XPing $ show addr ++ " -pong-> " ++ show reply |
356 | maybe (return False) (\Pong -> return True) $ join reply | 356 | maybe (return False) (\Pong -> return True) $ join $ resultToMaybe reply |
357 | 357 | ||
358 | 358 | ||
359 | saveCookieKey :: TVar [(SockAddr, (Int, PublicKey))] -> SockAddr -> PublicKey -> STM () | 359 | saveCookieKey :: TVar [(SockAddr, (Int, PublicKey))] -> SockAddr -> PublicKey -> STM () |
@@ -396,7 +396,7 @@ cookieRequest crypto client localUserKey addr = do | |||
396 | reply <- QR.sendQuery client cookieSerializer cookieRequest addr | 396 | reply <- QR.sendQuery client cookieSerializer cookieRequest addr |
397 | runlast | 397 | runlast |
398 | dput XNetCrypto $ show addr ++ " -cookieResponse-> " ++ show reply | 398 | dput XNetCrypto $ show addr ++ " -cookieResponse-> " ++ show reply |
399 | return $ join reply | 399 | return $ join $ resultToMaybe reply |
400 | 400 | ||
401 | unCookie :: DHTMessage t -> Maybe (t (Cookie Encrypted)) | 401 | unCookie :: DHTMessage t -> Maybe (t (Cookie Encrypted)) |
402 | unCookie (DHTCookie n24 fcookie) = Just fcookie | 402 | unCookie (DHTCookie n24 fcookie) = Just fcookie |
@@ -415,7 +415,7 @@ getNodes client cbvar nid addr = do | |||
415 | -- dput XMisc $ show addr ++ " <-- getnodes " ++ show nid | 415 | -- dput XMisc $ show addr ++ " <-- getnodes " ++ show nid |
416 | reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr | 416 | reply <- QR.sendQuery client (serializer GetNodesType DHTGetNodes unsendNodes) (GetNodes nid) addr |
417 | -- dput XMisc $ show addr ++ " -sendnodes-> " ++ show reply | 417 | -- dput XMisc $ show addr ++ " -sendnodes-> " ++ show reply |
418 | forM_ (join reply) $ \(SendNodes ns) -> | 418 | forM_ (join $ resultToMaybe reply) $ \(SendNodes ns) -> |
419 | forM_ ns $ \n -> do | 419 | forM_ ns $ \n -> do |
420 | now <- getPOSIXTime | 420 | now <- getPOSIXTime |
421 | atomically $ do | 421 | atomically $ do |
@@ -423,7 +423,7 @@ getNodes client cbvar nid addr = do | |||
423 | forM_ mcbs $ \cbs -> do | 423 | forM_ mcbs $ \cbs -> do |
424 | forM_ cbs $ \cb -> do | 424 | forM_ cbs $ \cb -> do |
425 | rumoredAddress cb now addr (udpNodeInfo n) | 425 | rumoredAddress cb now addr (udpNodeInfo n) |
426 | return $ fmap unwrapNodes $ join reply | 426 | return $ fmap unwrapNodes $ join $ resultToMaybe reply |
427 | 427 | ||
428 | getNodesUDP :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) | 428 | getNodesUDP :: Client -> TVar (HashMap NodeId [NodeInfoCallback]) -> NodeId -> NodeInfo -> IO (Maybe ([NodeInfo],[NodeInfo],Maybe ())) |
429 | getNodesUDP client cbvar nid addr = getNodes client cbvar nid (Multi.UDP ==> addr) | 429 | getNodesUDP client cbvar nid addr = getNodes client cbvar nid (Multi.UDP ==> addr) |
diff --git a/dht/src/Network/Tox/Onion/Handlers.hs b/dht/src/Network/Tox/Onion/Handlers.hs index 65ec846c..fa7bc83c 100644 --- a/dht/src/Network/Tox/Onion/Handlers.hs +++ b/dht/src/Network/Tox/Onion/Handlers.hs | |||
@@ -285,7 +285,7 @@ sendOnion getTimeout client req oaddr unwrap = | |||
285 | forM_ mb $ \r -> dput XAnnounce $ show (onionNodeInfo oaddr) ++ " sent response: " ++ show r | 285 | forM_ mb $ \r -> dput XAnnounce $ show (onionNodeInfo oaddr) ++ " sent response: " ++ show r |
286 | maybe (if n>0 then loop $! n - 1 else return Nothing) | 286 | maybe (if n>0 then loop $! n - 1 else return Nothing) |
287 | (return . Just . unwrap (onionNodeInfo oaddr)) | 287 | (return . Just . unwrap (onionNodeInfo oaddr)) |
288 | $ join mb | 288 | $ join $ resultToMaybe mb |
289 | 289 | ||
290 | 290 | ||
291 | -- | Lookup the secret counterpart for a given alias key. | 291 | -- | Lookup the secret counterpart for a given alias key. |
diff --git a/dht/src/Network/Tox/Onion/Routes.hs b/dht/src/Network/Tox/Onion/Routes.hs index b20ad7dd..7c11227a 100644 --- a/dht/src/Network/Tox/Onion/Routes.hs +++ b/dht/src/Network/Tox/Onion/Routes.hs | |||
@@ -171,7 +171,7 @@ newOnionRouter crypto perror tcp_enabled = do | |||
171 | ((tbl,(tcptbl,tcpcons,relaynet,onionnet)),tcp) <- do | 171 | ((tbl,(tcptbl,tcpcons,relaynet,onionnet)),tcp) <- do |
172 | (tcptbl, client) <- TCP.newClient crypto | 172 | (tcptbl, client) <- TCP.newClient crypto |
173 | id | 173 | id |
174 | (. (Just . (,) False)) | 174 | (. (Success . (,) False)) |
175 | (lookupSender' pq rlog) | 175 | (lookupSender' pq rlog) |
176 | (\_ (RouteId rid) -> atomically $ fmap storedRoute <$> readArray rm rid) | 176 | (\_ (RouteId rid) -> atomically $ fmap storedRoute <$> readArray rm rid) |
177 | 177 | ||
diff --git a/dht/src/Network/Tox/TCP.hs b/dht/src/Network/Tox/TCP.hs index 9f0af976..0850ce51 100644 --- a/dht/src/Network/Tox/TCP.hs +++ b/dht/src/Network/Tox/TCP.hs | |||
@@ -46,7 +46,7 @@ import DPut | |||
46 | import Network.Address (setPort,PortNumber,localhost4,fromSockAddr,nullAddress4) | 46 | import Network.Address (setPort,PortNumber,localhost4,fromSockAddr,nullAddress4) |
47 | import Network.Kademlia.Routing | 47 | import Network.Kademlia.Routing |
48 | import Network.Kademlia.Search hiding (sendQuery) | 48 | import Network.Kademlia.Search hiding (sendQuery) |
49 | import Network.QueryResponse | 49 | import Network.QueryResponse as QR |
50 | import Network.QueryResponse.TCP | 50 | import Network.QueryResponse.TCP |
51 | import Network.Tox.TCP.NodeId () | 51 | import Network.Tox.TCP.NodeId () |
52 | import Network.Tox.DHT.Transport (toxSpace) | 52 | import Network.Tox.DHT.Transport (toxSpace) |
@@ -226,7 +226,7 @@ getUDPNodes tcp seeking dst = fmap fst <$> getUDPNodes' tcp seeking dst | |||
226 | getUDPNodes' :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (Maybe (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo)) | 226 | getUDPNodes' :: TCPClient err Nonce8 -> NodeId -> UDP.NodeInfo -> IO (Maybe (([UDP.NodeInfo], [UDP.NodeInfo], Maybe ()), NodeInfo)) |
227 | getUDPNodes' tcp seeking dst0 = do | 227 | getUDPNodes' tcp seeking dst0 = do |
228 | mgateway <- atomically $ tcpGetGateway tcp dst0 | 228 | mgateway <- atomically $ tcpGetGateway tcp dst0 |
229 | fmap join $ forM mgateway $ \gateway -> do | 229 | fmap (join . fmap resultToMaybe) $ forM mgateway $ \gateway -> do |
230 | (b,c,n24) <- atomically $ do | 230 | (b,c,n24) <- atomically $ do |
231 | b <- transportNewKey (tcpCrypto tcp) | 231 | b <- transportNewKey (tcpCrypto tcp) |
232 | c <- transportNewKey (tcpCrypto tcp) | 232 | c <- transportNewKey (tcpCrypto tcp) |
@@ -284,7 +284,7 @@ handle2route o src dst = do | |||
284 | tcpPing :: Show addr => Client err PacketNumber Nonce8 addr (Bool,RelayPacket) -> addr -> IO (Maybe ()) | 284 | tcpPing :: Show addr => Client err PacketNumber Nonce8 addr (Bool,RelayPacket) -> addr -> IO (Maybe ()) |
285 | tcpPing client dst = do | 285 | tcpPing client dst = do |
286 | dput XTCP $ "tcpPing " ++ show dst | 286 | dput XTCP $ "tcpPing " ++ show dst |
287 | sendQuery client meth () dst | 287 | resultToMaybe <$> sendQuery client meth () dst |
288 | where meth = MethodSerializer | 288 | where meth = MethodSerializer |
289 | { wrapQuery = \n8 src dst () -> (True,RelayPing n8) | 289 | { wrapQuery = \n8 src dst () -> (True,RelayPing n8) |
290 | , unwrapResponse = \_ -> () | 290 | , unwrapResponse = \_ -> () |
@@ -295,7 +295,7 @@ tcpPing client dst = do | |||
295 | tcpConnectionRequest_ :: Client err PacketNumber tid addr (Bool, RelayPacket) | 295 | tcpConnectionRequest_ :: Client err PacketNumber tid addr (Bool, RelayPacket) |
296 | -> PublicKey -> addr -> IO (Maybe ConId) | 296 | -> PublicKey -> addr -> IO (Maybe ConId) |
297 | tcpConnectionRequest_ client pubkey ni = do | 297 | tcpConnectionRequest_ client pubkey ni = do |
298 | sendQuery client meth pubkey ni | 298 | resultToMaybe <$> sendQuery client meth pubkey ni |
299 | where | 299 | where |
300 | meth = MethodSerializer | 300 | meth = MethodSerializer |
301 | { wrapQuery = \n8 src dst pubkey -> (True,RoutingRequest pubkey) | 301 | { wrapQuery = \n8 src dst pubkey -> (True,RoutingRequest pubkey) |
@@ -319,7 +319,7 @@ type RelayCache = TCPCache (SessionProtocol (SessionData,RelayPacket) RelayPacke | |||
319 | -- defaults are 'id' and 'tryPutMVar'. The resulting customized table state | 319 | -- defaults are 'id' and 'tryPutMVar'. The resulting customized table state |
320 | -- will be returned to the caller along with the new client. | 320 | -- will be returned to the caller along with the new client. |
321 | newClient :: TransportCrypto | 321 | newClient :: TransportCrypto |
322 | -> ((Maybe (Bool,RelayPacket) -> IO ()) -> a) -- ^ store mvar for relay query | 322 | -> ((QR.Result (Bool,RelayPacket) -> IO ()) -> a) -- ^ store mvar for relay query |
323 | -> (a -> RelayPacket -> IO void) -- ^ load mvar for relay query | 323 | -> (a -> RelayPacket -> IO void) -- ^ load mvar for relay query |
324 | -> (SockAddr -> Nonce8 -> IO (Maybe (OnionDestination RouteId))) -- ^ lookup sender of onion query | 324 | -> (SockAddr -> Nonce8 -> IO (Maybe (OnionDestination RouteId))) -- ^ lookup sender of onion query |
325 | -> (UDP.NodeInfo -> RouteId -> IO (Maybe OnionRoute)) -- ^ lookup OnionRoute by id | 325 | -> (UDP.NodeInfo -> RouteId -> IO (Maybe OnionRoute)) -- ^ lookup OnionRoute by id |