server: include question section in response
This commit is contained in:
parent
af91ce2ef1
commit
70e7895aa2
|
@ -1,6 +1,6 @@
|
||||||
use crate::client::*;
|
use crate::client::*;
|
||||||
use async_static::async_static;
|
use async_static::async_static;
|
||||||
use domain::base::iana::Rcode;
|
use domain::base::iana::{Opcode, Rcode};
|
||||||
use domain::base::message::Message;
|
use domain::base::message::Message;
|
||||||
use domain::base::message_builder::MessageBuilder;
|
use domain::base::message_builder::MessageBuilder;
|
||||||
use domain::base::question::Question;
|
use domain::base::question::Question;
|
||||||
|
@ -76,14 +76,15 @@ impl Server {
|
||||||
let questions = err_response!(Self::extract_questions(body));
|
let questions = err_response!(Self::extract_questions(body));
|
||||||
let records = err_response!(
|
let records = err_response!(
|
||||||
self.client
|
self.client
|
||||||
.query_with_retry(questions, self.options.retries)
|
.query_with_retry(questions.clone(), self.options.retries)
|
||||||
.await
|
.await
|
||||||
);
|
);
|
||||||
let resp_format = Self::get_response_format(&req);
|
let resp_format = Self::get_response_format(&req);
|
||||||
|
|
||||||
let mut resp_body = err_response!(match &resp_format {
|
let mut resp_body = err_response!(match &resp_format {
|
||||||
&DnsResponseFormat::WireFormat =>
|
&DnsResponseFormat::WireFormat =>
|
||||||
Self::build_answer_wireformat(query_id, records).map(|x| x.as_slice().to_owned()),
|
Self::build_answer_wireformat(query_id, questions, records)
|
||||||
|
.map(|x| x.as_slice().to_owned()),
|
||||||
&DnsResponseFormat::JsonFormat => Err("JSON is not supported yet".to_string()),
|
&DnsResponseFormat::JsonFormat => Err("JSON is not supported yet".to_string()),
|
||||||
});
|
});
|
||||||
let resp_content_type = match resp_format {
|
let resp_content_type = match resp_format {
|
||||||
|
@ -188,12 +189,14 @@ impl Server {
|
||||||
|
|
||||||
fn build_answer_wireformat(
|
fn build_answer_wireformat(
|
||||||
id: u16,
|
id: u16,
|
||||||
|
questions: Vec<Question<Dname<Vec<u8>>>>,
|
||||||
records: Vec<Record<Dname<Vec<u8>>, UnknownRecordData<Vec<u8>>>>,
|
records: Vec<Record<Dname<Vec<u8>>, UnknownRecordData<Vec<u8>>>>,
|
||||||
) -> Result<Message<Vec<u8>>, String> {
|
) -> Result<Message<Vec<u8>>, String> {
|
||||||
let mut message_builder = MessageBuilder::new_vec();
|
let mut message_builder = MessageBuilder::new_vec();
|
||||||
// Set up the response header
|
// Set up the response header
|
||||||
let header = message_builder.header_mut();
|
let header = message_builder.header_mut();
|
||||||
header.set_id(id);
|
header.set_id(id);
|
||||||
|
header.set_opcode(Opcode::Query);
|
||||||
header.set_qr(true); // Query Response = true
|
header.set_qr(true); // Query Response = true
|
||||||
header.set_aa(false); // Not Authoritative
|
header.set_aa(false); // Not Authoritative
|
||||||
header.set_ra(true); // Recursion Available
|
header.set_ra(true); // Recursion Available
|
||||||
|
@ -202,8 +205,17 @@ impl Server {
|
||||||
header.set_rcode(Rcode::NXDomain);
|
header.set_rcode(Rcode::NXDomain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set up the questions section
|
||||||
|
// (the DNS response should include the original questions)
|
||||||
|
let mut question_builder = message_builder.question();
|
||||||
|
for q in questions {
|
||||||
|
question_builder
|
||||||
|
.push(q)
|
||||||
|
.map_err(|_| "Max question size exceeded".to_string())?;
|
||||||
|
}
|
||||||
|
|
||||||
// Set up the answer section
|
// Set up the answer section
|
||||||
let mut answer_builder = message_builder.answer();
|
let mut answer_builder = question_builder.answer();
|
||||||
for r in records {
|
for r in records {
|
||||||
answer_builder
|
answer_builder
|
||||||
.push(r)
|
.push(r)
|
||||||
|
|
Loading…
Reference in a new issue