From 7e45ed51e59e42b105b208ba030f529de291fbd0 Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Thu, 9 Oct 2025 21:32:00 -0700 Subject: [PATCH] Avoid setting TCP socket options on Unix domain sockets --- .../DefaultHttpClientConnectionOperator.java | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java index 695edae543..d1e31cddd9 100644 --- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java +++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultHttpClientConnectionOperator.java @@ -215,7 +215,7 @@ public void connect( socket.bind(localAddress); } conn.bind(socket); - configureSocket(socket, socketConfig); + configureSocket(socket, socketConfig, true); socket.connect(remoteAddress, TimeValue.isPositive(connectTimeout) ? connectTimeout.toMillisecondsIntBound() : 0); conn.bind(socket); onAfterSocketConnect(context, endpointHost); @@ -288,7 +288,7 @@ private void connectToUnixDomainSocket( final Socket socket = unixDomainSocketFactory.connectSocket(newSocket, unixDomainSocket, connectTimeout); conn.bind(socket); - configureSocket(socket, socketConfig); + configureSocket(socket, socketConfig, false); onAfterSocketConnect(context, endpointHost); if (LOG.isDebugEnabled()) { LOG.debug("{} {} connected to {}", ConnPoolSupport.getId(conn), endpointHost, unixDomainSocket); @@ -312,14 +312,15 @@ private void connectToUnixDomainSocket( } @SuppressWarnings("Since15") - private static void configureSocket(final Socket socket, final SocketConfig socketConfig) throws IOException { + private static void configureSocket( + final Socket socket, + final SocketConfig socketConfig, + final boolean isTcp + ) throws IOException { final Timeout socketTimeout = socketConfig.getSoTimeout(); if (socketTimeout != null) { socket.setSoTimeout(socketTimeout.toMillisecondsIntBound()); } - socket.setReuseAddress(socketConfig.isSoReuseAddress()); - socket.setTcpNoDelay(socketConfig.isTcpNoDelay()); - socket.setKeepAlive(socketConfig.isSoKeepAlive()); if (socketConfig.getRcvBufSize() > 0) { socket.setReceiveBufferSize(socketConfig.getRcvBufSize()); } @@ -331,15 +332,21 @@ private static void configureSocket(final Socket socket, final SocketConfig sock if (linger >= 0) { socket.setSoLinger(true, linger); } - if (SUPPORTS_KEEPALIVE_OPTIONS) { - if (socketConfig.getTcpKeepIdle() > 0) { - Sockets.setOption(socket, ExtendedSocketOptions.TCP_KEEPIDLE, socketConfig.getTcpKeepIdle()); - } - if (socketConfig.getTcpKeepInterval() > 0) { - Sockets.setOption(socket, ExtendedSocketOptions.TCP_KEEPINTERVAL, socketConfig.getTcpKeepInterval()); - } - if (socketConfig.getTcpKeepCount() > 0) { - Sockets.setOption(socket, ExtendedSocketOptions.TCP_KEEPCOUNT, socketConfig.getTcpKeepCount()); + if (isTcp) { + socket.setReuseAddress(socketConfig.isSoReuseAddress()); + socket.setTcpNoDelay(socketConfig.isTcpNoDelay()); + socket.setKeepAlive(socketConfig.isSoKeepAlive()); + if (SUPPORTS_KEEPALIVE_OPTIONS) { + if (socketConfig.getTcpKeepIdle() > 0) { + Sockets.setOption(socket, ExtendedSocketOptions.TCP_KEEPIDLE, socketConfig.getTcpKeepIdle()); + } + if (socketConfig.getTcpKeepInterval() > 0) { + Sockets.setOption(socket, ExtendedSocketOptions.TCP_KEEPINTERVAL, + socketConfig.getTcpKeepInterval()); + } + if (socketConfig.getTcpKeepCount() > 0) { + Sockets.setOption(socket, ExtendedSocketOptions.TCP_KEEPCOUNT, socketConfig.getTcpKeepCount()); + } } } }