Index: net/base/dns_query.cc |
diff --git a/net/base/dns_query.cc b/net/base/dns_query.cc |
index ba7915000966912778b6e3d0fb0d1829610dbfc0..cbc1e82dbc3a4b6e3d9138fce017821dbf45ba6b 100644 |
--- a/net/base/dns_query.cc |
+++ b/net/base/dns_query.cc |
@@ -7,7 +7,6 @@ |
#include <string> |
#include "base/rand_util.h" |
-#include "net/base/address_family.h" |
#include "net/base/dns_util.h" |
namespace net { |
@@ -19,16 +18,8 @@ void PackUint16BE(char buf[2], uint16 v) { |
buf[1] = v & 0xff; |
} |
-uint16 QTypeFromAddressFamily(AddressFamily address_family) { |
- switch (address_family) { |
- case ADDRESS_FAMILY_IPV4: |
- return kDNS_A; |
- case ADDRESS_FAMILY_IPV6: |
- return kDNS_AAAA; |
- default: |
- NOTREACHED() << "Bad address family"; |
- return kDNS_A; |
- } |
+uint16 UnpackUint16BE(char buf[2]) { |
+ return static_cast<uint8>(buf[0]) << 8 | static_cast<uint8>(buf[1]); |
} |
} // namespace |
@@ -42,70 +33,61 @@ uint16 QTypeFromAddressFamily(AddressFamily address_family) { |
// DnsQuery construction. |
static const char kHeader[] = {0x00, 0x00, 0x01, 0x00, 0x00, 0x01, |
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; |
-static const size_t kHeaderLen = arraysize(kHeader); |
+static const size_t kHeaderSize = arraysize(kHeader); |
-DnsQuery::DnsQuery(const std::string& hostname, |
- AddressFamily address_family, |
- int port) |
- : port_(port), |
- id_(0), |
- qtype_(QTypeFromAddressFamily(address_family)), |
- hostname_(hostname) { |
- std::string qname; |
- if (!net::DNSDomainFromDot(hostname, &qname)) |
- return; |
+DnsQuery::DnsQuery(const std::string& dns_name, uint16 qtype) |
+ : dns_name_size_(dns_name.size()) { |
+ DCHECK(DnsResponseBuffer(reinterpret_cast<const uint8*>(dns_name.c_str()), |
+ dns_name.size()).DNSName(NULL)); |
+ DCHECK(qtype == kDNS_A || qtype == kDNS_AAAA); |
- size_t query_size = kHeaderLen + qname.size() + |
- sizeof(qtype_) + sizeof(kClassIN); |
- |
- io_buffer_ = new IOBufferWithSize(query_size); |
+ io_buffer_ = new IOBufferWithSize(kHeaderSize + question_size()); |
int byte_offset = 0; |
char* buffer_head = io_buffer_->data(); |
- memcpy(&buffer_head[byte_offset], kHeader, kHeaderLen); |
- byte_offset += kHeaderLen; |
- memcpy(&buffer_head[byte_offset], &qname[0], qname.size()); |
- byte_offset += qname.size(); |
- PackUint16BE(&buffer_head[byte_offset], qtype_); |
- byte_offset += sizeof(qtype_); |
+ memcpy(&buffer_head[byte_offset], kHeader, kHeaderSize); |
+ byte_offset += kHeaderSize; |
+ memcpy(&buffer_head[byte_offset], &dns_name[0], dns_name_size_); |
+ byte_offset += dns_name_size_; |
+ PackUint16BE(&buffer_head[byte_offset], qtype); |
+ byte_offset += sizeof(qtype); |
PackUint16BE(&buffer_head[byte_offset], kClassIN); |
- |
- // Randomize ID, first two bytes. |
- id_ = base::RandUint64() & 0xffff; |
- PackUint16BE(&buffer_head[0], id_); |
+ RandomizeId(); |
} |
-DnsQuery::~DnsQuery() { |
+DnsQuery::DnsQuery(const DnsQuery& rhs) : dns_name_size_(rhs.dns_name_size_) { |
+ io_buffer_ = new IOBufferWithSize(rhs.io_buffer()->size()); |
+ memcpy(io_buffer_->data(), rhs.io_buffer()->data(), rhs.io_buffer()->size()); |
+ RandomizeId(); |
} |
-int DnsQuery::port() const { |
- DCHECK(IsValid()); |
- return port_; |
+DnsQuery::~DnsQuery() { |
} |
uint16 DnsQuery::id() const { |
- DCHECK(IsValid()); |
- return id_; |
+ return UnpackUint16BE(&io_buffer_->data()[0]); |
} |
uint16 DnsQuery::qtype() const { |
- DCHECK(IsValid()); |
- return qtype_; |
+ return UnpackUint16BE(&io_buffer_->data()[kHeaderSize + dns_name_size_]); |
+} |
+ |
+DnsQuery* DnsQuery::CloneWithNewId() const { |
+ return new DnsQuery(*this); |
} |
-AddressFamily DnsQuery::address_family() const { |
- DCHECK(IsValid()); |
- return address_family_; |
+size_t DnsQuery::question_size() const { |
+ return dns_name_size_ // QNAME |
+ + sizeof(uint16) // QTYPE |
+ + sizeof(uint16); // QCLASS |
} |
-const std::string& DnsQuery::hostname() const { |
- DCHECK(IsValid()); |
- return hostname_; |
+const char* DnsQuery::question_data() const { |
+ return &io_buffer_->data()[kHeaderSize]; |
} |
-IOBufferWithSize* DnsQuery::io_buffer() const { |
- DCHECK(IsValid()); |
- return io_buffer_.get(); |
+void DnsQuery::RandomizeId() { |
+ PackUint16BE(&io_buffer_->data()[0], base::RandUint64() & 0xffff); |
} |
} // namespace net |