You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2017/04/09 16:01:36 UTC

camel git commit: CAMEL-11111: correctly copy response’s headers and body to exception

Repository: camel
Updated Branches:
  refs/heads/master 9c878faf3 -> 9e09dd422


CAMEL-11111: correctly copy response\u2019s headers and body to exception


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/9e09dd42
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/9e09dd42
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/9e09dd42

Branch: refs/heads/master
Commit: 9e09dd4223491215e7b389d1741539b71605a833
Parents: 9c878fa
Author: Scott Cranton <sc...@cranton.com>
Authored: Sun Apr 9 11:26:32 2017 -0400
Committer: Scott Cranton <sc...@cranton.com>
Committed: Sun Apr 9 11:26:32 2017 -0400

----------------------------------------------------------------------
 .../undertow/UndertowClientCallback.java        | 22 +++++++------
 ...rtowProducerThrowExceptionOnFailureTest.java | 33 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/9e09dd42/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 6b48203..8f312e8 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
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.concurrent.BlockingDeque;
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 import io.undertow.client.ClientCallback;
 import io.undertow.client.ClientConnection;
@@ -218,15 +219,17 @@ class UndertowClientCallback implements ClientCallback<ClientConnection> {
                     // 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()) {
-                        Object value = headerMap.get(headerName);
-                        if (value != null) {
-                            headers.put(headerName.toString(), value.toString());
-                        }
-                    }
-                    final Exception cause = new HttpOperationFailedException(uri, code, statusText, null, headers, result.getBody(String.class));
+
+                    // Convert Message headers (Map<String, Object>) to Map<String, String> as expected by HttpOperationsFailedException
+                    // using Message versus clientExchange as its header values have extra formatting
+                    final Map<String, String> headers = result.getHeaders().entrySet()
+                            .stream()
+                            .collect(Collectors.toMap(Map.Entry::getKey, (entry) -> entry.getValue().toString()));
+
+                    // Since result (Message) isn't associated with an Exchange yet, you can not use result.getBody(String.class)
+                    final String bodyText = ExchangeHelper.convertToType(exchange, String.class, result.getBody());
+
+                    final Exception cause = new HttpOperationFailedException(uri, code, statusText, null, headers, bodyText);
 
                     if (ExchangeHelper.isOutCapable(exchange)) {
                         exchange.setOut(result);
@@ -236,7 +239,6 @@ class UndertowClientCallback implements ClientCallback<ClientConnection> {
 
                     // make sure to fail with HttpOperationFailedException
                     hasFailedWith(cause);
-
                 } else {
                     // we end Camel exchange here
                     finish(result);

http://git-wip-us.apache.org/repos/asf/camel/blob/9e09dd42/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 b281699..9675080 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,10 +16,12 @@
  */
 package org.apache.camel.component.undertow;
 
+import com.fasterxml.jackson.core.JsonParseException;
 import org.apache.camel.CamelExecutionException;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.http.common.HttpOperationFailedException;
+import org.apache.camel.model.rest.RestBindingMode;
 import org.junit.Test;
 
 public class UndertowProducerThrowExceptionOnFailureTest extends BaseUndertowTest {
@@ -46,11 +48,42 @@ public class UndertowProducerThrowExceptionOnFailureTest extends BaseUndertowTes
         }
     }
 
+    @Test
+    public void testFailWithException2() throws Exception {
+        try {
+            String out = fluentTemplate().to("undertow:http://localhost:{{port2}}/test/fail?throwExceptionOnFailure=true")
+                    .withHeader(Exchange.HTTP_METHOD, "PUT")
+                    .withBody("This is not JSON format")
+                    .request(String.class);
+
+            fail("Should throw an exception");
+        } catch (CamelExecutionException e) {
+            HttpOperationFailedException httpException = (HttpOperationFailedException) e.getCause();
+
+            assertEquals(400, httpException.getStatusCode());
+            assertEquals("text/plain", httpException.getResponseHeaders().get(Exchange.CONTENT_TYPE));
+            assertEquals("Invalid json data", httpException.getResponseBody());
+        }
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
+                restConfiguration()
+                        .component("undertow").port(getPort2())
+                        .bindingMode(RestBindingMode.json);
+
+                onException(JsonParseException.class)
+                        .handled(true)
+                        .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(400))
+                        .setHeader(Exchange.CONTENT_TYPE, constant("text/plain"))
+                        .setBody().constant("Invalid json data");
+
+                rest("/test")
+                        .put("/fail").to("mock:test");
+
                 from("undertow:http://localhost:{{port}}/fail")
                         .setHeader(Exchange.HTTP_RESPONSE_CODE).constant(404)
                         .transform(constant("Fail"));