Skip to content

Commit fc4bb36

Browse files
committed
🐛 Fix domain-rules -c none not work
1 parent 7c103c9 commit fc4bb36

File tree

4 files changed

+49
-17
lines changed

4 files changed

+49
-17
lines changed

src/config/parser/domain_rule.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,17 @@ mod tests {
9292
))
9393
);
9494

95+
assert_eq!(
96+
DomainRule::parse("-c none"),
97+
Ok((
98+
"",
99+
DomainRule {
100+
speed_check_mode: Some(vec![SpeedCheckMode::None].into()),
101+
..Default::default()
102+
}
103+
))
104+
);
105+
95106
assert_eq!(
96107
DomainRule::parse("-a -"),
97108
Ok((

src/config/parser/speed_mode.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ impl NomParser for SpeedCheckMode {
2222
fn parse(input: &str) -> IResult<&str, Self> {
2323
use SpeedCheckMode::*;
2424

25+
let none = value(None, tag_no_case("none"));
2526
let ping = value(Ping, tag_no_case("ping"));
2627
let tcp = map(preceded(tag_no_case("tcp"), preceded(char(':'), u16)), Tcp);
2728
let http = map(
@@ -39,7 +40,7 @@ impl NomParser for SpeedCheckMode {
3940
Https,
4041
);
4142

42-
alt((ping, tcp, https, http))(input)
43+
alt((none, ping, tcp, https, http))(input)
4344
}
4445
}
4546

src/config/speed_mode.rs

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,52 @@ use crate::infra::ping::PingAddr;
44

55
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
66
pub enum SpeedCheckMode {
7+
None,
78
Ping,
89
Tcp(u16),
910
Http(u16),
1011
Https(u16),
1112
}
1213

1314
impl SpeedCheckMode {
14-
pub fn to_ping_addr(self, ip_addr: IpAddr) -> PingAddr {
15-
match self {
16-
SpeedCheckMode::Ping => PingAddr::Icmp(ip_addr),
17-
SpeedCheckMode::Tcp(port) => PingAddr::Tcp(SocketAddr::new(ip_addr, port)),
18-
SpeedCheckMode::Http(port) => PingAddr::Http(SocketAddr::new(ip_addr, port)),
19-
SpeedCheckMode::Https(port) => PingAddr::Https(SocketAddr::new(ip_addr, port)),
20-
}
15+
pub fn is_none(&self) -> bool {
16+
matches!(self, SpeedCheckMode::None)
17+
}
18+
19+
pub fn to_ping_addr(self, ip_addr: IpAddr) -> Option<PingAddr> {
20+
use SpeedCheckMode::*;
21+
Some(match self {
22+
None => return Default::default(),
23+
Ping => PingAddr::Icmp(ip_addr),
24+
Tcp(port) => PingAddr::Tcp(SocketAddr::new(ip_addr, port)),
25+
Http(port) => PingAddr::Http(SocketAddr::new(ip_addr, port)),
26+
Https(port) => PingAddr::Https(SocketAddr::new(ip_addr, port)),
27+
})
2128
}
2229

2330
pub fn to_ping_addrs(self, ip_addrs: &[IpAddr]) -> Vec<PingAddr> {
24-
ip_addrs.iter().map(|ip| self.to_ping_addr(*ip)).collect()
31+
ip_addrs
32+
.iter()
33+
.flat_map(|ip| self.to_ping_addr(*ip))
34+
.collect()
2535
}
2636
}
2737

2838
impl std::fmt::Debug for SpeedCheckMode {
2939
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
40+
use SpeedCheckMode::*;
3041
match self {
31-
SpeedCheckMode::Ping => write!(f, "ICMP"),
32-
SpeedCheckMode::Tcp(port) => write!(f, "TCP:{port}"),
33-
SpeedCheckMode::Http(port) => {
42+
None => write!(f, "None"),
43+
Ping => write!(f, "ICMP"),
44+
Tcp(port) => write!(f, "TCP:{port}"),
45+
Http(port) => {
3446
if *port == 80 {
3547
write!(f, "HTTP")
3648
} else {
3749
write!(f, "HTTP:{port}")
3850
}
3951
}
40-
SpeedCheckMode::Https(port) => {
52+
Https(port) => {
4153
if *port == 443 {
4254
write!(f, "HTTPS")
4355
} else {

src/dns_mw_ns.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,19 +197,24 @@ async fn lookup_ip(
197197
return Err(ProtoErrorKind::NoConnections.into());
198198
}
199199

200-
// ignore
201-
let response_strategy = if options.no_speed_check || options.speed_check_mode.is_none() {
200+
// ignore speed check
201+
let mut response_strategy = if options.no_speed_check || options.speed_check_mode.is_none() {
202202
FastestResponse
203203
} else {
204204
options.response_strategy
205205
};
206206

207-
let speed_check_mode = options
207+
let mut speed_check_mode = options
208208
.speed_check_mode
209209
.as_ref()
210210
.map(|m| m.as_slice())
211211
.unwrap_or_default();
212212

213+
if speed_check_mode.iter().any(|m| m.is_none()) {
214+
response_strategy = FastestResponse; // ignore speed check
215+
speed_check_mode = &[];
216+
}
217+
213218
let mut ok_tasks = vec![];
214219
let mut err_tasks = vec![];
215220

@@ -501,7 +506,10 @@ async fn multi_mode_ping(
501506
let ping_ops = PingOptions::default().with_timeout_secs(2);
502507

503508
for mode in &modes {
504-
let dest = mode.to_ping_addr(ip_addr);
509+
let dest = match mode.to_ping_addr(ip_addr) {
510+
Some(addr) => addr,
511+
None => return Err(PingError::NoAddress),
512+
};
505513

506514
let ping_task = ping(dest, ping_ops).boxed();
507515
let timeout_task = sleep(duration).boxed();

0 commit comments

Comments
 (0)