CAMEL-11111: implemented throwExceptionOnFailure attribute for Producer usage
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/d490978e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/d490978e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/d490978e Branch: refs/heads/master Commit: d490978eba141213c5b43cbbef13406c917132cc Parents: 693aa8a Author: Scott Cranton <sc...@cranton.com> Authored: Sat Apr 8 18:42:46 2017 -0400 Committer: Claus Ibsen <davscl...@apache.org> Committed: Sun Apr 9 10:03:28 2017 +0200 ---------------------------------------------------------------------- ...HttpProducerThrowExceptionOnFailureTest.java | 4 +-- .../undertow/UndertowClientCallback.java | 38 ++++++++++++++++++-- ...rtowProducerThrowExceptionOnFailureTest.java | 14 ++++---- 3 files changed, 43 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/d490978e/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpProducerThrowExceptionOnFailureTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpProducerThrowExceptionOnFailureTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpProducerThrowExceptionOnFailureTest.java index d5b7a60..429946d 100644 --- a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpProducerThrowExceptionOnFailureTest.java +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpProducerThrowExceptionOnFailureTest.java @@ -39,8 +39,8 @@ public class NettyHttpProducerThrowExceptionOnFailureTest extends BaseNettyTest String out = template().requestBody("netty4-http:http://localhost:{{port}}/fail?throwExceptionOnFailure=true", null, String.class); fail("Should throw an exception"); } catch (Throwable t) { - //t.printStackTrace(); - assertNotNull(t); + NettyHttpOperationFailedException cause = (NettyHttpOperationFailedException) t.getCause(); + assertEquals(404, cause.getStatusCode()); } } http://git-wip-us.apache.org/repos/asf/camel/blob/d490978e/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java index d9c6485..9a1746d 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowClientCallback.java @@ -40,6 +40,8 @@ import io.undertow.util.HttpString; import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import org.apache.camel.Message; +import org.apache.camel.http.common.HttpHelper; +import org.apache.camel.http.common.HttpOperationFailedException; import org.apache.camel.util.ExchangeHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -198,7 +200,7 @@ class UndertowClientCallback implements ClientCallback<ClientConnection> { } void setupResponseListner(final ClientExchange clientExchange) { - clientExchange.setResponseListener(on(response -> { + clientExchange.setResponseListener(on((ClientExchange response) -> { LOG.trace("completed: {}", clientExchange); try { @@ -207,8 +209,38 @@ class UndertowClientCallback implements ClientCallback<ClientConnection> { final UndertowHttpBinding binding = endpoint.getUndertowHttpBinding(); final Message result = binding.toCamelMessage(clientExchange, exchange); - // we end Camel exchange here - finish(result); + // if there was a http error code then check if we should throw an exception + final int code = clientExchange.getResponse().getResponseCode(); + LOG.debug("Http responseCode: {}", code); + + final boolean ok = HttpHelper.isStatusCodeOk(code, "200-299"); + if (!ok && throwExceptionOnFailure) { + // operation failed so populate exception to throw + final String uri = endpoint.getHttpURI().toString(); + final String statusText = clientExchange.getResponse().getStatus(); + HeaderMap headerMap = clientExchange.getResponse().getResponseHeaders(); + Map<String, String> headers = new HashMap<>(); + for (HttpString headerName : headerMap.getHeaderNames()) { + headers.put(headerName.toString(), headerMap.get(headerName).toString()); + } + final Exception cause = new HttpOperationFailedException(uri, code, statusText, null, headers, result.getBody(String.class)); + + hasFailedWith(cause); + + if (result != null) { + if (ExchangeHelper.isOutCapable(exchange)) { + exchange.setOut(result); + } else { + exchange.setIn(result); + } + } + + // true failure exception may get overwritten with connection close failure, so re-set cause + exchange.setException(cause); + } else { + // we end Camel exchange here + finish(result); + } } catch (final Exception e) { hasFailedWith(e); } http://git-wip-us.apache.org/repos/asf/camel/blob/d490978e/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerThrowExceptionOnFailureTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerThrowExceptionOnFailureTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerThrowExceptionOnFailureTest.java index f0d2472..b281699 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerThrowExceptionOnFailureTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerThrowExceptionOnFailureTest.java @@ -16,14 +16,12 @@ */ package org.apache.camel.component.undertow; +import org.apache.camel.CamelExecutionException; import org.apache.camel.Exchange; import org.apache.camel.builder.RouteBuilder; -import org.junit.Ignore; +import org.apache.camel.http.common.HttpOperationFailedException; import org.junit.Test; -import java.util.concurrent.TimeUnit; - -@Ignore("CAMEL-11111") public class UndertowProducerThrowExceptionOnFailureTest extends BaseUndertowTest { @Test @@ -41,11 +39,11 @@ public class UndertowProducerThrowExceptionOnFailureTest extends BaseUndertowTes public void testFailWithException() throws Exception { try { String out = template().requestBody("undertow:http://localhost:{{port}}/fail?throwExceptionOnFailure=true", null, String.class); - } catch (Throwable t) { - //t.printStackTrace(); - assertNotNull(t); + fail("Should throw an exception"); + } catch (CamelExecutionException e) { + HttpOperationFailedException cause = (HttpOperationFailedException) e.getCause(); + assertEquals(404, cause.getStatusCode()); } - fail("Should throw an exception"); } @Override