http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestBeanTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestBeanTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestBeanTest.java new file mode 100644 index 0000000..b1d4dbc --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestBeanTest.java @@ -0,0 +1,54 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.nio.charset.Charset; + +import io.netty.handler.codec.http.FullHttpRequest; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpAccessHttpRequestBeanTest extends BaseNettyTest { + + @Test + public void testAccessHttpRequest() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("World"); + + String out = template.requestBody("netty4-http:http://localhost:{{port}}/foo", "World", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .transform().method(NettyHttpAccessHttpRequestBeanTest.class, "myTransformer"); + } + }; + } + + public static String myTransformer(FullHttpRequest request) { + String in = request.content().toString(Charset.forName("UTF-8")); + return "Bye " + in; + } + +}
http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestTest.java new file mode 100644 index 0000000..aa3ce53 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpAccessHttpRequestTest.java @@ -0,0 +1,59 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import io.netty.handler.codec.http.HttpRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; + +import org.junit.Test; + +public class NettyHttpAccessHttpRequestTest extends BaseNettyTest { + + @Test + public void testAccessHttpRequest() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + + String out = template.requestBody("netty4-http:http://localhost:{{port}}/foo", "Hello World", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + // we can get the original http request + HttpRequest request = exchange.getIn(NettyHttpMessage.class).getHttpRequest(); + assertNotNull(request); + } + }) + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthConstraintMapperTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthConstraintMapperTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthConstraintMapperTest.java new file mode 100644 index 0000000..b2dc7f7 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthConstraintMapperTest.java @@ -0,0 +1,96 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("TODO fix it") +public class NettyHttpBasicAuthConstraintMapperTest extends BaseNettyTest { + + @Override + public void setUp() throws Exception { + System.setProperty("java.security.auth.login.config", "src/test/resources/myjaas.config"); + super.setUp(); + } + + @Override + public void tearDown() throws Exception { + System.clearProperty("java.security.auth.login.config"); + super.tearDown(); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + + NettyHttpSecurityConfiguration security = new NettyHttpSecurityConfiguration(); + security.setRealm("karaf"); + SecurityAuthenticator auth = new JAASSecurityAuthenticator(); + auth.setName("karaf"); + security.setSecurityAuthenticator(auth); + + SecurityConstraintMapping matcher = new SecurityConstraintMapping(); + matcher.addInclusion("/*"); + matcher.addExclusion("/public/*"); + security.setSecurityConstraint(matcher); + + jndi.bind("mySecurityConfig", security); + + return jndi; + } + + @Test + public void testBasicAuth() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello Public", "Hello World"); + + // we dont need auth for the public page + String out = template.requestBody("netty4-http:http://localhost:{{port}}/foo/public/hello.txt", "Hello Public", String.class); + assertEquals("Bye World", out); + + try { + template.requestBody("netty4-http:http://localhost:{{port}}/foo", "Hello World", String.class); + fail("Should send back 401"); + } catch (CamelExecutionException e) { + NettyHttpOperationFailedException cause = assertIsInstanceOf(NettyHttpOperationFailedException.class, e.getCause()); + assertEquals(401, cause.getStatusCode()); + } + + // username:password is scott:secret + String auth = "Basic c2NvdHQ6c2VjcmV0"; + out = template.requestBodyAndHeader("netty4-http:http://localhost:{{port}}/foo", "Hello World", "Authorization", auth, String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo?matchOnUriPrefix=true&securityConfiguration=#mySecurityConfig") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthCustomSecurityAuthenticatorTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthCustomSecurityAuthenticatorTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthCustomSecurityAuthenticatorTest.java new file mode 100644 index 0000000..7954212 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthCustomSecurityAuthenticatorTest.java @@ -0,0 +1,105 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import javax.security.auth.Subject; +import javax.security.auth.login.LoginException; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("TODO fix it") +public class NettyHttpBasicAuthCustomSecurityAuthenticatorTest extends BaseNettyTest { + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myAuthenticator", new MyAuthenticator()); + return jndi; + } + + @Test + public void testBasicAuth() throws Exception { + try { + template.requestBody("netty4-http:http://localhost:{{port}}/foo", "Hello World", String.class); + fail("Should send back 401"); + } catch (CamelExecutionException e) { + NettyHttpOperationFailedException cause = assertIsInstanceOf(NettyHttpOperationFailedException.class, e.getCause()); + assertEquals(401, cause.getStatusCode()); + } + + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + + // username:password is scott:secret + String auth = "Basic c2NvdHQ6c2VjcmV0"; + String out = template.requestBodyAndHeader("netty4-http:http://localhost:{{port}}/foo", "Hello World", "Authorization", auth, String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo?securityConfiguration.realm=foo&securityConfiguration.securityAuthenticator=#myAuthenticator") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + + private final class MyAuthenticator implements SecurityAuthenticator { + + public void setName(String name) { + // noop + } + + public String getName() { + return null; + } + + @Override + public void setRoleClassNames(String names) { + // noop + } + + @Override + public Subject login(HttpPrincipal principal) throws LoginException { + if (!principal.getPassword().equalsIgnoreCase("secret")) { + throw new LoginException("Login denied"); + } + // login success so return a subject + return new Subject(); + } + + @Override + public void logout(Subject subject) throws LoginException { + // noop + } + + @Override + public String getUserRoles(Subject subject) { + return null; + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthTest.java new file mode 100644 index 0000000..ecaefff --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBasicAuthTest.java @@ -0,0 +1,104 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.CamelExecutionException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.junit.Test; + +public class NettyHttpBasicAuthTest extends BaseNettyTest { + + @Override + public void setUp() throws Exception { + System.setProperty("java.security.auth.login.config", "src/test/resources/myjaas.config"); + super.setUp(); + } + + @Override + public void tearDown() throws Exception { + System.clearProperty("java.security.auth.login.config"); + super.tearDown(); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + + NettyHttpSecurityConfiguration security = new NettyHttpSecurityConfiguration(); + security.setRealm("karaf"); + SecurityAuthenticator auth = new JAASSecurityAuthenticator(); + auth.setName("karaf"); + security.setSecurityAuthenticator(auth); + + jndi.bind("mySecurityConfig", security); + + return jndi; + } + + @Test + public void testBasicAuthFailed() throws Exception { + try { + template.requestBody("netty4-http:http://localhost:{{port}}/foo", "Hello World", String.class); + fail("Should send back 401"); + } catch (CamelExecutionException e) { + NettyHttpOperationFailedException cause = assertIsInstanceOf(NettyHttpOperationFailedException.class, e.getCause()); + assertEquals(401, cause.getStatusCode()); + } + + } + + @Test + public void testBasicAuthSuccessed() throws Exception { + + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(NettyHttpConstants.HTTP_AUTHENTICATION, "Basic"); + + // username:password is scott:secret + String auth = "Basic c2NvdHQ6c2VjcmV0"; + String out = template.requestBodyAndHeader("netty4-http:http://localhost:{{port}}/foo", "Hello World", "Authorization", auth, String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testInvalidCredentials() throws Exception { + // username:password is scott:typo + try { + // password is invalid so we should get a 401 + String auth = "Basic c2NvdHQ6dHlwbw=="; + template.requestBodyAndHeader("netty4-http:http://localhost:{{port}}/foo", "Hello World", "Authorization", auth, String.class); + } catch (CamelExecutionException e) { + NettyHttpOperationFailedException cause = assertIsInstanceOf(NettyHttpOperationFailedException.class, e.getCause()); + assertEquals(401, cause.getStatusCode()); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo?securityConfiguration=#mySecurityConfig") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBindingPreservePostFormUrlEncodedBodyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBindingPreservePostFormUrlEncodedBodyTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBindingPreservePostFormUrlEncodedBodyTest.java new file mode 100644 index 0000000..3f96d39 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBindingPreservePostFormUrlEncodedBodyTest.java @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpMethods; +import org.junit.Test; + +public class NettyHttpBindingPreservePostFormUrlEncodedBodyTest extends BaseNettyTest { + + @Test + public void testSendToNetty() throws Exception { + Exchange exchange = template.request("netty4-http:http://localhost:{{port}}/myapp/myservice?query1=a&query2=b", new Processor() { + + public void process(Exchange exchange) throws Exception { + exchange.getIn().setBody("b1=x&b2=y"); + exchange.getIn().setHeader("content-type", "application/x-www-form-urlencoded"); + exchange.getIn().setHeader(Exchange.HTTP_METHOD, HttpMethods.POST); + } + + }); + // convert the response to a String + String body = exchange.getOut().getBody(String.class); + assertEquals("Request message is OK", body); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("netty4-http:http://localhost:{{port}}/myapp/myservice").process(new Processor() { + public void process(Exchange exchange) throws Exception { + String body = exchange.getIn().getBody(String.class); + + // for unit testing make sure we got right message + assertEquals("The body message is wrong", "b1=x&b2=y", body); + assertEquals("Get a wrong query parameter from the message header", "a", exchange.getIn().getHeader("query1")); + assertEquals("Get a wrong query parameter from the message header", "b", exchange.getIn().getHeader("query2")); + assertEquals("Get a wrong form parameter from the message header", "x", exchange.getIn().getHeader("b1")); + assertEquals("Get a wrong form parameter from the message header", "y", exchange.getIn().getHeader("b2")); + + // send a response + exchange.getOut().getHeaders().clear(); + exchange.getOut().setHeader(Exchange.CONTENT_TYPE, "text/plain"); + exchange.getOut().setBody("Request message is OK"); + } + }); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeEncodedPathTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeEncodedPathTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeEncodedPathTest.java new file mode 100644 index 0000000..59c82f6 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeEncodedPathTest.java @@ -0,0 +1,66 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpBridgeEncodedPathTest extends BaseNettyTest { + + private int port1; + private int port2; + + @Test + public void testHttpClient() throws Exception { + String response = template.requestBody("http://localhost:" + port2 + "/nettyTestRouteA?param1=%2B447777111222", null, String.class); + assertEquals("Get a wrong response", "param1=+447777111222", response); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + + port1 = getPort(); + port2 = getNextPort(); + + errorHandler(noErrorHandler()); + + Processor serviceProc = new Processor() { + public void process(Exchange exchange) throws Exception { + // %2B becomes decoded to a space + Object s = exchange.getIn().getHeader("param1"); + // can be either + or %2B + assertTrue(s.equals(" 447777111222") || s.equals("+447777111222") || s.equals("%2B447777111222")); + + // send back the query + exchange.getOut().setBody(exchange.getIn().getHeader(Exchange.HTTP_QUERY)); + } + }; + from("netty4-http://http://localhost:" + port2 + "/nettyTestRouteA?matchOnUriPrefix=true") + .log("Using NettyTestRouteA route: CamelHttpPath=[${header.CamelHttpPath}], CamelHttpUri=[${header.CamelHttpUri}]") + .to("netty4-http://http://localhost:" + port1 + "/nettyTestRouteB?throwExceptionOnFailure=false&bridgeEndpoint=true"); + + from("netty4-http://http://localhost:" + port1 + "/nettyTestRouteB?matchOnUriPrefix=true") + .log("Using NettyTestRouteB route: CamelHttpPath=[${header.CamelHttpPath}], CamelHttpUri=[${header.CamelHttpUri}]") + .process(serviceProc); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeRouteUsingHttpClientTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeRouteUsingHttpClientTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeRouteUsingHttpClientTest.java new file mode 100644 index 0000000..ea598cd --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpBridgeRouteUsingHttpClientTest.java @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.io.ByteArrayInputStream; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.Processor; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpBridgeRouteUsingHttpClientTest extends BaseNettyTest { + + private int port1; + private int port2; + + @Test + public void testBridge() throws Exception { + String response = template.requestBodyAndHeader("http://localhost:" + port2 + "/test/hello", + new ByteArrayInputStream("This is a test".getBytes()), "Content-Type", "application/xml", String.class); + assertEquals("Get a wrong response", "/", response); + + response = template.requestBody("http://localhost:" + port1 + "/hello/world", "hello", String.class); + assertEquals("Get a wrong response", "/hello/world", response); + + try { + template.requestBody("http://localhost:" + port2 + "/hello/world", "hello", String.class); + fail("Expect exception here!"); + } catch (Exception ex) { + assertTrue("We should get a RuntimeCamelException", ex instanceof RuntimeCamelException); + } + } + + @Test + public void testSendFormRequestMessage() throws Exception { + String out = template.requestBodyAndHeader("http://localhost:" + port2 + "/form", "username=abc&pass=password", Exchange.CONTENT_TYPE, "application/x-www-form-urlencoded", String.class); + assertEquals("Get a wrong response message", "username=abc&pass=password", out); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + port1 = getPort(); + port2 = getNextPort(); + + errorHandler(noErrorHandler()); + + Processor serviceProc = new Processor() { + public void process(Exchange exchange) throws Exception { + // get the request URL and copy it to the request body + String uri = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class); + exchange.getOut().setBody(uri); + } + }; + from("netty4-http:http://localhost:" + port2 + "/test/hello") + .to("http://localhost:" + port1 + "?throwExceptionOnFailure=false&bridgeEndpoint=true"); + + from("netty4-http:http://localhost:" + port1 + "?matchOnUriPrefix=true").process(serviceProc); + + // check the from request + from("netty4-http:http://localhost:" + port2 + "/form?bridgeEndpoint=true") + .process(new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + // just take out the message body and send it back + Message in = exchange.getIn(); + String request = in.getBody(String.class); + exchange.getOut().setBody(request); + } + + }); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpCharacterEncodingTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpCharacterEncodingTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpCharacterEncodingTest.java new file mode 100644 index 0000000..6776b42 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpCharacterEncodingTest.java @@ -0,0 +1,63 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpCharacterEncodingTest extends BaseNettyTest { + + @Test + public void testSendToNetty() throws Exception { + Exchange exchange = template.request("netty4-http:http://localhost:{{port}}/myapp/myservice", new Processor() { + + public void process(Exchange exchange) throws Exception { + exchange.getIn().setBody("Hello World Thai Elephant \u0E08"); + exchange.getIn().setHeader("Content-Type", "text/html; charset=utf-8"); + } + + }); + // convert the response to a String + String body = exchange.getOut().getBody(String.class); + assertEquals("Response message is Thai Elephant \u0E08", body); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("netty4-http:http://localhost:{{port}}/myapp/myservice").process(new MyBookService()); + } + }; + } + + public class MyBookService implements Processor { + public void process(Exchange exchange) throws Exception { + // just get the body as a string + String body = exchange.getIn().getBody(String.class); + + // for unit testing make sure we got right message + assertEquals("Hello World Thai Elephant \u0E08", body); + + // send a html response + exchange.getOut().setHeader("Content-Type", "text/html; charset=utf-8"); + exchange.getOut().setBody("Response message is Thai Elephant \u0E08"); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientChunkedTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientChunkedTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientChunkedTest.java new file mode 100644 index 0000000..984b047 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientChunkedTest.java @@ -0,0 +1,46 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpClientChunkedTest extends BaseNettyTest { + + @Test + public void testHttpSimple() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + + String out = template.requestBody("netty4-http:http://localhost:{{port}}/foo", "Hello World", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientExpectContinueTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientExpectContinueTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientExpectContinueTest.java new file mode 100644 index 0000000..365d76a --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpClientExpectContinueTest.java @@ -0,0 +1,58 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.DefaultExchange; +import org.junit.Ignore; +import org.junit.Test; + +@Ignore("TODO Fix it, need to send the response back") +public class NettyHttpClientExpectContinueTest extends BaseNettyTest { + + @Test + public void testHttpExpect100Continue() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("request body"); + + String body = "request body"; + DefaultExchange exchange = new DefaultExchange(context); + + exchange.getIn().setHeader("Expect", "100-continue"); + exchange.getIn().setBody(body); + + Exchange result = template.send("netty4-http:http://localhost:{{port}}/foo", exchange); + + assertFalse(result.isFailed()); + assertEquals("Bye World", result.getIn().getBody(String.class)); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpComponentConfigurationAndDocumentationTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpComponentConfigurationAndDocumentationTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpComponentConfigurationAndDocumentationTest.java new file mode 100644 index 0000000..db5186f --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpComponentConfigurationAndDocumentationTest.java @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.CamelContext; +import org.apache.camel.ComponentConfiguration; +import org.apache.camel.EndpointConfiguration; +import org.apache.camel.impl.DefaultCamelContext; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.junit.Test; + +public class NettyHttpComponentConfigurationAndDocumentationTest extends CamelTestSupport { + + @Override + public boolean isUseRouteBuilder() { + return false; + } + + @Test + public void testComponentConfiguration() throws Exception { + NettyHttpComponent comp = context.getComponent("netty4-http", NettyHttpComponent.class); + EndpointConfiguration conf = comp.createConfiguration("netty4-http:tcp://localhost:5150?sync=true" + + "&httpMethodRestrict=POST&traceEnabled=true"); + + assertEquals("true", conf.getParameter("traceEnabled")); + assertEquals("POST", conf.getParameter("httpMethodRestrict")); + + ComponentConfiguration compConf = comp.createComponentConfiguration(); + String json = compConf.createParameterJsonSchema(); + assertNotNull(json); + + assertTrue(json.contains("\"httpMethodRestrict\": { \"type\": \"string\" }")); + assertTrue(json.contains("\"traceEnabled\": { \"type\": \"boolean\" }")); + } + + @Test + public void testComponentDocumentation() throws Exception { + CamelContext context = new DefaultCamelContext(); + String html = context.getComponentDocumentation("netty4-http"); + assertNotNull("Should have found some auto-generated HTML if on Java 7", html); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpContentTypeTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpContentTypeTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpContentTypeTest.java new file mode 100644 index 0000000..6a9fbcb --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpContentTypeTest.java @@ -0,0 +1,87 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.nio.charset.Charset; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpContentTypeTest extends BaseNettyTest { + + @Test + public void testContentType() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain; charset=\"iso-8859-1\""); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_CHARACTER_ENCODING, "iso-8859-1"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://0.0.0.0:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedPropertyReceived(Exchange.CHARSET_NAME, "iso-8859-1"); + + byte[] data = "Hello World".getBytes(Charset.forName("iso-8859-1")); + String out = template.requestBodyAndHeader("netty4-http:http://0.0.0.0:{{port}}/foo", data, + "content-type", "text/plain; charset=\"iso-8859-1\"", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testContentTypeWithAction() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.CONTENT_TYPE, "text/plain;charset=\"iso-8859-1\";action=\"http://somewhere.com/foo\""); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_CHARACTER_ENCODING, "iso-8859-1"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://0.0.0.0:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedPropertyReceived(Exchange.CHARSET_NAME, "iso-8859-1"); + + byte[] data = "Hello World".getBytes(Charset.forName("iso-8859-1")); + String out = template.requestBodyAndHeader("netty4-http:http://0.0.0.0:{{port}}/foo", data, + "content-type", "text/plain;charset=\"iso-8859-1\";action=\"http://somewhere.com/foo\"", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testContentTypeWithActionAndPlus() throws Exception { + getMockEndpoint("mock:input").expectedBodiesReceived("Hello World"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.CONTENT_TYPE, "application/soap+xml;charset=\"utf-8\";action=\"http://somewhere.com/foo\""); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_CHARACTER_ENCODING, "utf-8"); + getMockEndpoint("mock:input").expectedHeaderReceived(Exchange.HTTP_URL, "http://0.0.0.0:" + getPort() + "/foo"); + getMockEndpoint("mock:input").expectedPropertyReceived(Exchange.CHARSET_NAME, "utf-8"); + + byte[] data = "Hello World".getBytes(Charset.forName("utf-8")); + String out = template.requestBodyAndHeader("netty4-http:http://0.0.0.0:{{port}}/foo", data, + "content-type", "application/soap+xml;charset=\"utf-8\";action=\"http://somewhere.com/foo\"", String.class); + assertEquals("Bye World", out); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://0.0.0.0:{{port}}/foo") + .to("mock:input") + .transform().constant("Bye World"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpConvertPayloadToInputStreamTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpConvertPayloadToInputStreamTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpConvertPayloadToInputStreamTest.java new file mode 100644 index 0000000..3f5c030 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpConvertPayloadToInputStreamTest.java @@ -0,0 +1,62 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.io.InputStream; +import java.util.List; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +public class NettyHttpConvertPayloadToInputStreamTest extends BaseNettyTest { + + protected String expectedBody = "<hello>world!</hello>"; + + @Test + public void testConvertPayloadToInputStream() throws Exception { + MockEndpoint mockEndpoint = getMockEndpoint("mock:result"); + mockEndpoint.expectedMessageCount(1); + + template.requestBodyAndHeader("netty4-http:http://localhost:{{port}}/test", expectedBody, "Content-Type", "application/xml"); + + mockEndpoint.assertIsSatisfied(); + List<Exchange> list = mockEndpoint.getReceivedExchanges(); + Exchange exchange = list.get(0); + assertNotNull("exchange", exchange); + + Message in = exchange.getIn(); + assertNotNull("in", in); + + Object actual = in.getBody(); + InputStream value = assertIsInstanceOf(InputStream.class, actual); + assertNotNull("InputStream", value); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + from("netty4-http:http://localhost:{{port}}/test"). + convertBodyTo(InputStream.class). + to("mock:result"); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriCustomHeaderFilterStrategyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriCustomHeaderFilterStrategyTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriCustomHeaderFilterStrategyTest.java new file mode 100644 index 0000000..9d78016 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriCustomHeaderFilterStrategyTest.java @@ -0,0 +1,70 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.impl.DefaultHeaderFilterStrategy; +import org.apache.camel.impl.JndiRegistry; +import org.junit.Test; + +public class NettyHttpEndpointUriCustomHeaderFilterStrategyTest extends BaseNettyTest { + + @Test + public void testEndpointUriWithCustomHeaderStrategy() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:outbound"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("Date", "31-03-2014"); + + Exchange out = template.request("direct:request", null); + + assertMockEndpointsSatisfied(); + + String date = out.getOut().getHeader("sub-date", String.class); + assertNull(date); + } + + @Override protected JndiRegistry createRegistry() throws Exception { + JndiRegistry registry = super.createRegistry(); + registry.bind("customHeaderFilterStrategy", new CustomHeaderFilterStrategy()); + return registry; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("direct:request") + .setHeader("Date", constant("31-03-2014")) + .to("netty4-http:http://localhost:{{port}}/myapp/mytest?headerFilterStrategy=#customHeaderFilterStrategy"); + + from("netty4-http:http://localhost:{{port}}/myapp/mytest") + .to("mock:outbound") + .setHeader("sub-date", constant("31-05-2014")); + } + }; + } + + private class CustomHeaderFilterStrategy extends DefaultHeaderFilterStrategy { + public CustomHeaderFilterStrategy() { + // allow all outbound headers to pass through but only filter out below inbound header + getInFilter().add("sub-date"); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueTest.java new file mode 100644 index 0000000..fa6220f --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueTest.java @@ -0,0 +1,57 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpEndpointUriEncodingIssueTest extends BaseNettyTest { + + @Test + public void testEndpointUriEncodingIssue() throws Exception { + String uri = "netty4-http:http://localhost:{{port}}/myapp/mytest?columns=totalsens,upsens&username=apiuser"; + String out = template.requestBody(uri, null, String.class); + + assertEquals("We got totalsens,upsens columns", out); + } + + @Test + public void testEndpointUriWithDanishCharEncodingIssue() throws Exception { + String uri = "netty4-http:http://localhost:{{port}}/myapp/mytest?columns=claus,s\u00F8ren&username=apiuser"; + String out = template.requestBody(uri, null, String.class); + + assertEquals("We got claus,s\u00F8ren columns", out); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://localhost:{{port}}/myapp/mytest?urlDecodeHeaders=true").process(new Processor() { + public void process(Exchange exchange) throws Exception { + String columns = exchange.getIn().getHeader("columns", String.class); + exchange.getOut().setBody("We got " + columns + " columns"); + } + }); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueUrlDecodeDisabledTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueUrlDecodeDisabledTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueUrlDecodeDisabledTest.java new file mode 100644 index 0000000..7e98851 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpEndpointUriEncodingIssueUrlDecodeDisabledTest.java @@ -0,0 +1,49 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +public class NettyHttpEndpointUriEncodingIssueUrlDecodeDisabledTest extends BaseNettyTest { + + @Test + public void testEndpointUriWithDanishCharEncodingIssue() throws Exception { + String uri = "netty4-http:http://localhost:{{port}}/myapp/mytest?columns=claus,s\u00F8ren&username=apiuser"; + String out = template.requestBody(uri, null, String.class); + + assertEquals("We got claus%2Cs%C3%B8ren columns", out); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://localhost:{{port}}/myapp/mytest?urlDecodeHeaders=false").process(new Processor() { + public void process(Exchange exchange) throws Exception { + String columns = exchange.getIn().getHeader("columns", String.class); + exchange.getOut().setBody("We got " + columns + " columns"); + } + }); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpFilterCamelHeadersTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpFilterCamelHeadersTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpFilterCamelHeadersTest.java new file mode 100644 index 0000000..c032a65 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpFilterCamelHeadersTest.java @@ -0,0 +1,76 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.junit.Test; + +public class NettyHttpFilterCamelHeadersTest extends BaseNettyTest { + + @Test + public void testFilterCamelHeaders() throws Exception { + Exchange out = template.request("netty4-http:http://localhost:{{port}}/test/filter", new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getIn().setBody("Claus"); + exchange.getIn().setHeader("bar", 123); + } + }); + + assertNotNull(out); + assertEquals("Hi Claus", out.getOut().getBody(String.class)); + + // there should be no internal Camel headers + // except for the response code and response text + Map<String, Object> headers = out.getOut().getHeaders(); + for (String key : headers.keySet()) { + if (!key.equalsIgnoreCase(Exchange.HTTP_RESPONSE_CODE) && !key.equalsIgnoreCase(NettyHttpConstants.HTTP_RESPONSE_TEXT)) { + assertTrue("Should not contain any Camel internal headers", !key.toLowerCase().startsWith("camel")); + } + } + assertEquals(200, headers.get(Exchange.HTTP_RESPONSE_CODE)); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("foo", new MyFooBean()); + return jndi; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("netty4-http:http://localhost:{{port}}/test/filter").beanRef("foo"); + } + }; + } + + public static class MyFooBean { + + public String hello(String name) { + return "Hi " + name; + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithInvalidMessageTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithInvalidMessageTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithInvalidMessageTest.java new file mode 100644 index 0000000..3fdc57d --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithInvalidMessageTest.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.util.ArrayList; +import java.util.List; + +import io.netty.channel.ChannelHandler; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.test.AvailablePortFinder; +import org.apache.camel.test.junit4.CamelTestSupport; + +import org.junit.Test; + +public class NettyHttpGetWithInvalidMessageTest extends CamelTestSupport { + private static final String REQUEST_STRING = "user: Willem\n" + + "GET http://localhost:8101/test HTTP/1.1\n" + "another: value\n Host: localhost\n"; + private int port1; + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry registry = super.createRegistry(); + + // setup the String encoder and decoder + + StringDecoder stringDecoder = new StringDecoder(); + registry.bind("string-decoder", stringDecoder); + + StringEncoder stringEncoder = new StringEncoder(); + registry.bind("string-encoder", stringEncoder); + + List<ChannelHandler> decoders = new ArrayList<ChannelHandler>(); + decoders.add(stringDecoder); + + List<ChannelHandler> encoders = new ArrayList<ChannelHandler>(); + encoders.add(stringEncoder); + + registry.bind("encoders", encoders); + registry.bind("decoders", decoders); + + return registry; + } + + @Test + public void testNettyHttpServer() throws Exception { + invokeService(8100); + } + + //@Test + public void testJettyHttpServer() throws Exception { + invokeService(port1); + } + + private void invokeService(int port) { + Exchange out = template.request("netty4:tcp://localhost:" + port + "?encoders=#encoders&decoders=#decoders&sync=true" , new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setBody(REQUEST_STRING); + } + }); + + assertNotNull(out); + String result = out.getOut().getBody(String.class); + assertNotNull(result); + assertTrue("We should get the 404 response.", result.indexOf("404 Not Found") > 0); + + } + + + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + port1 = AvailablePortFinder.getNextAvailable(8100); + + // set up a netty http proxy + from("netty4-http:http://localhost:" + port1 + "/test") + .transform().simple("Bye ${header.user}."); + + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamAsExchangeHeaderTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamAsExchangeHeaderTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamAsExchangeHeaderTest.java new file mode 100644 index 0000000..b89070b --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamAsExchangeHeaderTest.java @@ -0,0 +1,127 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Ignore; +import org.junit.Test; + +public class NettyHttpGetWithParamAsExchangeHeaderTest extends BaseNettyTest { + + private String serverUri = "netty4-http:http://localhost:" + getPort() + "/myservice?urlDecodeHeaders=true"; + + @Test + public void testHttpGetWithParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("one", "einz"); + mock.expectedHeaderReceived("two", "twei"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBody(serverUri + "&one=einz&two=twei", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithUTF8EncodedParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", "Keine g\u00FCltige GPS-Daten!"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBody(serverUri + "&message=Keine%20g%C3%BCltige%20GPS-Daten!", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + @Ignore + public void testHttpGetWithISO8859EncodedParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", "Keine g\u00C6ltige GPS-Daten!"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBody(serverUri + "&message=Keine+g%C6ltige+GPS-Daten%21", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithSpaceInParams() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", " World"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + // parameter starts with a space using %2B as decimal encoded + template.requestBody(serverUri + "&message=%2BWorld", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpGetWithSpaceAsPlusInParams() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("message", " World"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + // parameter starts with a space using + decoded + template.requestBody(serverUri + "&message=+World", null, Object.class); + + assertMockEndpointsSatisfied(); + } + + @Test + @Ignore("HTTP_QUERY not yet supported") + public void testHttpGetWithParamsViaHeader() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedHeaderReceived("one", "uno"); + mock.expectedHeaderReceived("two", "dos"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "GET"); + + template.requestBodyAndHeader(serverUri, null, Exchange.HTTP_QUERY, "one=uno&two=dos"); + + assertMockEndpointsSatisfied(); + } + + @Test + public void testHttpPost() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedMessageCount(1); + mock.expectedBodiesReceived("Hello World"); + mock.expectedHeaderReceived(Exchange.HTTP_METHOD, "POST"); + + template.requestBody(serverUri, "Hello World"); + + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from(serverUri).to("mock:result"); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamTest.java new file mode 100644 index 0000000..9e31337 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpGetWithParamTest.java @@ -0,0 +1,78 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Ignore; +import org.junit.Test; + +public class NettyHttpGetWithParamTest extends BaseNettyTest { + + private String serverUri = "netty4-http:http://localhost:" + getPort() + "/myservice"; + private MyParamsProcessor processor = new MyParamsProcessor(); + + @Test + public void testHttpGetWithParamsViaURI() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Bye World"); + mock.expectedHeaderReceived("one", "eins"); + mock.expectedHeaderReceived("two", "zwei"); + + template.requestBody(serverUri + "?one=uno&two=dos", (Object) null); + + assertMockEndpointsSatisfied(); + } + + @Test + @Ignore("HTTP_QUERY not supported") + public void testHttpGetWithParamsViaHeader() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Bye World"); + mock.expectedHeaderReceived("one", "eins"); + mock.expectedHeaderReceived("two", "zwei"); + + template.requestBodyAndHeader(serverUri, null, Exchange.HTTP_QUERY, "one=uno&two=dos"); + + assertMockEndpointsSatisfied(); + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from(serverUri).process(processor).to("mock:result"); + } + }; + } + + private static class MyParamsProcessor implements Processor { + public void process(Exchange exchange) throws Exception { + NettyHttpMessage message = exchange.getIn(NettyHttpMessage.class); + assertNotNull(message.getHttpRequest()); + + String uri = message.getHttpRequest().getUri(); + assertTrue(uri.endsWith("one=uno&two=dos")); + + exchange.getOut().setBody("Bye World"); + exchange.getOut().setHeader("one", "eins"); + exchange.getOut().setHeader("two", "zwei"); + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHandle404Test.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHandle404Test.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHandle404Test.java new file mode 100644 index 0000000..385ecef --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHandle404Test.java @@ -0,0 +1,92 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.nio.charset.Charset; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.apache.camel.processor.aggregate.AggregationStrategy; +import org.junit.Test; + +public class NettyHttpHandle404Test extends BaseNettyTest { + + public String getProducerUrl() { + return "netty4-http:http://localhost:{{port}}/myserver?user=Camel"; + } + + @Test + public void testSimulate404() throws Exception { + MockEndpoint mock = getMockEndpoint("mock:result"); + mock.expectedBodiesReceived("Page not found"); + mock.expectedHeaderReceived(Exchange.HTTP_RESPONSE_CODE, 404); + + template.sendBody("direct:start", "Hello World"); + + assertMockEndpointsSatisfied(); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + // disable error handling + errorHandler(noErrorHandler()); + + from("direct:start").enrich("direct:tohttp", new AggregationStrategy() { + public Exchange aggregate(Exchange original, Exchange resource) { + // get the response code + Integer code = resource.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE, Integer.class); + assertEquals(404, code.intValue()); + return resource; + } + }).to("mock:result"); + + // use this sub route as indirection to handle the HttpOperationFailedException + // and set the data back as data on the exchange to not cause the exception to be thrown + from("direct:tohttp") + .doTry() + .to(getProducerUrl()) + .doCatch(NettyHttpOperationFailedException.class) + .process(new Processor() { + public void process(Exchange exchange) { + // copy the caused exception values to the exchange as we want the response in the regular exchange + // instead as an exception that will get thrown and thus the route breaks + NettyHttpOperationFailedException cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, NettyHttpOperationFailedException.class); + exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, cause.getStatusCode()); + exchange.getOut().setBody(cause.getHttpContent().content().toString(Charset.defaultCharset())); + } + }) + .end(); + + + // this is our jetty server where we simulate the 404 + from("netty4-http:http://localhost:{{port}}/myserver") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody("Page not found"); + exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 404); + } + }); + } + }; + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/db88eeda/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHeaderCaseTest.java ---------------------------------------------------------------------- diff --git a/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHeaderCaseTest.java b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHeaderCaseTest.java new file mode 100644 index 0000000..a92f4e4 --- /dev/null +++ b/components/camel-netty4-http/src/test/java/org/apache/camel/component/netty4/http/NettyHttpHeaderCaseTest.java @@ -0,0 +1,73 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.netty4.http; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.PostMethod; +import org.junit.Test; + +public class NettyHttpHeaderCaseTest extends BaseNettyTest { + + @Test + public void testHttpHeaderCase() throws Exception { + HttpClient client = new HttpClient(); + HttpMethod method = new PostMethod("http://localhost:" + getPort() + "/myapp/mytest"); + + method.setRequestHeader("clientHeader", "fooBAR"); + method.setRequestHeader("OTHER", "123"); + method.setRequestHeader("beer", "Carlsberg"); + + client.executeMethod(method); + + assertEquals("Bye World", method.getResponseBodyAsString()); + assertEquals("aBc123", method.getResponseHeader("MyCaseHeader").getValue()); + assertEquals("456DEf", method.getResponseHeader("otherCaseHeader").getValue()); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("netty4-http:http://localhost:{{port}}/myapp/mytest").process(new Processor() { + public void process(Exchange exchange) throws Exception { + + // headers received should be in case as well + Map<String, Object> map = new LinkedHashMap<String, Object>(); + map.putAll(exchange.getIn().getHeaders()); + + assertEquals("123", map.get("OTHER")); + assertEquals(null, map.get("other")); + assertEquals("Carlsberg", map.get("beer")); + assertEquals(null, map.get("Beer")); + + exchange.getOut().setBody("Bye World"); + exchange.getOut().setHeader("MyCaseHeader", "aBc123"); + exchange.getOut().setHeader("otherCaseHeader", "456DEf"); + } + }); + } + }; + } + +}