hickory_server/server/
request_handler.rs1use std::net::SocketAddr;
11
12use bytes::Bytes;
13
14#[cfg(feature = "testing")]
15use crate::proto::serialize::binary::{BinEncodable, BinEncoder};
16use crate::{
17 net::{runtime::Time, xfer::Protocol},
18 proto::{
19 ProtoError,
20 op::{Header, HeaderCounts, LowerQuery, MessageType, Metadata, ResponseCode},
21 serialize::binary::{BinDecodable, BinDecoder},
22 },
23 server::ResponseHandler,
24 zone_handler::{LookupError, MessageRequest},
25};
26
27#[derive(Debug)]
29pub struct Request {
30 pub(crate) message: MessageRequest,
32 pub(super) raw: Bytes,
33 pub(super) src: SocketAddr,
35 pub(super) protocol: Protocol,
37}
38
39impl Request {
40 pub fn from_bytes(
42 raw: Vec<u8>,
43 src: SocketAddr,
44 protocol: Protocol,
45 ) -> Result<Self, ProtoError> {
46 let mut decoder = BinDecoder::new(&raw);
47 let header = Header::read(&mut decoder)?;
48 Ok(Self {
49 message: MessageRequest::read(&mut decoder, header)?,
50 raw: Bytes::from(raw),
51 src,
52 protocol,
53 })
54 }
55
56 #[cfg(feature = "testing")]
58 pub fn from_message(
59 message: MessageRequest,
60 src: SocketAddr,
61 protocol: Protocol,
62 ) -> Result<Self, ProtoError> {
63 let mut encoded = Vec::new();
64 let mut encoder = BinEncoder::new(&mut encoded);
65 message.emit(&mut encoder)?;
66
67 Ok(Self {
68 message,
69 raw: Bytes::from(encoded),
70 src,
71 protocol,
72 })
73 }
74
75 pub fn request_info(&self) -> Result<RequestInfo<'_>, LookupError> {
79 Ok(RequestInfo {
80 src: self.src,
81 protocol: self.protocol,
82 metadata: &self.message.metadata,
83 query: self.message.queries.try_as_query()?,
84 })
85 }
86
87 pub fn src(&self) -> SocketAddr {
89 self.src
90 }
91
92 pub fn protocol(&self) -> Protocol {
94 self.protocol
95 }
96
97 pub fn as_slice(&self) -> &[u8] {
99 &self.raw
100 }
101}
102
103impl std::ops::Deref for Request {
104 type Target = MessageRequest;
105
106 fn deref(&self) -> &Self::Target {
107 &self.message
108 }
109}
110
111#[non_exhaustive]
114#[derive(Clone)]
115pub struct RequestInfo<'a> {
116 pub src: SocketAddr,
118 pub protocol: Protocol,
120 pub metadata: &'a Metadata,
122 pub query: &'a LowerQuery,
124}
125
126impl<'a> RequestInfo<'a> {
127 pub fn new(
136 src: SocketAddr,
137 protocol: Protocol,
138 metadata: &'a Metadata,
139 query: &'a LowerQuery,
140 ) -> Self {
141 Self {
142 src,
143 protocol,
144 metadata,
145 query,
146 }
147 }
148}
149
150#[derive(Clone, Copy, Debug)]
152#[repr(transparent)]
153pub struct ResponseInfo(Header);
154
155impl ResponseInfo {
156 pub(crate) fn serve_failed(request: &Request) -> Self {
157 let mut metadata = Metadata::new(
158 request.metadata.id,
159 MessageType::Response,
160 request.metadata.op_code,
161 );
162 metadata.response_code = ResponseCode::ServFail;
163 Self(Header {
164 metadata,
165 counts: HeaderCounts::default(),
166 })
167 }
168
169 pub fn counts(&self) -> HeaderCounts {
171 self.0.counts
172 }
173}
174
175impl From<Header> for ResponseInfo {
176 fn from(value: Header) -> Self {
177 Self(value)
178 }
179}
180
181impl std::ops::Deref for ResponseInfo {
182 type Target = Metadata;
183
184 fn deref(&self) -> &Self::Target {
185 &self.0.metadata
186 }
187}
188
189#[async_trait::async_trait]
191pub trait RequestHandler: Send + Sync + Unpin + 'static {
192 async fn handle_request<R: ResponseHandler, T: Time>(
199 &self,
200 request: &Request,
201 response_handle: R,
202 ) -> ResponseInfo;
203}
204
205#[cfg(test)]
206mod tests {
207 use super::*;
208 use crate::proto::op::{Metadata, OpCode, Query};
209
210 #[test]
211 fn request_info_clone() {
212 let query = Query::new();
213 let header = Metadata::new(10, MessageType::Query, OpCode::Query);
214 let lower_query = query.into();
215 let origin = RequestInfo::new(
216 "127.0.0.1:3000".parse().unwrap(),
217 Protocol::Udp,
218 &header,
219 &lower_query,
220 );
221 let cloned = origin.clone();
222 assert_eq!(origin.metadata, cloned.metadata);
223 }
224}