4
0
Эх сурвалжийг харах

Limit code to supporting one query per request

The dns crate technically allowed more than one query per request, as that's what's supported by the DNS spec, but in practice, only one is sent, and there are no plans to add an option to send more. So the singleton vector has been inlined.

Doing this also removed a cast from usize to u16.
Benjamin Sago 4 жил өмнө
parent
commit
4387461586

+ 1 - 1
dns-transport/src/auto.rs

@@ -23,7 +23,7 @@ use super::{Transport, Error, UdpTransport, TcpTransport};
 /// let request = Request {
 ///     transaction_id: 0xABCD,
 ///     flags: Flags::query(),
-///     queries: vec![ query ],
+///     query: query,
 ///     additional: None,
 /// };
 ///

+ 1 - 1
dns-transport/src/https.rs

@@ -26,7 +26,7 @@ use super::{Transport, Error};
 /// let request = Request {
 ///     transaction_id: 0xABCD,
 ///     flags: Flags::query(),
-///     queries: vec![ query ],
+///     query: query,
 ///     additional: None,
 /// };
 ///

+ 1 - 1
dns-transport/src/tcp.rs

@@ -24,7 +24,7 @@ use super::{Transport, Error};
 /// let request = Request {
 ///     transaction_id: 0xABCD,
 ///     flags: Flags::query(),
-///     queries: vec![ query ],
+///     query: query,
 ///     additional: None,
 /// };
 ///

+ 1 - 1
dns-transport/src/tls.rs

@@ -25,7 +25,7 @@ use super::{Transport, Error};
 /// let request = Request {
 ///     transaction_id: 0xABCD,
 ///     flags: Flags::query(),
-///     queries: vec![ query ],
+///     query: query,
 ///     additional: None,
 /// };
 ///

+ 1 - 1
dns-transport/src/udp.rs

@@ -25,7 +25,7 @@ use super::{Transport, Error};
 /// let request = Request {
 ///     transaction_id: 0xABCD,
 ///     flags: Flags::query(),
-///     queries: vec![ query ],
+///     query: query,
 ///     additional: None,
 /// };
 ///

+ 4 - 2
dns/src/types.rs

@@ -17,8 +17,10 @@ pub struct Request {
     /// The flags that accompany every DNS packet.
     pub flags: Flags,
 
-    /// The queries that this request is making.
-    pub queries: Vec<Query>,
+    /// The query that this request is making. Only one query is allowed per
+    /// request, as traditionally, DNS servers only respond to the first query
+    /// in a packet.
+    pub query: Query,
 
     /// An additional record that may be sent as part of the query.
     pub additional: Option<OPT>,

+ 8 - 10
dns/src/wire.rs

@@ -20,16 +20,14 @@ impl Request {
         bytes.write_u16::<BigEndian>(self.transaction_id)?;
         bytes.write_u16::<BigEndian>(self.flags.to_u16())?;
 
-        bytes.write_u16::<BigEndian>(self.queries.len() as u16)?;
-        bytes.write_u16::<BigEndian>(0)?;  // usually answers
-        bytes.write_u16::<BigEndian>(0)?;  // usually authority RRs
-        bytes.write_u16::<BigEndian>(if self.additional.is_some() { 1 } else { 0 })?;  // additional RRs
-
-        for query in &self.queries {
-            bytes.write_labels(&query.qname)?;
-            bytes.write_u16::<BigEndian>(query.qtype)?;
-            bytes.write_u16::<BigEndian>(query.qclass.to_u16())?;
-        }
+        bytes.write_u16::<BigEndian>(1)?;  // query count
+        bytes.write_u16::<BigEndian>(0)?;  // answer count
+        bytes.write_u16::<BigEndian>(0)?;  // authority RR count
+        bytes.write_u16::<BigEndian>(if self.additional.is_some() { 1 } else { 0 })?;  // additional RR count
+
+        bytes.write_labels(&self.query.qname)?;
+        bytes.write_u16::<BigEndian>(self.query.qtype)?;
+        bytes.write_u16::<BigEndian>(self.query.qclass.to_u16())?;
 
         if let Some(opt) = &self.additional {
             bytes.write_u8(0)?;  // usually a name

+ 2 - 5
src/requests.rs

@@ -93,11 +93,8 @@ impl RequestGenerator {
                                 additional = Some(dns::Request::additional_record());
                             }
 
-                            let queries = vec![
-                                dns::Query { qname: domain.clone(), qtype, qclass },
-                            ];
-
-                            let request = dns::Request { transaction_id, flags, queries, additional };
+                            let query = dns::Query { qname: domain.clone(), qtype, qclass };
+                            let request = dns::Request { transaction_id, flags, query, additional };
 
                             let transport = transport_type.make_transport(nameserver.clone());
                             requests.push((request, transport));