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

Reply via email to