From 5039463e3f32ee26e296a18cf0ed8947e5d9bdd7 Mon Sep 17 00:00:00 2001 From: Ryan Schmitt Date: Mon, 11 Aug 2025 15:15:33 -0700 Subject: [PATCH] IOSessionImpl: Support CloseMode.IMMEDIATE for Unix domain sockets It's fine to set socket linger on a Unix-domain socket as long as it is done through the `SocketChannel` API. Calling `.socket()` always throws on a UDS-backed `SocketChannel`, however, which was silently causing issues for `TestAsyncSocketTimeout`, as connections were being left open until timeout. --- .../java/org/apache/hc/core5/reactor/IOSessionImpl.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java b/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java index 7b5b91dafb..9fb5a52b99 100644 --- a/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java +++ b/httpcore5/src/main/java/org/apache/hc/core5/reactor/IOSessionImpl.java @@ -29,7 +29,7 @@ import java.io.IOException; import java.net.SocketAddress; -import java.net.SocketException; +import java.net.StandardSocketOptions; import java.nio.ByteBuffer; import java.nio.channels.ByteChannel; import java.nio.channels.SelectionKey; @@ -266,8 +266,8 @@ public void close(final CloseMode closeMode) { if (this.status.compareAndSet(Status.ACTIVE, Status.CLOSED)) { if (closeMode == CloseMode.IMMEDIATE) { try { - this.channel.socket().setSoLinger(true, 0); - } catch (final SocketException e) { + this.channel.setOption(StandardSocketOptions.SO_LINGER, 0); + } catch (final UnsupportedOperationException | IOException e) { // Quietly ignore } }