This is an automated email from the ASF dual-hosted git repository. coheigea pushed a commit to branch coheigea/CXF-8272 in repository https://gitbox.apache.org/repos/asf/cxf.git
commit 3333a7e626787248fd96d0943bb1827e14a60f16 Author: Colm O hEigeartaigh <[email protected]> AuthorDate: Thu Oct 15 10:57:08 2026 +0100 CXF-8272: Don't fail a one-way invocation if the response stream can't be drained --- .../transport/http/URLConnectionHTTPConduit.java | 8 +++++- .../transport/http/HTTPConduitURLEasyMockTest.java | 32 ++++++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java index 028eaf950f4..33b952cc155 100644 --- a/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java +++ b/rt/transports/http/src/main/java/org/apache/cxf/transport/http/URLConnectionHTTPConduit.java @@ -357,7 +357,13 @@ public class URLConnectionHTTPConduit extends HTTPConduit { ins = connection.getInputStream(); } if (ins != null) { - IOUtils.consume(ins); + try { + IOUtils.consume(ins); + } catch (IOException ex) { + // Draining is only done so the connection might be reused, so a failure here + // (for example the stream was already closed) should not fail the invocation + LOG.log(Level.FINE, "Could not consume the response stream: " + ex.getMessage(), ex); + } ins.close(); } } diff --git a/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java b/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java index 3850ce338be..40adb2d10c4 100644 --- a/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java +++ b/rt/transports/http/src/test/java/org/apache/cxf/transport/http/HTTPConduitURLEasyMockTest.java @@ -64,6 +64,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; /** @@ -73,7 +74,9 @@ public class HTTPConduitURLEasyMockTest { private static final String HTTP_RESPONSE_MESSAGE = "Some Response Message I can test"; - private enum ResponseStyle { NONE, BACK_CHANNEL, BACK_CHANNEL_ERROR, DECOUPLED, ONEWAY_NONE }; + private enum ResponseStyle { + NONE, BACK_CHANNEL, BACK_CHANNEL_ERROR, DECOUPLED, ONEWAY_NONE, ONEWAY_STREAM_CLOSED + }; private enum ResponseDelimiter { LENGTH, CHUNKED, EOF }; private static final String NOWHERE = "http://nada.nothing.nowhere.null/"; @@ -259,6 +262,21 @@ public class HTTPConduitURLEasyMockTest { "POST"); } + @Test + public void testSendOnewayResponseStreamAlreadyClosed() + throws Exception { + HTTPConduit conduit = setUpConduit(true, false, "POST"); + Message message = createMessage(); + conduit.prepare(message); + verifySentMessage(conduit, + message, + ResponseStyle.ONEWAY_STREAM_CLOSED, + ResponseDelimiter.CHUNKED, + true, // empty response + "POST"); + verify(is).close(); + } + @Test public void testSendTwowayDecoupledEmptyPartialResponse() throws Exception { @@ -443,7 +461,8 @@ public class HTTPConduitURLEasyMockTest { doNothing().when(os).close(); } - setUpExchange(message, style == ResponseStyle.NONE || style == ResponseStyle.ONEWAY_NONE); + setUpExchange(message, style == ResponseStyle.NONE || style == ResponseStyle.ONEWAY_NONE + || style == ResponseStyle.ONEWAY_STREAM_CLOSED); when(connection.getRequestMethod()).thenReturn(method); verifyHandleResponse(style, delimiter, emptyResponse, conduit); @@ -568,6 +587,15 @@ public class HTTPConduitURLEasyMockTest { when(connection.getInputStream()).thenReturn(new ByteArrayInputStream(new byte[0])); break; + case ONEWAY_STREAM_CLOSED: + is = mock(InputStream.class); + when(connection.getInputStream()).thenReturn(is); + when(connection.getContentLength()).thenReturn(-1); + when(connection.getHeaderField("Transfer-Encoding")).thenReturn("chunked"); + when(is.read()).thenReturn(-1); + when(is.available()).thenThrow(new IOException("stream is closed")); + break; + default: break; }
