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