/** * 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.jetty; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.List; import java.util.Map; import javax.servlet.http.HttpSession; import org.apache.camel.Exchange; import org.apache.camel.Message; import org.apache.camel.Processor; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.converter.stream.InputStreamCache; import org.apache.camel.http.common.HttpMessage; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.PutMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.junit.Test; /** * @version */ public class HttpRouteTest extends BaseJettyTest { protected static final String POST_MESSAGE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?> " + "<test>Hello World</test>"; protected String expectedBody = "<hello>world!</hello>"; private int port1; private int port2; private int port3; private int port4; @Test public void testEndpoint() throws Exception { MockEndpoint mockEndpoint = getMockEndpoint("mock:a"); mockEndpoint.expectedBodiesReceived(expectedBody); invokeHttpEndpoint(); mockEndpoint.assertIsSatisfied(); List<Exchange> list = mockEndpoint.getReceivedExchanges(); Exchange exchange = list.get(0); assertNotNull("exchange", exchange); Message in = exchange.getIn(); assertNotNull("in", in); Map<String, Object> headers = in.getHeaders(); log.info("Headers: " + headers); assertTrue("Should be more than one header but was: " + headers, headers.size() > 0); } @Test public void testHelloEndpoint() throws Exception { ByteArrayOutputStream os = new ByteArrayOutputStream(); InputStream is = new URL("http://localhost:" + port2 + "/hello").openStream(); int c; while ((c = is.read()) >= 0) { os.write(c); } String data = new String(os.toByteArray()); assertEquals("<b>Hello World</b>", data); } @Test public void testEchoEndpoint() throws Exception { String out = template.requestBody("http://localhost:" + port1 + "/echo", "HelloWorld", String.class); assertEquals("Get a wrong output ", "HelloWorld", out); } @Test public void testEchoEndpointWithIgnoreResponseBody() throws Exception { String out = template.requestBody("http://localhost:" + port1 + "/echo?ignoreResponseBody=true", "HelloWorld", String.class); assertNull("Get a wrong output ", out); } @Test public void testPostParameter() throws Exception { NameValuePair[] data = {new NameValuePair("request", "PostParameter"), new NameValuePair("others", "bloggs")}; HttpClient client = new HttpClient(); PostMethod post = new PostMethod("http://localhost:" + port1 + "/parameter"); post.setRequestBody(data); client.executeMethod(post); InputStream response = post.getResponseBodyAsStream(); String out = context.getTypeConverter().convertTo(String.class, response); assertEquals("Get a wrong output ", "PostParameter", out); } @Test public void testPostXMLMessage() throws Exception { HttpClient client = new HttpClient(); PostMethod post = new PostMethod("http://localhost:" + port1 + "/postxml"); StringRequestEntity entity = new StringRequestEntity(POST_MESSAGE, "application/xml", "UTF-8"); post.setRequestEntity(entity); client.executeMethod(post); InputStream response = post.getResponseBodyAsStream(); String out = context.getTypeConverter().convertTo(String.class, response); assertEquals("Get a wrong output ", "OK", out); } @Test public void testPostParameterInURI() throws Exception { HttpClient client = new HttpClient(); PostMethod post = new PostMethod("http://localhost:" + port1 + "/parameter?request=PostParameter&others=bloggs"); StringRequestEntity entity = new StringRequestEntity(POST_MESSAGE, "application/xml", "UTF-8"); post.setRequestEntity(entity); client.executeMethod(post); InputStream response = post.getResponseBodyAsStream(); String out = context.getTypeConverter().convertTo(String.class, response); assertEquals("Get a wrong output ", "PostParameter", out); } @Test public void testPutParameterInURI() throws Exception { HttpClient client = new HttpClient(); PutMethod put = new PutMethod("http://localhost:" + port1 + "/parameter?request=PutParameter&others=bloggs"); StringRequestEntity entity = new StringRequestEntity(POST_MESSAGE, "application/xml", "UTF-8"); put.setRequestEntity(entity); client.executeMethod(put); InputStream response = put.getResponseBodyAsStream(); String out = context.getTypeConverter().convertTo(String.class, response); assertEquals("Get a wrong output ", "PutParameter", out); } @Test public void testDisableStreamCache() throws Exception { String response = template.requestBodyAndHeader("http://localhost:" + port3 + "/noStreamCache", new ByteArrayInputStream("This is a test".getBytes()), "Content-Type", "application/xml", String.class); assertEquals("Get a wrong output ", "OK", response); } @Test public void testRequestBufferSize() throws Exception { InputStream in = this.getClass().getResourceAsStream("/META-INF/LICENSE.txt"); int fileSize = in.available(); String response = template.requestBodyAndHeader("http://localhost:" + port4 + "/requestBufferSize", in, Exchange.CONTENT_TYPE, "application/txt", String.class); assertEquals("Got a wrong response.", fileSize, response.length()); } @Test public void testResponseCode() throws Exception { HttpClient client = new HttpClient(); GetMethod get = new GetMethod("http://localhost:" + port1 + "/responseCode"); client.executeMethod(get); // just make sure we get the right assertEquals("Get a wrong status code.", 400, get.getStatusCode()); } protected void invokeHttpEndpoint() throws IOException { template.requestBodyAndHeader("http://localhost:" + port1 + "/test", expectedBody, "Content-Type", "application/xml"); } @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { public void configure() { port1 = getPort(); port2 = getNextPort(); port3 = getNextPort(); port4 = getNextPort(); // enable stream cache context.setStreamCaching(true); from("jetty:http://localhost:" + port1 + "/test").to("mock:a"); Processor proc = new Processor() { public void process(Exchange exchange) throws Exception { try { HttpMessage message = (HttpMessage)exchange.getIn(); HttpSession session = message.getRequest().getSession(); assertNotNull("we should get session here", session); } catch (Exception e) { exchange.getOut().setFault(true); exchange.getOut().setBody(e); } exchange.getOut().setBody("<b>Hello World</b>"); } }; from("jetty:http://localhost:" + port1 + "/responseCode").setHeader(Exchange.HTTP_RESPONSE_CODE, simple("400")); Processor printProcessor = new Processor() { public void process(Exchange exchange) throws Exception { Message out = exchange.getOut(); out.copyFrom(exchange.getIn()); log.info("The body's object is " + exchange.getIn().getBody()); log.info("Process body = " + exchange.getIn().getBody(String.class)); InputStreamCache cache = out.getBody(InputStreamCache.class); cache.reset(); } }; from("jetty:http://localhost:" + port2 + "/hello?sessionSupport=true").process(proc); from("jetty:http://localhost:" + port1 + "/echo").process(printProcessor).process(printProcessor); Processor procParameters = new Processor() { public void process(Exchange exchange) throws Exception { // As the request input stream is cached by DefaultHttpBinding, // HttpServletRequest can't get the parameters of post message String value = exchange.getIn().getHeader("request", String.class); if (value != null) { assertNotNull("The value of the parameter should not be null", value); exchange.getOut().setBody(value); } else { exchange.getOut().setBody("Can't get a right parameter"); } } }; from("jetty:http://localhost:" + port1 + "/parameter").process(procParameters); from("jetty:http://localhost:" + port1 + "/postxml").process(new Processor() { public void process(Exchange exchange) throws Exception { String value = exchange.getIn().getBody(String.class); assertEquals("The response message is wrong", value, POST_MESSAGE); exchange.getOut().setBody("OK"); } }); from("jetty:http://localhost:" + port3 + "/noStreamCache?disableStreamCache=true").noStreamCaching().process(new Processor() { public void process(Exchange exchange) throws Exception { InputStream is = (InputStream)exchange.getIn().getBody(); assertTrue("It should be a raw inputstream", is instanceof org.eclipse.jetty.server.HttpInput); String request = exchange.getIn().getBody(String.class); assertEquals("Got a wrong request", "This is a test", request); exchange.getOut().setBody("OK"); } }); from("jetty:http://localhost:" + port4 + "/requestBufferSize").process(new Processor() { public void process(Exchange exchange) throws Exception { String string = exchange.getIn().getBody(String.class); exchange.getOut().setBody(string); } }); } }; } }