// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_BASE_DNS_QUERY_H_ #define NET_BASE_DNS_QUERY_H_ #pragma once #include #include "net/base/io_buffer.h" #include "net/base/net_api.h" #include "net/base/net_util.h" #include "net/base/rand_callback.h" namespace net { // Represents on-the-wire DNS query message as an object. class NET_TEST DnsQuery { public: // Constructs a query message from |qname| which *MUST* be in a valid // DNS name format, and |qtype| which must be either kDNS_A or kDNS_AAAA. // Every generated object has a random ID, hence two objects generated // with the same set of constructor arguments are generally not equal; // there is a 1/2^16 chance of them being equal due to size of |id_|. DnsQuery(const std::string& qname, uint16 qtype, const RandIntCallback& rand_int_cb); ~DnsQuery(); // Clones |this| verbatim, with ID field of the header regenerated. DnsQuery* CloneWithNewId() const; // DnsQuery field accessors. uint16 id() const; uint16 qtype() const; // Returns the size of the Question section of the query. Used when // matching the response. size_t question_size() const; // Returns pointer to the Question section of the query. Used when // matching the response. const char* question_data() const; // IOBuffer accessor to be used for writing out the query. IOBufferWithSize* io_buffer() const { return io_buffer_; } private: const std::string qname() const; // Randomizes ID field of the query message. void RandomizeId(); // Size of the DNS name (*NOT* hostname) we are trying to resolve; used // to calculate offsets. size_t qname_size_; // Contains query bytes to be consumed by higher level Write() call. scoped_refptr io_buffer_; // PRNG function for generating IDs. RandIntCallback rand_int_cb_; DISALLOW_COPY_AND_ASSIGN(DnsQuery); }; } // namespace net #endif // NET_BASE_DNS_QUERY_H_