blob: 88c6a03b84ff759819ae973ae7b7a92b2546b3b1 [file] [log] [blame]
// Copyright 2013 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 CLOUD_PRINT_GCP20_PROTOTYPE_DNS_PACKET_PARSER_H_
#define CLOUD_PRINT_GCP20_PROTOTYPE_DNS_PACKET_PARSER_H_
#include <string>
#include "net/dns/dns_protocol.h"
#include "net/dns/dns_response.h"
// Parsed response record.
struct DnsQueryRecord {
DnsQueryRecord() : qtype(0), qclass(0) {}
~DnsQueryRecord() {}
std::string qname; // in dotted form
uint16 qtype;
uint16 qclass;
};
// Iterator to walk over records of the DNS response packet. Encapsulates
// |DnsRecordParser| object for using its functionality.
class DnsPacketParser {
public:
// Constructs an iterator to process the |packet| of given |length|.
DnsPacketParser(const char* packet, size_t length);
// Destroys the object.
~DnsPacketParser() {}
bool IsValid() const { return record_parser_.IsValid() && is_header_read_; }
// Returns |true| if no more bytes remain in the packet.
bool AtEnd() const { return record_parser_.AtEnd(); }
// Returns header of DNS packet.
const net::dns_protocol::Header& header() const { return header_; }
// Parses the next query record into |record|. Returns true if succeeded.
bool ReadRecord(DnsQueryRecord* record);
// Parses the next resource record into |record|. Returns true if succeeded.
bool ReadRecord(net::DnsResourceRecord* record) {
return record_parser_.ReadRecord(record);
}
private:
// Returns current offset into the packet.
size_t GetOffset() const { return record_parser_.GetOffset(); }
// Parses a (possibly compressed) DNS name from the packet starting at
// |pos|. Stores output (even partial) in |out| unless |out| is NULL. |out|
// is stored in the dotted form, e.g., "example.com". Returns number of bytes
// consumed or 0 on failure.
// This is exposed to allow parsing compressed names within RRDATA for TYPEs
// such as NS, CNAME, PTR, MX, SOA.
// See RFC 1035 section 4.1.4.
unsigned ReadName(std::string* out) const {
return record_parser_.ReadName(packet_ + GetOffset(), out);
}
const char* packet_;
size_t length_;
// Contents parsed header_;
net::dns_protocol::Header header_;
bool is_header_read_;
// Encapsulated parser.
net::DnsRecordParser record_parser_;
DISALLOW_COPY_AND_ASSIGN(DnsPacketParser);
};
#endif // CLOUD_PRINT_GCP20_PROTOTYPE_DNS_PACKET_PARSER_H_