return (".");
}
-typedef std::vector<std::pair<std::string, uint16_t> > AddressVector;
-
// Here we do not use the typedef above, as the SunStudio compiler
// mishandles this in its name mangling, and wouldn't compile.
// We can probably use a typedef, but need to move it to a central
}
};
-class ForwardQuery : public IOFetch::Callback {
+}
+
+class ForwardQuery::ForwardQueryImpl : public IOFetch::Callback {
private:
// The io service to handle async calls
IOService& io_;
}
public:
- ForwardQuery(IOService& io,
+ ForwardQueryImpl(IOService& io,
ConstMessagePtr query_message,
MessagePtr answer_message,
boost::shared_ptr<AddressVector> upstream,
lookup_timer.expires_from_now(
boost::posix_time::milliseconds(lookup_timeout));
++outstanding_events_;
- lookup_timer.async_wait(boost::bind(&ForwardQuery::lookupTimeout, this));
+ lookup_timer.async_wait(boost::bind(&ForwardQueryImpl::lookupTimeout, this));
}
// Setup the timer to send an answer (client_timeout)
client_timer.expires_from_now(
boost::posix_time::milliseconds(client_timeout));
++outstanding_events_;
- client_timer.async_wait(boost::bind(&ForwardQuery::clientTimeout, this));
+ client_timer.async_wait(boost::bind(&ForwardQueryImpl::clientTimeout, this));
}
send();
}
};
-}
-
void
RecursiveQuery::resolve(const QuestionPtr& question,
const isc::resolve::ResolverInterface::CallbackPtr callback)
}
}
-void
+ForwardQuery*
RecursiveQuery::forward(ConstMessagePtr query_message,
MessagePtr answer_message,
OutputBufferPtr buffer,
// everything throught without interpretation, except
// QID, port number. The response will not be cached.
// It will delete itself when it is done
- new ForwardQuery(io, query_message, answer_message,
- upstream_, buffer, callback, query_timeout_,
- client_timeout_, lookup_timeout_);
+ return new ForwardQuery(io, query_message, answer_message,
+ upstream_, buffer, callback, query_timeout_,
+ client_timeout_, lookup_timeout_);
+}
+
+ForwardQuery::ForwardQuery(IOService& io,
+ ConstMessagePtr query_message,
+ MessagePtr answer_message,
+ boost::shared_ptr<AddressVector> upstream,
+ OutputBufferPtr buffer,
+ isc::resolve::ResolverInterface::CallbackPtr cb,
+ int query_timeout, int client_timeout, int lookup_timeout) {
+ fqi_ = new ForwardQueryImpl(io, query_message, answer_message, upstream, buffer, cb, query_timeout, client_timeout, lookup_timeout);
+}
+
+ForwardQuery::~ForwardQuery() {
+ delete fqi_;
}
} // namespace asiodns
std::vector<uint32_t> rtt_; ///< Stored round-trip times
};
+typedef std::vector<std::pair<std::string, uint16_t> > AddressVector;
+
+class ForwardQuery {
+private:
+ class ForwardQueryImpl;
+ ForwardQueryImpl* fqi_;
+public:
+ ForwardQuery(isc::asiolink::IOService& io,
+ isc::dns::ConstMessagePtr query_message,
+ isc::dns::MessagePtr answer_message,
+ boost::shared_ptr<AddressVector> upstream,
+ isc::util::OutputBufferPtr buffer,
+ isc::resolve::ResolverInterface::CallbackPtr cb,
+ int query_timeout, int client_timeout, int lookup_timeout);
+ ~ForwardQuery();
+};
/// \brief Recursive Query
///
/// \param server Server object that handles receipt and processing of the
/// received messages.
/// \param callback callback object
- void forward(isc::dns::ConstMessagePtr query_message,
+ ForwardQuery* forward(isc::dns::ConstMessagePtr query_message,
isc::dns::MessagePtr answer_message,
isc::util::OutputBufferPtr buffer,
DNSServer* server,
singleAddress(TEST_IPV4_ADDR, port));
Question q(Name("example.com"), RRClass::IN(), RRType::TXT());
- Message query_message(Message::RENDER);
- isc::resolve::initResponseMessage(q, query_message);
+ MessagePtr query_message(new Message(Message::RENDER));
+ isc::resolve::initResponseMessage(q, *query_message);
OutputBufferPtr buffer(new OutputBuffer(0));
MessagePtr answer(new Message(Message::RENDER));
- rq.forward(ConstMessagePtr(&query_message), answer, buffer, &server);
+ ForwardQuery* fq = rq.forward(query_message, answer, buffer, &server);
char data[4096];
size_t size = sizeof(data);
EXPECT_EQ(q.getName(), q2->getName());
EXPECT_EQ(q.getType(), q2->getType());
EXPECT_EQ(q.getClass(), q2->getClass());
+
+ delete fq;
}
int
Question question(Name("example.net"), RRClass::IN(), RRType::A());
OutputBufferPtr buffer(new OutputBuffer(0));
MessagePtr answer(new Message(Message::RENDER));
- Message query_message(Message::RENDER);
- isc::resolve::initResponseMessage(question, query_message);
+ MessagePtr query_message(new Message(Message::RENDER));
+ isc::resolve::initResponseMessage(question, *query_message);
boost::shared_ptr<MockResolverCallback> callback(new MockResolverCallback(&server));
- query.forward(ConstMessagePtr(&query_message), answer, buffer, &server, callback);
+ ForwardQuery* fq = query.forward(query_message, answer, buffer, &server, callback);
// Run the test
io_service_.run();
EXPECT_EQ(callback->result, MockResolverCallback::FAILURE);
+ delete fq;
}
// If we set client timeout to lower than querytimeout, we should
1000, 10, 4000, 4);
Question q(Name("example.net"), RRClass::IN(), RRType::A());
OutputBufferPtr buffer(new OutputBuffer(0));
- Message query_message(Message::RENDER);
- isc::resolve::initResponseMessage(q, query_message);
+ MessagePtr query_message(new Message(Message::RENDER));
+ isc::resolve::initResponseMessage(q, *query_message);
boost::shared_ptr<MockResolverCallback> callback(new MockResolverCallback(&server));
- query.forward(ConstMessagePtr(&query_message), answer, buffer, &server, callback);
+ ForwardQuery* fq = query.forward(query_message, answer, buffer, &server, callback);
// Run the test
io_service_.run();
EXPECT_EQ(callback->result, MockResolverCallback::FAILURE);
+ delete fq;
}
// If we set lookup timeout to lower than querytimeout, the lookup
Question question(Name("example.net"), RRClass::IN(), RRType::A());
OutputBufferPtr buffer(new OutputBuffer(0));
- Message query_message(Message::RENDER);
- isc::resolve::initResponseMessage(question, query_message);
+ //Message query_message(Message::RENDER);
+ MessagePtr query_message(new Message(Message::RENDER));
+ isc::resolve::initResponseMessage(question, *query_message);
boost::shared_ptr<MockResolverCallback> callback(new MockResolverCallback(&server));
- query.forward(ConstMessagePtr(&query_message), answer, buffer, &server, callback);
+ ForwardQuery* fq = query.forward(query_message, answer, buffer, &server, callback);
// Run the test
io_service_.run();
EXPECT_EQ(callback->result, MockResolverCallback::FAILURE);
+ delete fq;
+ std::cout << "[XX] DONE" << std::endl;
}
// Set everything very low and see if this doesn't cause weird
Question question(Name("example.net"), RRClass::IN(), RRType::A());
OutputBufferPtr buffer(new OutputBuffer(0));
- Message query_message(Message::RENDER);
- isc::resolve::initResponseMessage(question, query_message);
+ MessagePtr query_message(new Message(Message::RENDER));
+ isc::resolve::initResponseMessage(question, *query_message);
boost::shared_ptr<MockResolverCallback> callback(new MockResolverCallback(&server));
- query.forward(ConstMessagePtr(&query_message), answer, buffer, &server, callback);
+ ForwardQuery* fq = query.forward(query_message, answer, buffer, &server, callback);
// Run the test
io_service_.run();
EXPECT_EQ(callback->result, MockResolverCallback::FAILURE);
+ delete fq;
}
// as mentioned above, we need a more better framework for this,