1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::io;
use std::net::SocketAddr;
use proto::xfer::SerialMessage;
use trust_dns_client::serialize::binary::BinEncoder;
use trust_dns_client::BufStreamHandle;
use crate::authority::MessageResponse;
pub trait ResponseHandler: Clone + Send + Unpin + 'static {
fn send_response(&self, response: MessageResponse) -> io::Result<()>;
}
#[derive(Clone)]
pub struct ResponseHandle {
dst: SocketAddr,
stream_handle: BufStreamHandle,
}
impl ResponseHandle {
pub fn new(dst: SocketAddr, stream_handle: BufStreamHandle) -> Self {
ResponseHandle { dst, stream_handle }
}
}
impl ResponseHandler for ResponseHandle {
fn send_response(&self, response: MessageResponse) -> io::Result<()> {
info!(
"response: {} response_code: {}",
response.header().id(),
response.header().response_code(),
);
let mut buffer = Vec::with_capacity(512);
let encode_result = {
let mut encoder: BinEncoder = BinEncoder::new(&mut buffer);
response.destructive_emit(&mut encoder)
};
encode_result.map_err(|e| {
io::Error::new(
io::ErrorKind::Other,
format!("error encoding message: {}", e),
)
})?;
self.stream_handle
.unbounded_send(SerialMessage::new(buffer, self.dst))
.map_err(|_| io::Error::new(io::ErrorKind::Other, "unknown"))
}
}