Explorar el Código

Don't send announce_peer message with empty token in
DHTPeerLookupTask. Replace old node ID with new node ID when response
message is received in DHTAbstractNodeLookupTask.

Tatsuhiro Tsujikawa hace 15 años
padre
commit
a9f734218f
Se han modificado 2 ficheros con 26 adiciones y 10 borrados
  1. 8 0
      src/DHTAbstractNodeLookupTask.h
  2. 18 10
      src/DHTPeerLookupTask.cc

+ 8 - 0
src/DHTAbstractNodeLookupTask.h

@@ -173,6 +173,14 @@ public:
   void onReceived(const ResponseMessage* message)
   {
     --inFlightMessage_;
+    // Replace old Node ID with new Node ID.
+    for(std::deque<SharedHandle<DHTNodeLookupEntry> >::iterator i =
+          entries_.begin(), eoi = entries_.end(); i != eoi; ++i) {
+      if((*i)->node->getIPAddress() == message->getRemoteNode()->getIPAddress()
+         && (*i)->node->getPort() == message->getRemoteNode()->getPort()) {
+        (*i)->node = message->getRemoteNode();
+      }
+    }
     onReceivedInternal(message);
     std::vector<SharedHandle<DHTNode> > nodes;
     getNodesFromMessage(nodes, message);

+ 18 - 10
src/DHTPeerLookupTask.cc

@@ -102,17 +102,25 @@ void DHTPeerLookupTask::onFinish()
   size_t num = DHTBucket::K;
   for(std::deque<SharedHandle<DHTNodeLookupEntry> >::const_iterator i =
         getEntries().begin(), eoi = getEntries().end();
-      i != eoi && num > 0; ++i, --num) {
-    if((*i)->used) {
-      const SharedHandle<DHTNode>& node = (*i)->node;
-      SharedHandle<DHTMessage> m = 
-        getMessageFactory()->createAnnouncePeerMessage
-        (node,
-         getTargetID(), // this is infoHash
-         btRuntime_->getListenPort(),
-         tokenStorage_[util::toHex(node->getID(), DHT_ID_LENGTH)]);
-      getMessageDispatcher()->addMessageToQueue(m);
+      i != eoi && num > 0; ++i) {
+    if(!(*i)->used) {
+      continue;
     }
+    const SharedHandle<DHTNode>& node = (*i)->node;
+    std::string idHex = util::toHex(node->getID(), DHT_ID_LENGTH);
+    std::string token = tokenStorage_[idHex];
+    if(token.empty()) {
+      A2_LOG_DEBUG(fmt("Token is empty for ID:%s", idHex.c_str()));
+      continue;
+    }
+    SharedHandle<DHTMessage> m =
+      getMessageFactory()->createAnnouncePeerMessage
+      (node,
+       getTargetID(), // this is infoHash
+       btRuntime_->getListenPort(),
+       token);
+    getMessageDispatcher()->addMessageToQueue(m);
+    --num;
   }
 }