Skip to content

Commit 2a8a15d

Browse files
committed
refactor: [#682] handle UDP Tracker timeouts
1 parent 3c78bba commit 2a8a15d

File tree

2 files changed

+8
-5
lines changed

2 files changed

+8
-5
lines changed

src/console/clients/udp/checker.rs

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ pub enum ClientError {
2020
NotConnected,
2121
#[error("Unexpected response while connecting the the remote server.")]
2222
UnexpectedConnectionResponse,
23+
#[error("Connection timeout.")]
24+
ConnectionTimeout,
2325
}
2426

2527
/// A UDP Tracker client to make test requests (checks).

src/shared/bit_torrent/tracker/udp/client.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ use std::net::SocketAddr;
44
use std::sync::Arc;
55
use std::time::Duration;
66

7-
use anyhow::{anyhow, Context, Result};
7+
use anyhow::{anyhow, bail, Context, Result};
88
use aquatic_udp_protocol::{ConnectRequest, Request, Response, TransactionId};
99
use log::debug;
1010
use tokio::net::UdpSocket;
1111
use tokio::time;
1212
use zerocopy::network_endian::I32;
1313

14+
use crate::console::clients::udp::checker::ClientError;
1415
use crate::shared::bit_torrent::tracker::udp::{source_address, MAX_PACKET_SIZE};
1516

1617
/// Default timeout for sending and receiving packets. And waiting for sockets
@@ -79,15 +80,15 @@ impl UdpClient {
7980
Err(e) => return Err(anyhow!("IO error waiting for the socket to become readable: {e:?}")),
8081
};
8182
}
82-
Err(e) => return Err(anyhow!("Timeout waiting for the socket to become readable: {e:?}")),
83+
Err(_) => bail!(ClientError::ConnectionTimeout),
8384
};
8485

8586
match time::timeout(self.timeout, self.socket.send(bytes)).await {
8687
Ok(send_result) => match send_result {
8788
Ok(size) => Ok(size),
8889
Err(e) => Err(anyhow!("IO error during send: {e:?}")),
8990
},
90-
Err(e) => Err(anyhow!("Send operation timed out: {e:?}")),
91+
Err(_) => bail!(ClientError::ConnectionTimeout),
9192
}
9293
}
9394

@@ -110,15 +111,15 @@ impl UdpClient {
110111
Err(e) => return Err(anyhow!("IO error waiting for the socket to become readable: {e:?}")),
111112
};
112113
}
113-
Err(e) => return Err(anyhow!("Timeout waiting for the socket to become readable: {e:?}")),
114+
Err(_) => bail!(ClientError::ConnectionTimeout),
114115
};
115116

116117
let size_result = match time::timeout(self.timeout, self.socket.recv(bytes)).await {
117118
Ok(recv_result) => match recv_result {
118119
Ok(size) => Ok(size),
119120
Err(e) => Err(anyhow!("IO error during send: {e:?}")),
120121
},
121-
Err(e) => Err(anyhow!("Receive operation timed out: {e:?}")),
122+
Err(_) => bail!(ClientError::ConnectionTimeout),
122123
};
123124

124125
if size_result.is_ok() {

0 commit comments

Comments
 (0)