mirror of https://github.com/aria2/aria2
2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Adding handling of DHT error message. Just log error message and throw exception. * src/DHTMessageFactoryImpl.cc * test/DHTMessageFactoryImplTest.ccpull/1/head
parent
34e6a1dc9a
commit
413cbe192b
|
@ -1,3 +1,10 @@
|
|||
2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Adding handling of DHT error message. Just log error message and
|
||||
throw exception.
|
||||
* src/DHTMessageFactoryImpl.cc
|
||||
* test/DHTMessageFactoryImplTest.cc
|
||||
|
||||
2008-02-11 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||
|
||||
Added handling of dynamic cast failure.
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
#include "BtRuntime.h"
|
||||
#include "Util.h"
|
||||
#include "Peer.h"
|
||||
#include "Logger.h"
|
||||
#include <cstring>
|
||||
#include <utility>
|
||||
|
||||
|
@ -99,6 +100,17 @@ static const Data* getData(const Dictionary* d, const std::string& key)
|
|||
}
|
||||
}
|
||||
|
||||
static const Data* getData(const List* l, size_t index)
|
||||
{
|
||||
const Data* c = dynamic_cast<const Data*>(l->getList()[index]);
|
||||
if(c) {
|
||||
return c;
|
||||
} else {
|
||||
throw new DlAbortEx("Malformed DHT message. element[%u] is not Data.",
|
||||
index);
|
||||
}
|
||||
}
|
||||
|
||||
static const List* getList(const Dictionary* d, const std::string& key)
|
||||
{
|
||||
const List* l = dynamic_cast<const List*>(d->get(key));
|
||||
|
@ -187,12 +199,22 @@ SharedHandle<DHTMessage> DHTMessageFactoryImpl::createResponseMessage(const std:
|
|||
{
|
||||
const Data* t = getData(d, "t");
|
||||
const Data* y = getData(d, "y");
|
||||
const Dictionary* r = getDictionary(d, "r");
|
||||
// TODO handle y == "e" case
|
||||
if(y->toString() != "r") {
|
||||
if(y->toString() == "e") {
|
||||
// for now, just report error message arrived and throw exception.
|
||||
const List* e = getList(d, "e");
|
||||
if(e->getList().size() == 2) {
|
||||
_logger->info("Received Error DHT message. code=%s, msg=%s",
|
||||
Util::urlencode(getData(e, 0)->toString()).c_str(),
|
||||
Util::urlencode(getData(e, 1)->toString()).c_str());
|
||||
} else {
|
||||
_logger->debug("e doesn't have 2 elements.");
|
||||
}
|
||||
throw new DlAbortEx("Received Error DHT message.");
|
||||
} else if(y->toString() != "r") {
|
||||
throw new DlAbortEx("Malformed DHT message. y != r: y=%s",
|
||||
Util::urlencode(y->toString()).c_str());
|
||||
}
|
||||
const Dictionary* r = getDictionary(d, "r");
|
||||
const Data* id = getData(r, "id");
|
||||
validateID(id);
|
||||
validateIDMatch(remoteNode->getID(),
|
||||
|
|
|
@ -33,6 +33,7 @@ class DHTMessageFactoryImplTest:public CppUnit::TestFixture {
|
|||
CPPUNIT_TEST(testCreateGetPeersReplyMessage_values);
|
||||
CPPUNIT_TEST(testCreateAnnouncePeerMessage);
|
||||
CPPUNIT_TEST(testCreateAnnouncePeerReplyMessage);
|
||||
CPPUNIT_TEST(testReceivedErrorMessage);
|
||||
CPPUNIT_TEST_SUITE_END();
|
||||
public:
|
||||
DHTMessageFactoryImplTest():factory(0), routingTable(0), localNode(0) {}
|
||||
|
@ -72,6 +73,7 @@ public:
|
|||
void testCreateGetPeersReplyMessage_values();
|
||||
void testCreateAnnouncePeerMessage();
|
||||
void testCreateAnnouncePeerReplyMessage();
|
||||
void testReceivedErrorMessage();
|
||||
};
|
||||
|
||||
|
||||
|
@ -362,4 +364,26 @@ void DHTMessageFactoryImplTest::testCreateAnnouncePeerReplyMessage()
|
|||
Util::toHex(m->getTransactionID()));
|
||||
}
|
||||
|
||||
void DHTMessageFactoryImplTest::testReceivedErrorMessage()
|
||||
{
|
||||
SharedHandle<Dictionary> d = new Dictionary();
|
||||
d->put("t", new Data(transactionID, DHT_TRANSACTION_ID_LENGTH));
|
||||
d->put("y", new Data("e"));
|
||||
List* l = new List();
|
||||
l->add(new Data("404"));
|
||||
l->add(new Data("Not found"));
|
||||
d->put("e", l);
|
||||
|
||||
SharedHandle<DHTNode> remoteNode = new DHTNode(remoteNodeID);
|
||||
remoteNode->setIPAddress("192.168.0.1");
|
||||
remoteNode->setPort(6881);
|
||||
|
||||
try {
|
||||
factory->createResponseMessage("announce_peer", d.get(), remoteNode);
|
||||
CPPUNIT_FAIL("exception must be thrown.");
|
||||
} catch(RecoverableException* e) {
|
||||
std::cerr << *e << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace aria2
|
||||
|
|
Loading…
Reference in New Issue