/** * 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.servlet; import java.io.ByteArrayInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.HttpException; import com.meterware.httpunit.PostMethodWebRequest; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; import com.meterware.servletunit.ServletUnitClient; import org.apache.camel.Exchange; import org.apache.camel.FailedToCreateProducerException; import org.apache.camel.FailedToCreateRouteException; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.junit.Test; public class HttpClientRouteTest extends ServletCamelRouterTestSupport { private static final String POST_DATA = "<request> hello world </request>"; private static final String CONTENT_TYPE = "text/xml; charset=UTF-8"; private static final String UNICODE_TEXT = "B\u00FCe W\u00F6rld"; @Test public void testHttpClient() throws Exception { WebRequest req = new PostMethodWebRequest(CONTEXT_URL + "/services/hello", new ByteArrayInputStream(POST_DATA.getBytes()), CONTENT_TYPE); ServletUnitClient client = newClient(); WebResponse response = client.getResponse(req); assertEquals("Get wrong content type", "text/xml", response.getContentType()); assertTrue("UTF-8".equalsIgnoreCase(response.getCharacterSet())); assertEquals("Get a wrong message header", "/hello", response.getHeaderField("PATH")); assertEquals("The response message is wrong ", "OK", response.getResponseMessage()); req = new PostMethodWebRequest(CONTEXT_URL + "/services/helloworld", new ByteArrayInputStream(POST_DATA.getBytes()), CONTENT_TYPE); response = client.getResponse(req); assertEquals("Get wrong content type", "text/xml", response.getContentType()); assertTrue("UTF-8".equalsIgnoreCase(response.getCharacterSet())); assertEquals("Get a wrong message header", "/helloworld", response.getHeaderField("PATH")); assertEquals("The response message is wrong ", "OK", response.getResponseMessage()); client.setExceptionsThrownOnErrorStatus(false); } @Test public void testHttpRestricMethod() throws Exception { WebRequest req = new PostMethodWebRequest(CONTEXT_URL + "/services/testHttpMethodRestrict", new ByteArrayInputStream(POST_DATA.getBytes()), "text/xml; charset=UTF-8"); ServletUnitClient client = newClient(); WebResponse response = client.getResponse(req); assertEquals("The response message is wrong ", "OK", response.getResponseMessage()); assertEquals("The response body is wrong", POST_DATA, response.getText()); // Send other web method request req = new GetMethodWebRequest(CONTEXT_URL + "/services/testHttpMethodRestrict"); try { response = client.getResponse(req); fail("Expect the exception here"); } catch (Exception ex) { HttpException httpException = (HttpException)ex; assertEquals("Get a wrong response code", 405, httpException.getResponseCode()); } } @Test public void testHttpConverter() throws Exception { WebRequest req = new PostMethodWebRequest(CONTEXT_URL + "/services/testConverter", new ByteArrayInputStream(POST_DATA.getBytes()), "text/xml; charset=UTF-8"); ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse response = client.getResponse(req); assertEquals("The response message is wrong ", "OK", response.getResponseMessage()); assertEquals("The response body is wrong", "Bye World", response.getText()); } @Test public void testHttpUnicodeResponseWithStringResponse() throws Exception { WebRequest req = new PostMethodWebRequest(CONTEXT_URL + "/services/testUnicodeWithStringResponse", new ByteArrayInputStream(POST_DATA.getBytes()), "text/xml; charset=UTF-8"); ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse response = client.getResponse(req); assertEquals("The response message is wrong ", "OK", response.getResponseMessage()); assertEquals("The response body is wrong", UNICODE_TEXT, response.getText()); } @Test public void testHttpUnicodeResponseWithObjectResponse() throws Exception { WebRequest req = new PostMethodWebRequest(CONTEXT_URL + "/services/testUnicodeWithObjectResponse", new ByteArrayInputStream(POST_DATA.getBytes()), "text/xml; charset=UTF-8"); ServletUnitClient client = newClient(); client.setExceptionsThrownOnErrorStatus(false); WebResponse response = client.getResponse(req); assertEquals("The response message is wrong ", "OK", response.getResponseMessage()); assertEquals("The response body is wrong", UNICODE_TEXT, response.getText()); } @Test public void testCreateSerlvetEndpointProducer() throws Exception { if (!startCamelContext) { // don't test it with web.xml configure return; } try { context.addRoutes(new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("servlet:///testworld"); } }); fail("Excepts exception here"); } catch (FailedToCreateRouteException ex) { assertTrue("Get a wrong exception.", ex.getCause() instanceof FailedToCreateProducerException); assertTrue("Get a wrong cause of exception.", ex.getCause().getCause() instanceof UnsupportedOperationException); } } public static class MyServletRoute extends RouteBuilder { @Override public void configure() throws Exception { errorHandler(noErrorHandler()); // START SNIPPET: route from("servlet:hello?matchOnUriPrefix=true").process(new Processor() { public void process(Exchange exchange) throws Exception { String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); String path = exchange.getIn().getHeader(Exchange.HTTP_URI, String.class); path = path.substring(path.lastIndexOf("/")); assertEquals("Get a wrong content type", CONTENT_TYPE, contentType); // assert camel http header String charsetEncoding = exchange.getIn().getHeader(Exchange.HTTP_CHARACTER_ENCODING, String.class); assertEquals("Get a wrong charset name from the message heaer", "UTF-8", charsetEncoding); // assert exchange charset assertEquals("Get a wrong charset naem from the exchange property", "UTF-8", exchange.getProperty(Exchange.CHARSET_NAME)); exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8"); exchange.getOut().setHeader("PATH", path); exchange.getOut().setBody("<b>Hello World</b>"); } }); // END SNIPPET: route from("servlet:testHttpMethodRestrict?httpMethodRestrict=POST").process(new Processor() { public void process(Exchange exchange) throws Exception { String request = exchange.getIn().getBody(String.class); exchange.getOut().setBody(request); } }); from("servlet:testConverter?matchOnUriPrefix=true") .convertBodyTo(String.class) .process(new Processor() { public void process(Exchange exchange) throws Exception { HttpServletRequest request = exchange.getIn(HttpServletRequest.class); assertNotNull("We should get request object here", request); HttpServletResponse response = exchange.getIn(HttpServletResponse.class); assertNotNull("We should get response object here", response); String s = exchange.getIn().getBody(String.class); assertEquals("<request> hello world </request>", s); } }).transform(constant("Bye World")); from("servlet:testUnicodeWithStringResponse?matchOnUriPrefix=true") .process(new Processor() { public void process(Exchange exchange) throws Exception { String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8"); } }) .transform(constant(UNICODE_TEXT)); from("servlet:testUnicodeWithObjectResponse?matchOnUriPrefix=true") .process(new Processor() { public void process(Exchange exchange) throws Exception { String contentType = exchange.getIn().getHeader(Exchange.CONTENT_TYPE, String.class); exchange.getOut().setHeader(Exchange.CONTENT_TYPE, contentType + "; charset=UTF-8"); } }) .transform(constant(new Object() { @Override public String toString() { return UNICODE_TEXT; } })); } } protected RouteBuilder createRouteBuilder() throws Exception { return new MyServletRoute(); } }