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