1 extern crate rustls;
2 extern crate webpki_roots;
3 
4 use std::net::SocketAddr;
5 
6 use crate::tls::CLIENT_CONFIG;
7 
8 use proto::xfer::{DnsExchange, DnsExchangeConnect};
9 use proto::TokioTime;
10 use trust_dns_https::{
11     HttpsClientConnect, HttpsClientResponse, HttpsClientStream, HttpsClientStreamBuilder,
12 };
13 
14 use crate::config::TlsClientConfig;
15 
16 #[allow(clippy::type_complexity)]
new_https_stream( socket_addr: SocketAddr, dns_name: String, client_config: Option<TlsClientConfig>, ) -> DnsExchangeConnect<HttpsClientConnect, HttpsClientStream, HttpsClientResponse, TokioTime>17 pub(crate) fn new_https_stream(
18     socket_addr: SocketAddr,
19     dns_name: String,
20     client_config: Option<TlsClientConfig>,
21 ) -> DnsExchangeConnect<HttpsClientConnect, HttpsClientStream, HttpsClientResponse, TokioTime> {
22     let client_config = client_config.map_or_else(
23         || CLIENT_CONFIG.clone(),
24         |TlsClientConfig(client_config)| client_config,
25     );
26 
27     let https_builder = HttpsClientStreamBuilder::with_client_config(client_config);
28     DnsExchange::connect(https_builder.build(socket_addr, dns_name))
29 }
30 
31 #[cfg(test)]
32 mod tests {
33     extern crate env_logger;
34     use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
35 
36     use tokio::runtime::Runtime;
37 
38     use crate::config::{ResolverConfig, ResolverOpts};
39     use crate::TokioAsyncResolver;
40 
https_test(config: ResolverConfig)41     fn https_test(config: ResolverConfig) {
42         //env_logger::try_init().ok();
43         let mut io_loop = Runtime::new().unwrap();
44 
45         let resolver =
46             TokioAsyncResolver::new(config, ResolverOpts::default(), io_loop.handle().clone());
47         let resolver = io_loop
48             .block_on(resolver)
49             .expect("failed to create resolver");
50 
51         let response = io_loop
52             .block_on(resolver.lookup_ip("www.example.com."))
53             .expect("failed to run lookup");
54 
55         assert_eq!(response.iter().count(), 1);
56         for address in response.iter() {
57             if address.is_ipv4() {
58                 assert_eq!(address, IpAddr::V4(Ipv4Addr::new(93, 184, 216, 34)));
59             } else {
60                 assert_eq!(
61                     address,
62                     IpAddr::V6(Ipv6Addr::new(
63                         0x2606, 0x2800, 0x220, 0x1, 0x248, 0x1893, 0x25c8, 0x1946,
64                     ))
65                 );
66             }
67         }
68 
69         // check if there is another connection created
70         let response = io_loop
71             .block_on(resolver.lookup_ip("www.example.com."))
72             .expect("failed to run lookup");
73 
74         assert_eq!(response.iter().count(), 1);
75         for address in response.iter() {
76             if address.is_ipv4() {
77                 assert_eq!(address, IpAddr::V4(Ipv4Addr::new(93, 184, 216, 34)));
78             } else {
79                 assert_eq!(
80                     address,
81                     IpAddr::V6(Ipv6Addr::new(
82                         0x2606, 0x2800, 0x220, 0x1, 0x248, 0x1893, 0x25c8, 0x1946,
83                     ))
84                 );
85             }
86         }
87     }
88 
89     #[test]
test_cloudflare_https()90     fn test_cloudflare_https() {
91         https_test(ResolverConfig::cloudflare_https())
92     }
93 }
94