Struct dns_parser::Builder [] [src]

pub struct Builder {
    buf: Vec<u8>,
    labels: HashMap<String, u16>,
}

Allows to build a DNS packet

Both query and answer packets may be built with this interface, although, much of functionality is not implemented yet.

Fields

buf
labels

Methods

impl Builder

fn new_query(id: u16, recursion: bool) -> Builder

Creates a new query

Initially all sections are empty. You're expected to fill the questions section with add_question

fn new_response(id: u16, rc: ResponseCode, tc: bool, rd: bool, ra: bool) -> Builder

Creates a new response

Similar to new_query, all sections are empty. You will need to add all your questions first, then add your answers.

fn add_question(&mut self, qname: &str, qtype: QueryType, qclass: QueryClass) -> &mut Builder

Adds a question to the packet

Panics

  • Answers, nameservers or additional section has already been written
  • There are already 65535 questions in the buffer.
  • When name is invalid

fn add_answer(&mut self, aname: &str, atype: Type, aclass: Class, ttl: u32, data: Vec<u8>) -> &mut Builder

Adds an answer to the packet

NOTE: You need to add all you questions first before adding answers.

Panics

  • There are too many answers in the buffer.
  • When name is invalid

fn write_name(&mut self, name: &str)

fn build(self) -> Result<Vec<u8>, Vec<u8>>

Returns the final packet

When packet is not truncated method returns Ok(packet). If packet is truncated the method returns Err(packet). In both cases the packet is fully valid.

In the server implementation you may use x.build().unwrap_or_else(|x| x).

In the client implementation it's probably unwise to send truncated packet, as it doesn't make sense. Even panicking may be more appropriate.