write question
This commit is contained in:
parent
59a7253483
commit
ab8ba848a4
54
src/main.rs
54
src/main.rs
|
@ -27,6 +27,11 @@ fn main() {
|
||||||
authority_records: 0,
|
authority_records: 0,
|
||||||
additional_records: 0,
|
additional_records: 0,
|
||||||
},
|
},
|
||||||
|
questions: vec![Question {
|
||||||
|
name: "codecrafters.io".into(),
|
||||||
|
q_type: 1,
|
||||||
|
class: 1,
|
||||||
|
}],
|
||||||
};
|
};
|
||||||
|
|
||||||
packet.write_to(&mut response);
|
packet.write_to(&mut response);
|
||||||
|
@ -45,6 +50,7 @@ fn main() {
|
||||||
|
|
||||||
struct Packet {
|
struct Packet {
|
||||||
header: Header,
|
header: Header,
|
||||||
|
questions: Vec<Question>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Header {
|
struct Header {
|
||||||
|
@ -63,15 +69,61 @@ struct Header {
|
||||||
additional_records: u16,
|
additional_records: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct Question {
|
||||||
|
name: Qname,
|
||||||
|
q_type: u16,
|
||||||
|
class: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Question {
|
||||||
|
pub fn parse(data: &[u8]) -> Result<Self, &'static str> {
|
||||||
|
Err("invalid")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn write_to(self, buf: &mut Vec<u8>) {
|
||||||
|
self.name.write_to(buf);
|
||||||
|
buf.extend(self.q_type.to_be_bytes());
|
||||||
|
buf.extend(self.class.to_be_bytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Qname(Vec<(u8, String)>);
|
||||||
|
|
||||||
|
impl Qname {
|
||||||
|
pub fn write_to(&self, buf: &mut Vec<u8>) {
|
||||||
|
for (i, v) in &self.0 {
|
||||||
|
buf.push(*i);
|
||||||
|
buf.extend(v.bytes());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&str> for Qname {
|
||||||
|
fn from(value: &str) -> Self {
|
||||||
|
let mut output = vec![];
|
||||||
|
|
||||||
|
for label in value.split('.') {
|
||||||
|
output.push((label.len() as u8, label.to_string()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Qname(output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Packet {
|
impl Packet {
|
||||||
pub fn parse(data: &[u8]) -> Result<Self, &'static str> {
|
pub fn parse(data: &[u8]) -> Result<Self, &'static str> {
|
||||||
let header = Header::parse(&data[..12])?;
|
let header = Header::parse(&data[..12])?;
|
||||||
|
let questions = vec![Question::parse(&data[12..])?]; // TODO: need some thing better here
|
||||||
|
|
||||||
Ok(Self { header })
|
Ok(Self { header, questions })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_to(self, buf: &mut Vec<u8>) {
|
pub fn write_to(self, buf: &mut Vec<u8>) {
|
||||||
self.header.write_to(buf);
|
self.header.write_to(buf);
|
||||||
|
|
||||||
|
for question in self.questions {
|
||||||
|
question.write_to(buf);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user