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