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"))
    }
}