Skip to content

Commit d58f725

Browse files
Replace err-context with snafu
1 parent ea69f31 commit d58f725

File tree

7 files changed

+67
-30
lines changed

7 files changed

+67
-30
lines changed

Cargo.lock

Lines changed: 23 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ statsd = ["cadence"]
2828

2929
[dependencies]
3030
tokio = { version = "1.0", features = ["rt-multi-thread", "macros", "net", "time", "io-util"] }
31-
err-context = "0.1.0"
31+
snafu = "0.8"
3232
log = "0.4.11"
3333
futures = "0.3.31"
3434
clap = { version = "4.0", features = ["derive"], optional = true }

src/bin/tcp2udp.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#![forbid(unsafe_code)]
22

33
use clap::Parser;
4-
use err_context::ErrorExt as _;
54
use std::num::NonZeroU8;
65

76
use udp_over_tcp::tcp2udp;

src/bin/udp2tcp.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
#![forbid(unsafe_code)]
22

33
use clap::Parser;
4-
use err_context::BoxedErrorExt as _;
54
use std::net::SocketAddr;
65

76
use udp_over_tcp::udp2tcp;

src/forward_traffic.rs

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
use err_context::BoxedErrorExt as _;
2-
use err_context::ResultExt as _;
31
use futures::future::select;
42
use futures::pin_mut;
3+
use snafu::prelude::*;
54
use std::convert::Infallible;
65
use std::future::Future;
76
use std::io;
@@ -36,12 +35,12 @@ pub async fn process_udp_over_tcp(
3635

3736
let tcp2udp = async move {
3837
if let Err(error) = process_tcp2udp(tcp_in, udp_out, tcp_recv_timeout).await {
39-
log::error!("Error: {}", error.display("\nCaused by: "));
38+
log::error!("Error: {error}");
4039
}
4140
};
4241
let udp2tcp = async move {
4342
let Err(error) = process_udp2tcp(udp_in, tcp_out).await;
44-
log::error!("Error: {}", error.display("\nCaused by: "));
43+
log::error!("Error: {error}");
4544
};
4645

4746
pin_mut!(tcp2udp);
@@ -65,16 +64,16 @@ async fn process_tcp2udp(
6564
let tcp_read_len =
6665
maybe_timeout(tcp_recv_timeout, tcp_in.read(&mut buffer[unprocessed_i..]))
6766
.await
68-
.context("Timeout while reading from TCP")?
69-
.context("Failed reading from TCP")?;
67+
.context(TcpReadTimeoutSnafu)?
68+
.context(TcpReadSnafu)?;
7069
if tcp_read_len == 0 {
7170
break;
7271
}
7372
unprocessed_i += tcp_read_len;
7473

7574
let processed_i = forward_datagrams_in_buffer(&udp_out, &buffer[..unprocessed_i])
7675
.await
77-
.context("Failed writing to UDP")?;
76+
.context(UdpWriteSnafu)?;
7877

7978
// If we have read data that was not forwarded, because it was not a complete datagram,
8079
// move it to the start of the buffer and start over
@@ -87,6 +86,20 @@ async fn process_tcp2udp(
8786
Ok(())
8887
}
8988

89+
#[derive(Debug, snafu::Snafu)]
90+
enum ProcessSocketError {
91+
#[snafu(display("Timeout while reading from TCP"))]
92+
TcpReadTimeout { source: tokio::time::error::Elapsed },
93+
#[snafu(display("Failed reading from TCP"))]
94+
TcpRead { source: io::Error },
95+
#[snafu(display("Failed writing to TCP"))]
96+
TcpWrite { source: io::Error },
97+
#[snafu(display("Failed reading from UDP"))]
98+
UdpRead { source: io::Error },
99+
#[snafu(display("Failed writing to UDP"))]
100+
UdpWrite { source: io::Error },
101+
}
102+
90103
async fn maybe_timeout<F: Future>(
91104
duration: Option<Duration>,
92105
future: F,
@@ -141,7 +154,7 @@ async fn process_udp2tcp(
141154
let udp_read_len = udp_in
142155
.recv(&mut buffer[HEADER_LEN..])
143156
.await
144-
.context("Failed reading from UDP")?;
157+
.context(UdpReadSnafu)?;
145158

146159
// Set the "header" to the length of the datagram.
147160
let datagram_len =
@@ -151,7 +164,7 @@ async fn process_udp2tcp(
151164
tcp_out
152165
.write_all(&buffer[..HEADER_LEN + udp_read_len])
153166
.await
154-
.context("Failed writing to TCP")?;
167+
.context(TcpWriteSnafu)?;
155168

156169
log::trace!("Forwarded {} bytes UDP->TCP", udp_read_len);
157170
}

src/tcp2udp.rs

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
use crate::exponential_backoff::ExponentialBackoff;
55
use crate::logging::Redact;
6-
use err_context::{BoxedErrorExt as _, ErrorExt as _, ResultExt as _};
6+
use snafu::prelude::*;
77
use std::convert::Infallible;
88
use std::fmt;
99
use std::io;
@@ -135,7 +135,6 @@ impl std::error::Error for Tcp2UdpError {
135135
}
136136
}
137137
}
138-
139138
/// Sets up TCP listening sockets on all addresses in `Options::tcp_listen_addrs`.
140139
/// If binding a listening socket fails this returns an error. Otherwise the function
141140
/// will continue indefinitely to accept incoming connections and forward to UDP.
@@ -226,7 +225,7 @@ async fn process_tcp_listener(
226225
Ok((tcp_stream, tcp_peer_addr)) => {
227226
log::debug!("Incoming connection from {}/TCP", Redact(tcp_peer_addr));
228227
if let Err(error) = crate::tcp_options::set_nodelay(&tcp_stream, tcp_nodelay) {
229-
log::error!("Error: {}", error.display("\nCaused by: "));
228+
log::error!("Error: {error}");
230229
}
231230
let statsd = statsd.clone();
232231
tokio::spawn(async move {
@@ -240,7 +239,7 @@ async fn process_tcp_listener(
240239
)
241240
.await
242241
{
243-
log::error!("Error: {}", error.display("\nCaused by: "));
242+
log::error!("Error: {error}");
244243
}
245244
statsd.decr_connections();
246245
});
@@ -260,7 +259,6 @@ async fn process_tcp_listener(
260259
}
261260
}
262261
}
263-
264262
/// Sets up a UDP socket bound to `udp_bind_ip` and connected to `udp_peer_addr` and forwards
265263
/// traffic between that UDP socket and the given `tcp_stream` until the `tcp_stream` is closed.
266264
/// `tcp_peer_addr` should be the remote addr that `tcp_stream` is connected to.
@@ -271,15 +269,17 @@ async fn process_socket(
271269
udp_peer_addr: SocketAddr,
272270
tcp_recv_timeout: Option<Duration>,
273271
) -> Result<(), Box<dyn std::error::Error>> {
274-
let udp_bind_addr = SocketAddr::new(udp_bind_ip, 0);
272+
let bind_addr = SocketAddr::new(udp_bind_ip, 0);
275273

276-
let udp_socket = UdpSocket::bind(udp_bind_addr)
274+
let udp_socket = UdpSocket::bind(bind_addr)
277275
.await
278-
.with_context(|_| format!("Failed to bind UDP socket to {}", udp_bind_addr))?;
276+
.context(UdpBindSnafu { bind_addr })?;
279277
udp_socket
280278
.connect(udp_peer_addr)
281279
.await
282-
.with_context(|_| format!("Failed to connect UDP socket to {}", udp_peer_addr))?;
280+
.context(UdpConnectSnafu {
281+
addr: udp_peer_addr,
282+
})?;
283283

284284
log::debug!(
285285
"UDP socket bound to {} and connected to {}",
@@ -301,3 +301,14 @@ async fn process_socket(
301301

302302
Ok(())
303303
}
304+
305+
#[derive(Debug, snafu::Snafu)]
306+
enum ProcessSocketError {
307+
#[snafu(display("Failed to bind UDP socket to {bind_addr}"))]
308+
UdpBind {
309+
bind_addr: SocketAddr,
310+
source: io::Error,
311+
},
312+
#[snafu(display("Failed to connect UDP socket to {addr}"))]
313+
UdpConnect { addr: SocketAddr, source: io::Error },
314+
}

tests/udp2tcp.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ async fn setup_udp2tcp() -> Result<
137137
udp_socket.send(&[]).await?;
138138
let mut tcp_stream = tcp_listener.accept().await?.0;
139139
let mut buf = [0; 1024];
140-
tcp_stream.read(&mut buf).await?;
140+
let _n = tcp_stream.read(&mut buf).await?;
141141

142142
Ok((udp_socket, tcp_stream, join_handle))
143143
}

0 commit comments

Comments
 (0)