Skip to content

Commit 0984409

Browse files
committed
fix(dgw): set TCP_NODELAY on all TCP sockets
(WIP)
1 parent 06e91df commit 0984409

4 files changed

Lines changed: 25 additions & 4 deletions

File tree

crates/jmux-proxy/src/lib.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,10 @@ impl StreamResolverTask {
928928
match scheme {
929929
"tcp" => match TcpStream::connect((host, port)).await {
930930
Ok(stream) => {
931+
if let Err(error) = stream.set_nodelay(true) {
932+
warn!(%error, "Failed to set TCP_NODELAY on the socket");
933+
}
934+
931935
internal_msg_tx
932936
.send(InternalMessage::StreamResolved { channel, stream })
933937
.await

devolutions-gateway/src/listener.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ async fn run_tcp_listener(listener: TcpListener, state: DgwState) -> anyhow::Res
115115
loop {
116116
match listener.accept().await.context("failed to accept connection") {
117117
Ok((stream, peer_addr)) => {
118+
configure_tcp_socket(&stream);
119+
118120
let state = state.clone();
119121

120122
ChildTask::spawn(async move {
@@ -131,10 +133,6 @@ async fn run_tcp_listener(listener: TcpListener, state: DgwState) -> anyhow::Res
131133

132134
#[instrument("tcp", skip_all, fields(client = %peer_addr))]
133135
async fn handle_tcp_peer(stream: TcpStream, state: DgwState, peer_addr: SocketAddr) -> anyhow::Result<()> {
134-
if let Err(e) = stream.set_nodelay(true) {
135-
error!("set_nodelay on TcpStream failed: {}", e);
136-
}
137-
138136
let mut peeked = [0; 4];
139137
let n_read = stream
140138
.peek(&mut peeked)
@@ -168,6 +166,8 @@ async fn run_http_listener(listener: TcpListener, state: DgwState) -> anyhow::Re
168166
loop {
169167
match listener.accept().await {
170168
Ok((stream, peer_addr)) => {
169+
configure_tcp_socket(&stream);
170+
171171
let state = state.clone();
172172

173173
let fut = tokio::time::timeout(HTTP_CONNECTION_MAX_DURATION, async move {
@@ -195,6 +195,8 @@ async fn run_https_listener(listener: TcpListener, state: DgwState) -> anyhow::R
195195
loop {
196196
match listener.accept().await {
197197
Ok((stream, peer_addr)) => {
198+
configure_tcp_socket(&stream);
199+
198200
let tls_acceptor = tls_conf.acceptor.clone();
199201
let state = state.clone();
200202

@@ -285,3 +287,9 @@ impl ToInternalUrl for Url {
285287
self
286288
}
287289
}
290+
291+
fn configure_tcp_socket(socket: &TcpStream) {
292+
if let Err(error) = socket.set_nodelay(true) {
293+
warn!(%error, "Failed to set TCP_NODELAY on the socket");
294+
}
295+
}

jetsocat/src/pipe.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,10 @@ pub async fn open_pipe(mode: PipeMode, proxy_cfg: Option<ProxyConfig>) -> Result
156156
.context("failed to bind TCP listener")?;
157157
let (socket, peer_addr) = listener.accept().await.context("TCP listener couldn't accept")?;
158158

159+
if let Err(error) = socket.set_nodelay(true) {
160+
warn!(%error, "Failed to set TCP_NODELAY on the socket");
161+
}
162+
159163
info!(%peer_addr, "Accepted peer");
160164

161165
Ok(Pipe {

jetsocat/src/utils.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ macro_rules! impl_tcp_connect {
7373
let dest_addr =
7474
resolve_dest_addr($req_addr.to_dest_addr().with_context(|| "invalid target address")?).await?;
7575
let $stream = TcpStream::connect(dest_addr).await?;
76+
77+
if let Err(error) = $stream.set_nodelay(true) {
78+
warn!(%error, "Failed to set TCP_NODELAY on the socket");
79+
}
80+
7681
$operation.await
7782
}
7883
};

0 commit comments

Comments
 (0)