public static QueryType TryGetQuery(BDictionary message, out Query query) { if (message.TryGetValue("q", out BString type)) { switch (type.Text) { case "ping": if (PingQuery.TryParse(message, out PingQuery pingQuery)) { query = pingQuery; return(QueryType.ping); } break; case "find_node": if (FindNodeQuery.TryParse(message, out FindNodeQuery findNodeQuery)) { query = findNodeQuery; return(QueryType.find_node); } break; case "get_peers": if (GetPeersQuery.TryParse(message, out GetPeersQuery getPeersQuery)) { query = getPeersQuery; return(QueryType.get_peers); } break; case "announce_peer": if (AnnouncePeerQuery.TryParse(message, out AnnouncePeerQuery announcePeerQuery)) { query = announcePeerQuery; return(QueryType.announce_peer); } break; default: query = null; return(QueryType.Unknown); } } query = null; return(QueryType.Invalid); }
public void FindNodeQuery_Encoding() { TransactionID transactionId = new TransactionID(Encoding.UTF8.GetBytes("aa")); NodeID senderId = new NodeID(Encoding.UTF8.GetBytes("abcdefghij0123456789")); NodeID targetId = new NodeID(Encoding.UTF8.GetBytes("mnopqrstuvwxyz123456")); FindNodeQuery testQuery = new FindNodeQuery(transactionId, senderId, targetId); byte[] bencodedMessageBytes = testQuery.Construct().Encode(); Assert.Equal(MessageType.Query, KademliaRPC.TryParseMessage(bencodedMessageBytes, out BDictionary message)); Assert.Equal(QueryType.find_node, KademliaRPC.TryGetQuery(message, out Query query)); Assert.True(query is FindNodeQuery); Assert.Equal(testQuery.TransactionID, query.TransactionID); Assert.Equal(testQuery.SenderNode, ((FindNodeQuery)query).SenderNode); Assert.Equal(testQuery.TargetNode, ((FindNodeQuery)query).TargetNode); Assert.Equal(TestBencodedMessage, Encoding.UTF8.GetString(bencodedMessageBytes)); }