-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathmod.rs
94 lines (81 loc) · 3.19 KB
/
mod.rs
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//! DNS resolvers
#[cfg(feature = "hickory-dns")]
use hickory_resolver::config::ResolverOpts;
use log::trace;
use shadowsocks::{dns_resolver::DnsResolver, net::ConnectOpts};
use crate::config::DnsConfig;
#[allow(unused_variables, dead_code)]
pub async fn build_dns_resolver(
dns: DnsConfig,
ipv6_first: bool,
dns_cache_size: Option<usize>,
connect_opts: &ConnectOpts,
) -> Option<DnsResolver> {
match dns {
DnsConfig::System => {
#[cfg(feature = "hickory-dns")]
if crate::hint_support_default_system_resolver() {
use log::warn;
use std::env;
let force_system_builtin = match env::var("SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN") {
Ok(mut v) => {
v.make_ascii_lowercase();
v == "1" || v == "true"
}
Err(..) => false,
};
if !force_system_builtin {
let mut opts_opt = None;
if let Some(dns_cache_size) = dns_cache_size {
let mut opts = ResolverOpts::default();
opts.cache_size = dns_cache_size;
opts_opt = Some(opts);
}
return match DnsResolver::hickory_dns_system_resolver(opts_opt, connect_opts.clone()).await {
Ok(r) => Some(r),
Err(err) => {
warn!(
"initialize hickory-dns DNS system resolver failed, fallback to default system resolver, error: {}",
err
);
None
}
};
}
}
trace!("initialized DNS system resolver builtin");
None
}
#[cfg(feature = "hickory-dns")]
DnsConfig::HickoryDns(dns) => {
let mut opts_opt = None;
if let Some(dns_cache_size) = dns_cache_size {
let mut opts = ResolverOpts::default();
opts.cache_size = dns_cache_size;
opts_opt = Some(opts);
}
match DnsResolver::hickory_resolver(dns, opts_opt, connect_opts.clone()).await {
Ok(r) => Some(r),
Err(err) => {
use log::warn;
warn!(
"initialize hickory-dns DNS resolver failed, fallback to default system resolver, error: {}",
err
);
None
}
}
}
#[cfg(feature = "local-dns")]
DnsConfig::LocalDns(ns) => {
use crate::local::dns::dns_resolver::DnsResolver as LocalDnsResolver;
use shadowsocks::config::Mode;
trace!("initializing direct DNS resolver for {}", ns);
let mut resolver = LocalDnsResolver::new(ns);
resolver.set_mode(Mode::TcpAndUdp);
resolver.set_ipv6_first(ipv6_first);
resolver.set_connect_opts(connect_opts.clone());
Some(DnsResolver::custom_resolver(resolver))
}
}
}