mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-03-07 20:09:59 +03:00
cancel previous dns request if a new one is made
This commit is contained in:
15
src/dns.rs
15
src/dns.rs
@@ -1,4 +1,4 @@
|
|||||||
use std::net::IpAddr;
|
use std::{collections::HashMap, net::IpAddr};
|
||||||
|
|
||||||
use local_channel::mpsc::{channel, Receiver, Sender};
|
use local_channel::mpsc::{channel, Receiver, Sender};
|
||||||
use tokio::task::{spawn_local, JoinHandle};
|
use tokio::task::{spawn_local, JoinHandle};
|
||||||
@@ -30,6 +30,7 @@ struct DnsTask {
|
|||||||
request_rx: Receiver<DnsRequest>,
|
request_rx: Receiver<DnsRequest>,
|
||||||
event_tx: Sender<DnsEvent>,
|
event_tx: Sender<DnsEvent>,
|
||||||
cancellation_token: CancellationToken,
|
cancellation_token: CancellationToken,
|
||||||
|
active_tasks: HashMap<ClientHandle, JoinHandle<()>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DnsResolver {
|
impl DnsResolver {
|
||||||
@@ -39,6 +40,7 @@ impl DnsResolver {
|
|||||||
let (event_tx, event_rx) = channel();
|
let (event_tx, event_rx) = channel();
|
||||||
let cancellation_token = CancellationToken::new();
|
let cancellation_token = CancellationToken::new();
|
||||||
let dns_task = DnsTask {
|
let dns_task = DnsTask {
|
||||||
|
active_tasks: Default::default(),
|
||||||
resolver,
|
resolver,
|
||||||
request_rx,
|
request_rx,
|
||||||
event_tx,
|
event_tx,
|
||||||
@@ -81,6 +83,14 @@ impl DnsTask {
|
|||||||
while let Some(dns_request) = self.request_rx.recv().await {
|
while let Some(dns_request) = self.request_rx.recv().await {
|
||||||
let DnsRequest { handle, hostname } = dns_request;
|
let DnsRequest { handle, hostname } = dns_request;
|
||||||
|
|
||||||
|
/* abort previous dns task */
|
||||||
|
let previous_task = self.active_tasks.remove(&handle);
|
||||||
|
if let Some(task) = previous_task {
|
||||||
|
if !task.is_finished() {
|
||||||
|
task.abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
self.event_tx
|
self.event_tx
|
||||||
.send(DnsEvent::Resolving(handle))
|
.send(DnsEvent::Resolving(handle))
|
||||||
.expect("channel closed");
|
.expect("channel closed");
|
||||||
@@ -90,7 +100,7 @@ impl DnsTask {
|
|||||||
let resolver = self.resolver.clone();
|
let resolver = self.resolver.clone();
|
||||||
let cancellation_token = self.cancellation_token.clone();
|
let cancellation_token = self.cancellation_token.clone();
|
||||||
|
|
||||||
tokio::task::spawn_local(async move {
|
let task = tokio::task::spawn_local(async move {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
ips = resolver.lookup_ip(&hostname) => {
|
ips = resolver.lookup_ip(&hostname) => {
|
||||||
let ips = ips.map(|ips| ips.iter().collect::<Vec<_>>());
|
let ips = ips.map(|ips| ips.iter().collect::<Vec<_>>());
|
||||||
@@ -101,6 +111,7 @@ impl DnsTask {
|
|||||||
_ = cancellation_token.cancelled() => {},
|
_ = cancellation_token.cancelled() => {},
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
self.active_tasks.insert(handle, task);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user