diff --git a/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/InvalidHostTest.java b/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/InvalidHostTest.java new file mode 100644 index 0000000000000..88b25b6b104e6 --- /dev/null +++ b/extensions/resteasy-reactive/rest-client-reactive/deployment/src/test/java/io/quarkus/rest/client/reactive/InvalidHostTest.java @@ -0,0 +1,53 @@ +package io.quarkus.rest.client.reactive; + +import java.net.URI; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response; + +import org.assertj.core.api.Assertions; +import org.eclipse.microprofile.rest.client.RestClientBuilder; +import org.eclipse.microprofile.rest.client.ext.ResponseExceptionMapper; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.test.QuarkusUnitTest; + +public class InvalidHostTest { + + @RegisterExtension + static final QuarkusUnitTest TEST = new QuarkusUnitTest(); + + @Test + void shouldThrowDummyException() { + Client client = RestClientBuilder.newBuilder().baseUri(URI.create("http://localhost2:1234/")) + .register(DummyExceptionMapper.class).build(Client.class); + + Assertions.assertThatThrownBy(client::get).isInstanceOf(DummyException.class); + } + + @Path("/foo") + public interface Client { + @GET + String get(); + } + + public static class DummyException extends RuntimeException { + + } + + public static class DummyExceptionMapper implements ResponseExceptionMapper { + + @Override + public boolean handles(int status, MultivaluedMap headers) { + return status == 0 && headers.isEmpty(); + } + + @Override + public DummyException toThrowable(Response response) { + return new DummyException(); + } + } +} diff --git a/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientSendRequestHandler.java b/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientSendRequestHandler.java index cd26798627e55..753cc79d73574 100644 --- a/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientSendRequestHandler.java +++ b/independent-projects/resteasy-reactive/client/runtime/src/main/java/org/jboss/resteasy/reactive/client/handlers/ClientSendRequestHandler.java @@ -51,6 +51,7 @@ import org.jboss.resteasy.reactive.client.spi.ClientRestHandler; import org.jboss.resteasy.reactive.client.spi.MultipartResponseData; import org.jboss.resteasy.reactive.common.core.Serialisers; +import org.jboss.resteasy.reactive.common.util.MultivaluedTreeMap; public class ClientSendRequestHandler implements ClientRestHandler { private static final Logger log = Logger.getLogger(ClientSendRequestHandler.class); @@ -247,6 +248,10 @@ public void handle(Throwable failure) { }, new Consumer<>() { @Override public void accept(Throwable event) { + // set some properties to prevent NPEs down the chain + requestContext.setResponseHeaders(new MultivaluedTreeMap<>()); + requestContext.setResponseReasonPhrase("unknown"); + if (event instanceof IOException) { ProcessingException throwable = new ProcessingException(event); reportFinish(throwable, requestContext);