hickory_server/server/
request_handler.rs1use std::net::SocketAddr;
11
12use crate::{
13 authority::MessageRequest,
14 proto::op::{Header, LowerQuery, ResponseCode},
15 server::{Protocol, ResponseHandler},
16};
17
18#[derive(Debug)]
20pub struct Request {
21 message: MessageRequest,
23 src: SocketAddr,
25 protocol: Protocol,
27}
28
29impl Request {
30 pub fn new(message: MessageRequest, src: SocketAddr, protocol: Protocol) -> Self {
34 Self {
35 message,
36 src,
37 protocol,
38 }
39 }
40
41 pub fn request_info(&self) -> RequestInfo<'_> {
43 RequestInfo {
44 src: self.src,
45 protocol: self.protocol,
46 header: self.message.header(),
47 query: self.message.query(),
48 }
49 }
50
51 pub fn src(&self) -> SocketAddr {
53 self.src
54 }
55
56 pub fn protocol(&self) -> Protocol {
58 self.protocol
59 }
60}
61
62impl std::ops::Deref for Request {
63 type Target = MessageRequest;
64
65 fn deref(&self) -> &Self::Target {
66 &self.message
67 }
68}
69
70#[non_exhaustive]
73#[derive(Clone)]
74pub struct RequestInfo<'a> {
75 pub src: SocketAddr,
77 pub protocol: Protocol,
79 pub header: &'a Header,
81 pub query: &'a LowerQuery,
83}
84
85impl<'a> RequestInfo<'a> {
86 pub fn new(
95 src: SocketAddr,
96 protocol: Protocol,
97 header: &'a Header,
98 query: &'a LowerQuery,
99 ) -> Self {
100 Self {
101 src,
102 protocol,
103 header,
104 query,
105 }
106 }
107}
108
109#[derive(Clone, Copy)]
111#[repr(transparent)]
112pub struct ResponseInfo(Header);
113
114impl ResponseInfo {
115 pub(crate) fn serve_failed() -> Self {
116 let mut header = Header::new();
117 header.set_response_code(ResponseCode::ServFail);
118 header.into()
119 }
120}
121
122impl From<Header> for ResponseInfo {
123 fn from(header: Header) -> Self {
124 Self(header)
125 }
126}
127
128impl std::ops::Deref for ResponseInfo {
129 type Target = Header;
130
131 fn deref(&self) -> &Self::Target {
132 &self.0
133 }
134}
135
136#[async_trait::async_trait]
138pub trait RequestHandler: Send + Sync + Unpin + 'static {
139 async fn handle_request<R: ResponseHandler>(
146 &self,
147 request: &Request,
148 response_handle: R,
149 ) -> ResponseInfo;
150}
151
152#[cfg(test)]
153mod tests {
154 use crate::proto::op::{Header, Query};
155 use crate::server::Protocol;
156
157 use super::RequestInfo;
158
159 #[test]
160 fn request_info_clone() {
161 let query: Query = Query::new();
162 let header = Header::new();
163 let lower_query = query.into();
164 let origin = RequestInfo::new(
165 "127.0.0.1:3000".parse().unwrap(),
166 Protocol::Udp,
167 &header,
168 &lower_query,
169 );
170 let cloned = origin.clone();
171 assert_eq!(origin.header, cloned.header);
172 }
173}