diff --git a/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java b/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java index fd8ab0fa90..dba784ca8c 100644 --- a/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java +++ b/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java @@ -314,7 +314,12 @@ protected void initChannel(SocketChannel ch) throws Exception { } // Make the connection attempt. - chan = b.connect(host, port).sync().channel(); + try { + chan = b.connect(host, port).sync().channel(); + } catch (Exception e) { + responseAvailable.completeExceptionally(e); + return; + } } // assert: clientHandler will always notify responseDone: either normally, or exceptionally diff --git a/connectors/netty-connector/src/test/java/org/glassfish/jersey/netty/connector/ConnectionExceptionTest.java b/connectors/netty-connector/src/test/java/org/glassfish/jersey/netty/connector/ConnectionExceptionTest.java new file mode 100644 index 0000000000..c0d726a145 --- /dev/null +++ b/connectors/netty-connector/src/test/java/org/glassfish/jersey/netty/connector/ConnectionExceptionTest.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package org.glassfish.jersey.netty.connector; + +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.client.ClientProperties; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import javax.ws.rs.ProcessingException; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.core.Response; + +public class ConnectionExceptionTest { + @Test + public void testConnectionException() throws InterruptedException { + Assertions.assertThrows(ProcessingException.class, ()-> { + ClientConfig clientConfig = new ClientConfig(); + clientConfig.connectorProvider(new NettyConnectorProvider()); + + Response r = ClientBuilder.newClient(clientConfig) + .property(ClientProperties.CONNECT_TIMEOUT, 1000) + .property(ClientProperties.READ_TIMEOUT, 1000) + .target("http://test.nonono:8080").request().get(); + r.close(); + }); + } +}