it.
#include <dns/edns.h>
#include <dns/exceptions.h>
-#include <dns/messagerenderer.h>
+#include <dns/messagerendererhandle.h>
#include <dns/name.h>
#include <dns/question.h>
#include <dns/opcode.h>
IOService io_service_;
- MessageRenderer renderer_;
-
+ MessageRendererHandle renderer_handle_;
/// Currently non-configurable, but will be.
static const uint16_t DEFAULT_LOCAL_UDPSIZE = 4096;
return (true);
}
- renderer_.setBuffer(buffer.get());
+ renderer_handle_.setBuffer(buffer.get());
const bool udp_buffer =
(io_message.getSocket().getProtocol() == IPPROTO_UDP);
- renderer_.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
+ renderer_handle_.setLengthLimit(udp_buffer ? remote_bufsize : 65535);
if (tsig_context.get() != NULL) {
- message->toWire(renderer_, *tsig_context);
+ message->toWire(renderer_handle_.getRenderer(), *tsig_context);
} else {
- message->toWire(renderer_);
+ message->toWire(renderer_handle_.getRenderer());
}
- renderer_.setBuffer(NULL);
+ renderer_handle_.setBuffer(NULL);
LOG_DEBUG(auth_logger, DBG_AUTH_MESSAGES, AUTH_SEND_NORMAL_RESPONSE)
- .arg(renderer_.getLength()).arg(message->toText());
+ .arg(renderer_handle_.getLength()).arg(message->toText());
return (true);
}
message->setHeaderFlag(Message::HEADERFLAG_AA);
message->setRcode(Rcode::NOERROR());
- renderer_.setBuffer(buffer.get());
+ renderer_handle_.setBuffer(buffer.get());
if (tsig_context.get() != NULL) {
- message->toWire(renderer_, *tsig_context);
+ message->toWire(renderer_handle_.getRenderer(), *tsig_context);
} else {
- message->toWire(renderer_);
+ message->toWire(renderer_handle_.getRenderer());
}
- renderer_.setBuffer(NULL);
+ renderer_handle_.setBuffer(NULL);
return (true);
}
}
}
}
+
IOService ios_;
DNSService dnss_;
MockSession statistics_session;
"Released tokens");
}
+TEST_F(AuthSrvTest, processNormalQuery_reuseRenderer1) {
+ UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+ default_qid, Name("example.com"),
+ RRClass::IN(), RRType::NS());
+
+ request_message.setHeaderFlag(Message::HEADERFLAG_AA);
+ createRequestPacket(request_message, IPPROTO_UDP);
+ server.processMessage(*io_message, parse_message, response_obuffer, &dnsserv);
+ EXPECT_NE(request_message.getRcode(), parse_message->getRcode());
+}
+
+TEST_F(AuthSrvTest, processNormalQuery_reuseRenderer2) {
+ UnitTestUtil::createRequestMessage(request_message, Opcode::QUERY(),
+ default_qid, Name("example.com"),
+ RRClass::IN(), RRType::SOA());
+
+ request_message.setHeaderFlag(Message::HEADERFLAG_AA);
+ createRequestPacket(request_message, IPPROTO_UDP);
+ server.processMessage(*io_message, parse_message, response_obuffer, &dnsserv);
+ ConstQuestionPtr question = *parse_message->beginQuestion();
+ EXPECT_STRNE(question->getType().toText().c_str(),RRType::NS().toText().c_str());
+}
+
}
--- /dev/null
+// Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
+//
+// Permission to use, copy, modify, and/or distribute this software for any
+// purpose with or without fee is hereby granted, provided that the above
+// copyright notice and this permission notice appear in all copies.
+//
+// THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+// AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+// OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+// PERFORMANCE OF THIS SOFTWARE.
+
+#ifndef __MESSAGERENDERERHANDLE_H
+#define __MESSAGERENDERERHANDLE_H 1
+
+#include <dns/messagerenderer.h>
+
+namespace isc {
+
+namespace dns {
+
+/// The \c MessageRendererHandle is a handle class for
+/// \c MessageRendere.
+///
+/// A \c MessageRendererHandle object is constructed with a \c MessageRenderer
+/// object.
+class MessageRendererHandle {
+ ///
+ /// \name Constructors, Assignment Operator and Destructor.
+ ///
+ /// Note: The copy constructor and the assignment operator are
+ /// intentionally defined as private.
+ //@{
+private:
+ MessageRendererHandle(const MessageRendererHandle& renderer);
+ MessageRendererHandle& operator=(const MessageRendererHandle& renderer);
+public:
+ /// The constructor.
+ ///
+ /// \param use_cache Whether to enable hot spot cache for lookup results.
+ /// \param xfrout_client Communication interface with a separate xfrout
+ /// process. It's normally a reference to an xfr::XfroutClient object,
+ /// but can refer to a local mock object for te
+ explicit MessageRendererHandle():renderer_(NULL){
+ renderer_ = new MessageRenderer();
+ }
+ ~MessageRendererHandle() {
+ if(NULL != renderer_) {
+ delete renderer_;
+ renderer_ = NULL;
+ }
+ }
+ //@}
+public:
+ /// \brief Return the length of data written in the internal buffer.
+ size_t getLength() const {
+ return (renderer_->getLength());
+ }
+ /// \brief Set the buffer.
+ void setBuffer(isc::util::OutputBuffer* buffer) {
+ renderer_->setBuffer(buffer);
+ }
+ MessageRenderer& getRenderer() const {
+ return *renderer_;
+ }
+ /// \brief Set the maximum length of rendered data that can fit in the
+ /// corresponding DNS message without truncation.
+ ///
+ /// \param len The maximum length in bytes.
+ void setLengthLimit(size_t len) {
+ renderer_->setLengthLimit(len);
+ }
+private:
+ MessageRenderer * renderer_;
+};
+}
+}
+#endif // __MESSAGERENDERERHANDLE_H
+
+// Local Variables:
+// mode: c++
+// End: