Repository: camel Updated Branches: refs/heads/master 56ddf955f -> 39174b7e7
Fix memory leak in undertow producer Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/62352740 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/62352740 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/62352740 Branch: refs/heads/master Commit: 6235274060324d405a6d4f9b3542ca7a4a31689a Parents: 56ddf95 Author: James Netherton <jamesnether...@gmail.com> Authored: Tue Nov 17 16:06:02 2015 +0000 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Nov 18 14:45:14 2015 +0100 ---------------------------------------------------------------------- .../undertow/DefaultUndertowHttpBinding.java | 83 ++++++++++---------- .../component/undertow/UndertowProducer.java | 20 ++--- .../undertow/UndertowProducerTest.java | 1 - .../undertow/rest/RestApiUndertowTest.java | 2 - ...UndertowHttpBindingModeAutoWithJsonTest.java | 2 +- ...tUndertowHttpBindingModeAutoWithXmlTest.java | 2 +- .../RestUndertowHttpBindingModeJsonTest.java | 2 +- .../RestUndertowHttpBindingModeXmlTest.java | 2 +- .../rest/RestUndertowHttpPojoInOutTest.java | 4 +- .../RestUndertowHttpPostJsonJaxbPojoTest.java | 2 +- .../RestUndertowHttpPostJsonPojoListTest.java | 2 +- .../rest/RestUndertowHttpPostJsonPojoTest.java | 2 +- .../RestUndertowHttpPostXmlJaxbPojoTest.java | 2 +- 13 files changed, 63 insertions(+), 63 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java index 481d29a..f3310e1 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/DefaultUndertowHttpBinding.java @@ -16,6 +16,7 @@ */ package org.apache.camel.component.undertow; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; @@ -28,14 +29,13 @@ import java.util.Map; import io.undertow.client.ClientExchange; import io.undertow.client.ClientRequest; import io.undertow.client.ClientResponse; -import io.undertow.connector.ByteBufferPool; -import io.undertow.connector.PooledByteBuffer; import io.undertow.predicate.Predicate; import io.undertow.server.HttpServerExchange; import io.undertow.util.Headers; import io.undertow.util.HttpString; import io.undertow.util.Methods; import io.undertow.util.MimeMappings; + import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.TypeConverter; @@ -46,6 +46,8 @@ import org.apache.camel.util.MessageHelper; import org.apache.camel.util.ObjectHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.xnio.ChannelListener; +import org.xnio.channels.StreamSourceChannel; /** * DefaultUndertowHttpBinding represent binding used by default, if user doesn't provide any. @@ -83,8 +85,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding { //extract body if the method is allowed to have one //body is extracted as byte[] then auto TypeConverter kicks in if (Methods.POST.equals(httpExchange.getRequestMethod()) || Methods.PUT.equals(httpExchange.getRequestMethod())) { - byte[] bytes = readRequestBody(httpExchange); - result.setBody(bytes); + result.setBody(readFromChannel(httpExchange.getRequestChannel())); } else { result.setBody(null); } @@ -99,7 +100,7 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding { //retrieve response headers populateCamelHeaders(clientExchange.getResponse(), result.getHeaders(), exchange); - result.setBody(readResponseBody(clientExchange)); + result.setBody(readFromChannel(clientExchange.getResponseChannel())); return result; } @@ -322,40 +323,42 @@ public class DefaultUndertowHttpBinding implements UndertowHttpBinding { return body; } - private byte[] readRequestBody(HttpServerExchange httpExchange) throws IOException { - ByteBufferPool bufferPool = httpExchange.getConnection().getByteBufferPool(); - PooledByteBuffer pooledByteBuffer = bufferPool.allocate(); - ByteBuffer byteBuffer = pooledByteBuffer.getBuffer(); - - byteBuffer.clear(); - - httpExchange.getRequestChannel().read(byteBuffer); - int pos = byteBuffer.position(); - byteBuffer.rewind(); - byte[] bytes = new byte[pos]; - byteBuffer.get(bytes); - - byteBuffer.clear(); - pooledByteBuffer.close(); - return bytes; - } - - private byte[] readResponseBody(ClientExchange httpExchange) throws IOException { - ByteBufferPool bufferPool = httpExchange.getConnection().getBufferPool(); - PooledByteBuffer pooledByteBuffer = bufferPool.allocate(); - ByteBuffer byteBuffer = pooledByteBuffer.getBuffer(); - - byteBuffer.clear(); - - httpExchange.getResponseChannel().read(byteBuffer); - int pos = byteBuffer.position(); - byteBuffer.rewind(); - byte[] bytes = new byte[pos]; - byteBuffer.get(bytes); - - byteBuffer.clear(); - pooledByteBuffer.close(); - return bytes; + private byte[] readFromChannel(StreamSourceChannel source) throws IOException { + final ByteArrayOutputStream out = new ByteArrayOutputStream(); + final ByteBuffer buffer = ByteBuffer.wrap(new byte[1024]); + + for (; ; ) { + int res = source.read(buffer); + if (res == -1) { + return out.toByteArray(); + } else if (res == 0) { + source.getReadSetter().set(new ChannelListener<StreamSourceChannel>() { + @Override + public void handleEvent(StreamSourceChannel channel) { + for (; ; ) { + try { + int res = channel.read(buffer); + if (res == -1 || res == 0) { + out.toByteArray(); + return; + } else { + buffer.flip(); + out.write(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.arrayOffset() + buffer.limit()); + buffer.clear(); + } + } catch (IOException e) { + LOG.error("Exception reading from channel {}", e); + } + } + } + }); + source.resumeReads(); + return out.toByteArray(); + } else { + buffer.flip(); + out.write(buffer.array(), buffer.arrayOffset() + buffer.position(), buffer.arrayOffset() + buffer.limit()); + buffer.clear(); + } + } } - } http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java index 8e13e52..641cdbd 100644 --- a/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java +++ b/components/camel-undertow/src/main/java/org/apache/camel/component/undertow/UndertowProducer.java @@ -16,19 +16,20 @@ */ package org.apache.camel.component.undertow; -import java.io.IOException; -import java.net.URI; -import java.nio.ByteBuffer; - import io.undertow.client.ClientCallback; import io.undertow.client.ClientConnection; import io.undertow.client.ClientExchange; import io.undertow.client.ClientRequest; import io.undertow.client.UndertowClient; -import io.undertow.server.XnioByteBufferPool; +import io.undertow.server.DefaultByteBufferPool; import io.undertow.util.Headers; import io.undertow.util.HttpString; import io.undertow.util.Protocols; + +import java.io.IOException; +import java.net.URI; +import java.nio.ByteBuffer; + import org.apache.camel.AsyncCallback; import org.apache.camel.Exchange; import org.apache.camel.Message; @@ -38,8 +39,6 @@ import org.apache.camel.util.ExchangeHelper; import org.apache.camel.util.IOHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.xnio.BufferAllocator; -import org.xnio.ByteBufferSlicePool; import org.xnio.IoFuture; import org.xnio.OptionMap; import org.xnio.Xnio; @@ -56,7 +55,7 @@ public class UndertowProducer extends DefaultAsyncProducer { private static final Logger LOG = LoggerFactory.getLogger(UndertowProducer.class); private UndertowEndpoint endpoint; private XnioWorker worker; - private ByteBufferSlicePool pool; + private DefaultByteBufferPool pool; private OptionMap options; public UndertowProducer(UndertowEndpoint endpoint, OptionMap options) { @@ -77,7 +76,7 @@ public class UndertowProducer extends DefaultAsyncProducer { try { final UndertowClient client = UndertowClient.getInstance(); - IoFuture<ClientConnection> connect = client.connect(endpoint.getHttpURI(), worker, new XnioByteBufferPool(pool), options); + IoFuture<ClientConnection> connect = client.connect(endpoint.getHttpURI(), worker, pool, options); // creating the url to use takes 2-steps String url = UndertowHelper.createURL(exchange, getEndpoint()); @@ -127,7 +126,8 @@ public class UndertowProducer extends DefaultAsyncProducer { protected void doStart() throws Exception { super.doStart(); - pool = new ByteBufferSlicePool(BufferAllocator.DIRECT_BYTE_BUFFER_ALLOCATOR, 8192, 8192 * 8192); + pool = new DefaultByteBufferPool(true, 8192); + worker = Xnio.getInstance().createWorker(options); LOG.debug("Created worker: {} with options: {}", worker, options); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java index 03059ef..ed6f2a4 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/UndertowProducerTest.java @@ -66,7 +66,6 @@ public class UndertowProducerTest extends BaseUndertowTest { @Test public void testHttpSimpleHeaderAndBody() throws Exception { - getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_METHOD, "POST"); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestApiUndertowTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestApiUndertowTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestApiUndertowTest.java index 946c0b5..beece9e 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestApiUndertowTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestApiUndertowTest.java @@ -32,8 +32,6 @@ public class RestApiUndertowTest extends BaseUndertowTest { public void testApi() throws Exception { String out = template.requestBody("undertow:http://localhost:{{port}}/api-doc", null, String.class); assertNotNull(out); - log.info(out); - assertTrue(out.contains("\"version\" : \"1.2.3\"")); assertTrue(out.contains("\"title\" : \"The hello rest thing\"")); assertTrue(out.contains("\"/hello/bye/{name}\"")); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithJsonTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithJsonTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithJsonTest.java index dd03f09..e5fcd37 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithJsonTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithJsonTest.java @@ -31,7 +31,7 @@ public class RestUndertowHttpBindingModeAutoWithJsonTest extends BaseUndertowTes mock.message(0).body().isInstanceOf(UserPojo.class); String body = "{\"id\": 123, \"name\": \"Donald Duck\"}"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithXmlTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithXmlTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithXmlTest.java index 528ca4b..b94f25a 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithXmlTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeAutoWithXmlTest.java @@ -31,7 +31,7 @@ public class RestUndertowHttpBindingModeAutoWithXmlTest extends BaseUndertowTest mock.message(0).body().isInstanceOf(UserJaxbPojo.class); String body = "<user name=\"Donald Duck\" id=\"123\"></user>"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeJsonTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeJsonTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeJsonTest.java index d28b45e..100afee 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeJsonTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeJsonTest.java @@ -32,7 +32,7 @@ public class RestUndertowHttpBindingModeJsonTest extends BaseUndertowTest { mock.message(0).body().isInstanceOf(UserJaxbPojo.class); String body = "{\"id\": 123, \"name\": \"Donald Duck\"}"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeXmlTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeXmlTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeXmlTest.java index 33cb016..f9baba4 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeXmlTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpBindingModeXmlTest.java @@ -31,7 +31,7 @@ public class RestUndertowHttpBindingModeXmlTest extends BaseUndertowTest { mock.message(0).body().isInstanceOf(UserJaxbPojo.class); String body = "<user name=\"Donald Duck\" id=\"123\"></user>"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoInOutTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoInOutTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoInOutTest.java index efc9a34..68ccc8c 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoInOutTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPojoInOutTest.java @@ -26,7 +26,7 @@ public class RestUndertowHttpPojoInOutTest extends BaseUndertowTest { @Test public void testUndertowPojoInOut() throws Exception { String body = "{\"id\": 123, \"name\": \"Donald Duck\"}"; - String out = template.requestBody("undertow:http://localhost:" + getPort() + "/users/lives", body, String.class); + String out = template.requestBody("undertow:http://localhost:{{port}}/users/lives", body, String.class); assertNotNull(out); assertEquals("{\"iso\":\"EN\",\"country\":\"England\"}", out); @@ -34,7 +34,7 @@ public class RestUndertowHttpPojoInOutTest extends BaseUndertowTest { @Test public void testUndertowGetRequest() throws Exception { - String out = template.requestBody("undertow:http://localhost:" + getPort() + "/users/lives", null, String.class); + String out = template.requestBody("undertow:http://localhost:{{port}}/users/lives", null, String.class); assertNotNull(out); assertEquals("{\"iso\":\"EN\",\"country\":\"England\"}", out); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonJaxbPojoTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonJaxbPojoTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonJaxbPojoTest.java index 0d7d2ab..375acad 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonJaxbPojoTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonJaxbPojoTest.java @@ -31,7 +31,7 @@ public class RestUndertowHttpPostJsonJaxbPojoTest extends BaseUndertowTest { mock.message(0).body().isInstanceOf(UserJaxbPojo.class); String body = "{\"id\": 123, \"name\": \"Donald Duck\"}"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoListTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoListTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoListTest.java index 8a42dd1..27a5a2c 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoListTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoListTest.java @@ -32,7 +32,7 @@ public class RestUndertowHttpPostJsonPojoListTest extends BaseUndertowTest { mock.expectedMessageCount(1); String body = "[ {\"id\": 123, \"name\": \"Donald Duck\"}, {\"id\": 456, \"name\": \"John Doe\"} ]"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoTest.java index 10b7b43..02370d6 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostJsonPojoTest.java @@ -31,7 +31,7 @@ public class RestUndertowHttpPostJsonPojoTest extends BaseUndertowTest { mock.message(0).body().isInstanceOf(UserPojo.class); String body = "{\"id\": 123, \"name\": \"Donald Duck\"}"; - template.sendBody("undertow:http://localhost:" + getPort() + "/users/new", body); + template.sendBody("undertow:http://localhost:{{port}}/users/new", body); assertMockEndpointsSatisfied(); http://git-wip-us.apache.org/repos/asf/camel/blob/62352740/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostXmlJaxbPojoTest.java ---------------------------------------------------------------------- diff --git a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostXmlJaxbPojoTest.java b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostXmlJaxbPojoTest.java index 1b15bf0..b4d0e44 100644 --- a/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostXmlJaxbPojoTest.java +++ b/components/camel-undertow/src/test/java/org/apache/camel/component/undertow/rest/RestUndertowHttpPostXmlJaxbPojoTest.java @@ -32,7 +32,7 @@ public class RestUndertowHttpPostXmlJaxbPojoTest extends BaseUndertowTest { mock.message(0).body().isInstanceOf(UserJaxbPojo.class); String body = "<user name=\"Donald Duck\" id=\"123\"></user>"; - template.sendBodyAndHeader("undertow:http://localhost:" + getPort() + "/users/new", body, Exchange.CONTENT_TYPE, "text/xml"); + template.sendBodyAndHeader("undertow:http://localhost:{{port}}/users/new", body, Exchange.CONTENT_TYPE, "text/xml"); assertMockEndpointsSatisfied();