http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml b/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml deleted file mode 100644 index 210fecd..0000000 --- a/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml +++ /dev/null @@ -1,62 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd - "> - - <bean id="dynaPort" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> - <property name="targetClass"> - <value>org.apache.camel.test.AvailablePortFinder</value> - </property> - <property name="targetMethod"> - <value>getNextAvailable</value> - </property> - <property name="arguments"> - <list> - <value>9000</value> - </list> - </property> - </bean> - - - <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> - <endpoint id="httpEndpoint" uri="http://localhost:#{dynaPort}/hi"/> - <endpoint id="jettyEndpoint" uri="jetty:http://localhost:#{dynaPort}/hi"/> - - <route> - <from uri="direct:start"/> - <onException> - <exception>java.net.ConnectException</exception> - <redeliveryPolicy maximumRedeliveries="4" redeliveryDelay="100" maximumRedeliveryDelay="5000" - backOffMultiplier="2" useExponentialBackOff="true"/> - </onException> - <to ref="httpEndpoint"/> - </route> - - <route id="jetty"> - - <from ref="jettyEndpoint"/> - <transform><simple>Bye ${body}</simple></transform> - </route> - - </camelContext> - -</beans>
http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml b/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml deleted file mode 100644 index db38b86..0000000 --- a/components/camel-jetty/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml +++ /dev/null @@ -1,56 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - 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. ---> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation=" - http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd - http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd - "> - - - <bean id="dynaPort" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> - <property name="targetClass"> - <value>org.apache.camel.test.AvailablePortFinder</value> - </property> - <property name="targetMethod"> - <value>getNextAvailable</value> - </property> - <property name="arguments"> - <list> - <value>5000</value> - </list> - </property> - </bean> - - <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> - <endpoint id="httpEndpoint" uri="http://localhost:#{dynaPort}/hi"/> - <endpoint id="jettyEndpoint" uri="jetty:http://localhost:#{dynaPort}/hi"/> - - <route> - <from uri="direct:start"/> - <to ref="httpEndpoint"/> - </route> - - <route id="jetty"> - <from ref="jettyEndpoint"/> - <transform><simple>Bye ${body}</simple></transform> - </route> - - </camelContext> - -</beans> http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/pom.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/pom.xml b/components/camel-jetty8/pom.xml new file mode 100644 index 0000000..095a2ba --- /dev/null +++ b/components/camel-jetty8/pom.xml @@ -0,0 +1,149 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.camel</groupId> + <artifactId>components</artifactId> + <version>2.15-SNAPSHOT</version> + </parent> + + <artifactId>camel-jetty8</artifactId> + <packaging>bundle</packaging> + <name>Camel :: Jetty8</name> + <description>Camel Jetty8 support</description> + + <properties> + <camel.osgi.import.before.defaults> + javax.servlet.*;version="${servlet-version-range}" + </camel.osgi.import.before.defaults> + <camel.osgi.export.pkg>org.apache.camel.component.*</camel.osgi.export.pkg> + <camel.osgi.export.service>org.apache.camel.spi.ComponentResolver;component=jetty</camel.osgi.export.service> + </properties> + + <dependencies> + + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-core</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-http</artifactId> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-jetty-common</artifactId> + </dependency> + <dependency> + <groupId>org.apache.geronimo.specs</groupId> + <artifactId>geronimo-servlet_3.0_spec</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + <exclusions> + <exclusion> + <groupId>javax.servlet</groupId> + <artifactId>servlet-api</artifactId> + </exclusion> + <exclusion> + <groupId>org.eclipse.jetty.orbit</groupId> + <artifactId>javax.servlet</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-security</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlets</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-client</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-jmx</artifactId> + </dependency> + + <!-- test dependencies --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-test-spring</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-spring</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <optional>true</optional> + <scope>test</scope> + </dependency> + <!-- for testing rest-dsl --> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-jackson</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.apache.camel</groupId> + <artifactId>camel-jaxb</artifactId> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <testSourceDirectory>../camel-jetty9/src/test/java</testSourceDirectory> + <plugins> + <!-- use per test fork mode to avoid side effects --> + <plugin> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <forkCount>1</forkCount> + <reuseForks>false</reuseForks> + <forkedProcessTimeoutInSeconds>1800</forkedProcessTimeoutInSeconds> + </configuration> + </plugin> + </plugins> + </build> + +</project> http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelHttpClient8.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelHttpClient8.java b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelHttpClient8.java new file mode 100644 index 0000000..a484230 --- /dev/null +++ b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelHttpClient8.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.jetty8; + +import java.util.concurrent.Executor; + +import org.apache.camel.component.jetty.CamelHttpClient; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.eclipse.jetty.util.thread.ThreadPool; + +@SuppressWarnings("unchecked") +public class CamelHttpClient8 extends CamelHttpClient { + + public CamelHttpClient8(SslContextFactory sslContextFactory) { + super(sslContextFactory); + setConnectorType(); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + } + + private void setConnectorType() { + setConnectorType(2); + } + + protected boolean hasThreadPool() { + return getThreadPool() != null; + } + + protected void setThreadPoolOrExecutor(Executor pool) { + setThreadPool((ThreadPool)pool); + } + + public void setProxy(String host, int port) { + setProxy(new org.eclipse.jetty.client.Address(host, port)); + } + + private void setupRedirectListener() { + registerListener(CamelRedirectListener.class.getName()); + } + + @Override + public String getProxyHost() { + return getProxy().getHost(); + } + + @Override + public int getProxyPort() { + return getProxy().getPort(); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelRedirectListener.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelRedirectListener.java b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelRedirectListener.java new file mode 100644 index 0000000..10ad17c --- /dev/null +++ b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/CamelRedirectListener.java @@ -0,0 +1,52 @@ +/** + * 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.jetty8; + +import java.io.IOException; + +import org.eclipse.jetty.client.HttpDestination; +import org.eclipse.jetty.client.HttpExchange; +import org.eclipse.jetty.client.RedirectListener; +import org.eclipse.jetty.http.HttpStatus; +import org.eclipse.jetty.io.Buffer; + +public class CamelRedirectListener extends RedirectListener { + private final HttpExchange exchange; + + public CamelRedirectListener(HttpDestination destination, HttpExchange ex) { + super(destination, ex); + exchange = ex; + } + + @Override + public void onResponseStatus(Buffer version, int status, Buffer reason) throws IOException { + // Update the exchange method to get to support the Post/Redirect/Get + // http://en.wikipedia.org/wiki/Post/Redirect/Get + if (exchange.getMethod().equals("POST") && (status == HttpStatus.SEE_OTHER_303 || status == HttpStatus.MOVED_TEMPORARILY_302)) { + exchange.setMethod("GET"); + } + + // Since the default RedirectListener only cares about http + // response codes 301 and 302, we override this method and + // trick the super class into handling this case for us. + if (status == HttpStatus.SEE_OTHER_303) { + status = HttpStatus.MOVED_TEMPORARILY_302; + } + + super.onResponseStatus(version, status, reason); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyContentExchange8.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyContentExchange8.java b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyContentExchange8.java new file mode 100644 index 0000000..857877c --- /dev/null +++ b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyContentExchange8.java @@ -0,0 +1,287 @@ +/** + * 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.jetty8; + +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.CountDownLatch; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.CamelExchangeException; +import org.apache.camel.Exchange; +import org.apache.camel.ExchangeTimedOutException; +import org.apache.camel.component.jetty.JettyContentExchange; +import org.apache.camel.component.jetty.JettyHttpBinding; +import org.apache.camel.util.IOHelper; +import org.eclipse.jetty.client.ContentExchange; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.HttpEventListener; +import org.eclipse.jetty.client.HttpEventListenerWrapper; +import org.eclipse.jetty.client.HttpExchange; +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpHeaders; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Jetty specific exchange which keeps track of the the request and response. + * + * @version + */ +public class JettyContentExchange8 implements JettyContentExchange { + + private static final Logger LOG = LoggerFactory.getLogger(JettyContentExchange8.class); + + private volatile Exchange exchange; + private volatile AsyncCallback callback; + private volatile JettyHttpBinding jettyBinding; + private volatile HttpClient client; + private final CountDownLatch done = new CountDownLatch(1); + private final ContentExchange ce; + + public JettyContentExchange8() { + this.ce = new ContentExchange(true); + } + + public void init(Exchange exchange, JettyHttpBinding jettyBinding, + final HttpClient client, AsyncCallback callback) { + this.exchange = exchange; + this.jettyBinding = jettyBinding; + this.client = client; + this.callback = callback; + HttpEventListener old = ce.getEventListener(); + ce.setEventListener(new HttpEventListenerWrapper(old, true) { + public void onRequestComplete() throws IOException { + JettyContentExchange8.this.onRequestComplete(); + super.onRequestComplete(); + } + + @Override + public void onResponseComplete() throws IOException { + super.onResponseComplete(); + JettyContentExchange8.this.onResponseComplete(); + } + + @Override + public void onConnectionFailed(Throwable ex) { + try { + super.onConnectionFailed(ex); + } finally { + JettyContentExchange8.this.onConnectionFailed(ex); + } + } + + @Override + public void onException(Throwable ex) { + try { + super.onException(ex); + } finally { + JettyContentExchange8.this.onException(ex); + } + } + + @Override + public void onExpire() { + try { + super.onExpire(); + } finally { + JettyContentExchange8.this.onExpire(); + } + } + + }); + } + + protected void onRequestComplete() throws IOException { + LOG.trace("onRequestComplete"); + + closeRequestContentSource(); + } + + protected void onResponseComplete() throws IOException { + LOG.trace("onResponseComplete"); + doTaskCompleted(); + } + + protected void onExpire() { + LOG.trace("onExpire"); + + // need to close the request input stream + closeRequestContentSource(); + doTaskCompleted(); + } + + protected void onException(Throwable ex) { + LOG.trace("onException {}", ex); + + // need to close the request input stream + closeRequestContentSource(); + doTaskCompleted(ex); + } + + protected void onConnectionFailed(Throwable ex) { + LOG.trace("onConnectionFailed {}", ex); + + // need to close the request input stream + closeRequestContentSource(); + doTaskCompleted(ex); + } + + public byte[] getBody() { + // must return the content as raw bytes + return ce.getResponseContentBytes(); + } + + public String getUrl() { + String params = ce.getRequestFields().getStringField(HttpHeaders.CONTENT_ENCODING); + return ce.getScheme() + "://" + + ce.getAddress().toString() + + ce.getRequestURI() + (params != null ? "?" + params : ""); + } + + protected void closeRequestContentSource() { + // close the input stream when its not needed anymore + InputStream is = ce.getRequestContentSource(); + if (is != null) { + IOHelper.close(is, "RequestContentSource", LOG); + } + } + + protected void doTaskCompleted() { + // make sure to lower the latch + done.countDown(); + + if (callback == null) { + // this is only for the async callback + return; + } + + int exchangeState = ce.getStatus(); + + if (LOG.isDebugEnabled()) { + LOG.debug("TaskComplete with state {} for url: {}", exchangeState, getUrl()); + } + + try { + if (exchangeState == HttpExchange.STATUS_COMPLETED) { + // process the response as the state is ok + try { + jettyBinding.populateResponse(exchange, this); + } catch (Exception e) { + exchange.setException(e); + } + } else if (exchangeState == HttpExchange.STATUS_EXPIRED) { + // we did timeout + exchange.setException(new ExchangeTimedOutException(exchange, client.getTimeout())); + } else { + // some kind of other error + if (exchange.getException() != null) { + exchange.setException(new CamelExchangeException("JettyClient failed with state " + exchangeState, exchange, exchange.getException())); + } + } + } finally { + // now invoke callback to indicate we are done async + callback.done(false); + } + } + + protected void doTaskCompleted(Throwable ex) { + try { + // some kind of other error + exchange.setException(new CamelExchangeException("JettyClient failed cause by: " + ex.getMessage(), exchange, ex)); + } finally { + // make sure to lower the latch + done.countDown(); + } + + if (callback != null) { + // now invoke callback to indicate we are done async + callback.done(false); + } + } + + public void setRequestContentType(String contentType) { + ce.setRequestContentType(contentType); + } + + public int getResponseStatus() { + return ce.getResponseStatus(); + } + + public void setMethod(String method) { + ce.setMethod(method); + } + + public void setURL(String url) { + ce.setURL(url); + } + + public void setRequestContent(byte[] byteArray) { + ce.setRequestContent(new org.eclipse.jetty.io.ByteArrayBuffer(byteArray)); + } + public void setRequestContent(String data, String charset) throws UnsupportedEncodingException { + if (charset == null) { + ce.setRequestContent(new org.eclipse.jetty.io.ByteArrayBuffer(data)); + } else { + ce.setRequestContent(new org.eclipse.jetty.io.ByteArrayBuffer(data, charset)); + } + } + public void setRequestContent(InputStream ins) { + ce.setRequestContentSource(ins); + } + + public void addRequestHeader(String key, String s) { + ce.addRequestHeader(key, s); + } + + public void send(HttpClient client) throws IOException { + client.send(ce); + } + + public byte[] getResponseContentBytes() { + return ce.getResponseContentBytes(); + } + + public Map<String, Collection<String>> getResponseHeaders() { + final HttpFields f = ce.getResponseFields(); + Map<String, Collection<String>> ret = new TreeMap<String, Collection<String>>(String.CASE_INSENSITIVE_ORDER); + for (String n : f.getFieldNamesCollection()) { + ret.put(n, f.getValuesCollection(n)); + } + return ret; + } + + @Override + public void setTimeout(long timeout) { + client.setTimeout(timeout); + ce.setTimeout(timeout); + } + + @Override + public void setSupportRedirect(boolean supportRedirect) { + LinkedList<String> listeners = client.getRegisteredListeners(); + if (listeners == null || !listeners.contains(CamelRedirectListener.class.getName())) { + client.registerListener(CamelRedirectListener.class.getName()); + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpComponent8.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpComponent8.java b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpComponent8.java new file mode 100644 index 0000000..588cf3c --- /dev/null +++ b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpComponent8.java @@ -0,0 +1,132 @@ +/** + * 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.jetty8; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.component.jetty.CamelHttpClient; +import org.apache.camel.component.jetty.JettyHttpComponent; +import org.apache.camel.component.jetty.JettyHttpEndpoint; +import org.apache.camel.util.IntrospectionSupport; +import org.apache.camel.util.ObjectHelper; +import org.eclipse.jetty.server.AbstractConnector; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.util.ssl.SslContextFactory; + +public class JettyHttpComponent8 extends JettyHttpComponent { + + protected CamelHttpClient createCamelHttpClient(SslContextFactory sslContextFactory) { + return new CamelHttpClient8(sslContextFactory); + } + + protected AbstractConnector createConnectorJettyInternal(Server server, + JettyHttpEndpoint endpoint, + SslContextFactory sslcf) { + //Jetty 8 + AbstractConnector result = null; + String hosto = endpoint.getHttpUri().getHost(); + int porto = endpoint.getPort(); + try { + if (sslcf == null && !"https".equals(endpoint.getProtocol())) { + result = (AbstractConnector)ObjectHelper + .loadClass("org.eclipse.jetty.server.nio.SelectChannelConnector", + Server.class.getClassLoader()).newInstance(); + } else if (sslcf == null) { + result = (AbstractConnector)ObjectHelper + .loadClass("org.eclipse.jetty.server.ssl.SslSelectChannelConnector", + Server.class.getClassLoader()).newInstance(); + } else { + result = (AbstractConnector)ObjectHelper + .loadClass("org.eclipse.jetty.server.ssl.SslSelectChannelConnector", + Server.class.getClassLoader()).getConstructor(SslContextFactory.class) + .newInstance(sslcf); + } + Server.class.getMethod("setSendServerVersion", Boolean.TYPE).invoke(server, + endpoint.isSendServerVersion()); + + Server.class.getMethod("setSendDateHeader", Boolean.TYPE).invoke(server, + endpoint.isSendDateHeader()); + + + if (result != null && requestBufferSize != null) { + result.getClass().getMethod("setRequestBufferSize", Integer.TYPE) + .invoke(result, requestBufferSize); + } + if (result != null && requestHeaderSize != null) { + result.getClass().getMethod("setRequestHeaderSize", Integer.TYPE) + .invoke(result, requestHeaderSize); + } + if (result != null && responseBufferSize != null) { + result.getClass().getMethod("setResponseBufferSize", Integer.TYPE) + .invoke(result, responseBufferSize); + } + if (result != null && responseHeaderSize != null) { + result.getClass().getMethod("setResponseBufferSize", Integer.TYPE) + .invoke(result, responseHeaderSize); + } + result.getClass().getMethod("setPort", Integer.TYPE).invoke(result, porto); + if (hosto != null) { + result.getClass().getMethod("setHost", String.class).invoke(result, hosto); + } + } catch (RuntimeException rex) { + throw rex; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + try { + result.getClass().getMethod("setPort", Integer.TYPE).invoke(result, porto); + if (hosto != null) { + result.getClass().getMethod("setHost", String.class).invoke(result, hosto); + } + if (getSocketConnectorProperties() != null && !"https".equals(endpoint.getProtocol())) { + // must copy the map otherwise it will be deleted + Map<String, Object> properties = new HashMap<String, Object>(getSocketConnectorProperties()); + IntrospectionSupport.setProperties(result, properties); + if (properties.size() > 0) { + throw new IllegalArgumentException("There are " + properties.size() + + " parameters that couldn't be set on the SocketConnector." + + " Check the uri if the parameters are spelt correctly and that they are properties of the SelectChannelConnector." + + " Unknown parameters=[" + properties + "]"); + } + } else if (getSslSocketConnectorProperties() != null && "https".equals(endpoint.getProtocol())) { + // must copy the map otherwise it will be deleted + Map<String, Object> properties = new HashMap<String, Object>(getSslSocketConnectorProperties()); + IntrospectionSupport.setProperties(result, properties); + if (properties.size() > 0) { + throw new IllegalArgumentException("There are " + properties.size() + + " parameters that couldn't be set on the SocketConnector." + + " Check the uri if the parameters are spelt correctly and that they are properties of the SelectChannelConnector." + + " Unknown parameters=[" + properties + "]"); + } + } + + } catch (RuntimeException rex) { + throw rex; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + return result; + } + + @Override + protected JettyHttpEndpoint createEndpoint(URI endpointUri, URI httpUri) throws URISyntaxException { + return new JettyHttpEndpoint8(this, endpointUri.toString(), httpUri); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpEndpoint8.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpEndpoint8.java b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpEndpoint8.java new file mode 100644 index 0000000..9cbd353 --- /dev/null +++ b/components/camel-jetty8/src/main/java/org/apache/camel/component/jetty8/JettyHttpEndpoint8.java @@ -0,0 +1,36 @@ +/** + * 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.jetty8; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.camel.component.jetty.JettyContentExchange; +import org.apache.camel.component.jetty.JettyHttpComponent; +import org.apache.camel.component.jetty.JettyHttpEndpoint; + +public class JettyHttpEndpoint8 extends JettyHttpEndpoint { + public JettyHttpEndpoint8(JettyHttpComponent component, String uri, URI httpURL) throws URISyntaxException { + super(component, uri, httpURL); + } + + @Override + public JettyContentExchange createContentExchange() { + return new JettyContentExchange8(); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/resources/META-INF/LICENSE.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/resources/META-INF/LICENSE.txt b/components/camel-jetty8/src/main/resources/META-INF/LICENSE.txt new file mode 100755 index 0000000..6b0b127 --- /dev/null +++ b/components/camel-jetty8/src/main/resources/META-INF/LICENSE.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed 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. + http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/resources/META-INF/NOTICE.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/resources/META-INF/NOTICE.txt b/components/camel-jetty8/src/main/resources/META-INF/NOTICE.txt new file mode 100644 index 0000000..2e215bf --- /dev/null +++ b/components/camel-jetty8/src/main/resources/META-INF/NOTICE.txt @@ -0,0 +1,11 @@ + ========================================================================= + == NOTICE file corresponding to the section 4 d of == + == the Apache License, Version 2.0, == + == in this case for the Apache Camel distribution. == + ========================================================================= + + This product includes software developed by + The Apache Software Foundation (http://www.apache.org/). + + Please read the different LICENSE files present in the licenses directory of + this distribution. http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/TypeConverter ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/TypeConverter b/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/TypeConverter new file mode 100644 index 0000000..aa69a0f --- /dev/null +++ b/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/TypeConverter @@ -0,0 +1,18 @@ +# +# 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. +# + +org.apache.camel.component.jetty.JettyConverter http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/component/jetty ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/component/jetty b/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/component/jetty new file mode 100644 index 0000000..13116dc --- /dev/null +++ b/components/camel-jetty8/src/main/resources/META-INF/services/org/apache/camel/component/jetty @@ -0,0 +1,17 @@ +# +# 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. +# +class=org.apache.camel.component.jetty8.JettyHttpComponent8 http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/data/logo.jpeg ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/data/logo.jpeg b/components/camel-jetty8/src/test/data/logo.jpeg new file mode 100644 index 0000000..b635017 Binary files /dev/null and b/components/camel-jetty8/src/test/data/logo.jpeg differ http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/data/plain.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/data/plain.txt b/components/camel-jetty8/src/test/data/plain.txt new file mode 100644 index 0000000..3ef60fd --- /dev/null +++ b/components/camel-jetty8/src/test/data/plain.txt @@ -0,0 +1,18 @@ +## ------------------------------------------------------------------------ +## 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. +## ------------------------------------------------------------------------ +Hello World +This is the second line \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/java.jpg ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/java.jpg b/components/camel-jetty8/src/test/resources/java.jpg new file mode 100644 index 0000000..dc59bee Binary files /dev/null and b/components/camel-jetty8/src/test/resources/java.jpg differ http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/jsse/localhost-alias.ks ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/jsse/localhost-alias.ks b/components/camel-jetty8/src/test/resources/jsse/localhost-alias.ks new file mode 100644 index 0000000..33fb9b6 Binary files /dev/null and b/components/camel-jetty8/src/test/resources/jsse/localhost-alias.ks differ http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/jsse/localhost.ks ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/jsse/localhost.ks b/components/camel-jetty8/src/test/resources/jsse/localhost.ks new file mode 100644 index 0000000..f285418 Binary files /dev/null and b/components/camel-jetty8/src/test/resources/jsse/localhost.ks differ http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/log4j.properties b/components/camel-jetty8/src/test/resources/log4j.properties new file mode 100644 index 0000000..7be001b --- /dev/null +++ b/components/camel-jetty8/src/test/resources/log4j.properties @@ -0,0 +1,47 @@ +## --------------------------------------------------------------------------- +## 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. +## --------------------------------------------------------------------------- + +# +# The logging properties used during tests.. +# +# +# The logging properties used for eclipse testing, We want to see debug output on the console. +# +log4j.rootLogger=INFO, file + +# uncomment the following to enable camel debugging +#log4j.logger.org.apache.camel.component.jetty=TRACE +#log4j.logger.org.apache.camel.component.jetty.CamelContinuationServlet=TRACE +#log4j.logger.org.apache.camel.component.http.CamelServlet=TRACE +#log4j.logger.org.apache.camel.component.jetty.JettyContentExchange=DEBUG +#log4j.logger.org.apache.camel.component.http=TRACE +#log4j.logger.org.apache.camel=DEBUG +#log4j.logger.org.apache.camel.impl.converter.PropertyEditorTypeConverter=TRACE + +#log4j.logger.org.eclipse.jetty=TRACE + +# CONSOLE appender not used by default +log4j.appender.out=org.apache.log4j.ConsoleAppender +log4j.appender.out.layout=org.apache.log4j.PatternLayout +#log4j.appender.out.layout.ConversionPattern=[%30.30t] %-30.30c{1} %-5p %m%n +log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n + +# File appender +log4j.appender.file=org.apache.log4j.FileAppender +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n +log4j.appender.file.file=target/camel-jetty-test.log http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/myRealm.properties ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/myRealm.properties b/components/camel-jetty8/src/test/resources/myRealm.properties new file mode 100644 index 0000000..2f8f01e --- /dev/null +++ b/components/camel-jetty8/src/test/resources/myRealm.properties @@ -0,0 +1,18 @@ +## --------------------------------------------------------------------------- +## 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. +## --------------------------------------------------------------------------- + +donald: duck, user \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/JettyComponentSpringConfiguredTest.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/JettyComponentSpringConfiguredTest.xml b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/JettyComponentSpringConfiguredTest.xml new file mode 100644 index 0000000..0809f5b --- /dev/null +++ b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/JettyComponentSpringConfiguredTest.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + "> + + <bean id="jetty2" class="org.apache.camel.component.jetty8.JettyHttpComponent8"> + <property name="enableJmx" value="true"/> + <property name="minThreads" value="10"/> + <property name="maxThreads" value="50"/> + </bean> + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + + <route> + <from uri="jetty2:http://localhost:9090/myapp"/> + <transform> + <simple>Hello ${body}</simple> + </transform> + </route> + + </camelContext> + +</beans> http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-https.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-https.xml b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-https.xml new file mode 100644 index 0000000..b58cf77 --- /dev/null +++ b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-https.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + "> + <bean id="jetty" class="org.apache.camel.component.jetty8.JettyHttpComponent8"> + <property name="sslPassword" value="changeit"/> + <property name="sslKeyPassword" value="changeit"/> + <property name="keystore" value="src/test/resources/jsse/localhost.ks"/> + </bean> + + + <bean id="dynaPort" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <property name="targetClass"> + <value>org.apache.camel.test.AvailablePortFinder</value> + </property> + <property name="targetMethod"> + <value>getNextAvailable</value> + </property> + <property name="arguments"> + <list> + <value>9000</value> + </list> + </property> + </bean> + + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <endpoint id="input1" uri="jetty:https://localhost:#{dynaPort}/test"/> + + <route> + <from ref="input1"/> + <to uri="mock:a"/> + </route> + </camelContext> + +</beans> http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml new file mode 100644 index 0000000..210fecd --- /dev/null +++ b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection-redelivery.xml @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + "> + + <bean id="dynaPort" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <property name="targetClass"> + <value>org.apache.camel.test.AvailablePortFinder</value> + </property> + <property name="targetMethod"> + <value>getNextAvailable</value> + </property> + <property name="arguments"> + <list> + <value>9000</value> + </list> + </property> + </bean> + + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <endpoint id="httpEndpoint" uri="http://localhost:#{dynaPort}/hi"/> + <endpoint id="jettyEndpoint" uri="jetty:http://localhost:#{dynaPort}/hi"/> + + <route> + <from uri="direct:start"/> + <onException> + <exception>java.net.ConnectException</exception> + <redeliveryPolicy maximumRedeliveries="4" redeliveryDelay="100" maximumRedeliveryDelay="5000" + backOffMultiplier="2" useExponentialBackOff="true"/> + </onException> + <to ref="httpEndpoint"/> + </route> + + <route id="jetty"> + + <from ref="jettyEndpoint"/> + <transform><simple>Bye ${body}</simple></transform> + </route> + + </camelContext> + +</beans> http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml ---------------------------------------------------------------------- diff --git a/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml new file mode 100644 index 0000000..db38b86 --- /dev/null +++ b/components/camel-jetty8/src/test/resources/org/apache/camel/component/jetty/jetty-noconnection.xml @@ -0,0 +1,56 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + 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. +--> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation=" + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd + http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd + "> + + + <bean id="dynaPort" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> + <property name="targetClass"> + <value>org.apache.camel.test.AvailablePortFinder</value> + </property> + <property name="targetMethod"> + <value>getNextAvailable</value> + </property> + <property name="arguments"> + <list> + <value>5000</value> + </list> + </property> + </bean> + + <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> + <endpoint id="httpEndpoint" uri="http://localhost:#{dynaPort}/hi"/> + <endpoint id="jettyEndpoint" uri="jetty:http://localhost:#{dynaPort}/hi"/> + + <route> + <from uri="direct:start"/> + <to ref="httpEndpoint"/> + </route> + + <route id="jetty"> + <from ref="jettyEndpoint"/> + <transform><simple>Bye ${body}</simple></transform> + </route> + + </camelContext> + +</beans> http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java new file mode 100644 index 0000000..82ce70f --- /dev/null +++ b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/AttachmentHttpBinding.java @@ -0,0 +1,75 @@ +package org.apache.camel.component.jetty9; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.Collection; + +import javax.activation.DataHandler; +import javax.activation.DataSource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.Part; + +import org.apache.camel.component.http.DefaultHttpBinding; +import org.apache.camel.component.http.HttpEndpoint; +import org.apache.camel.component.http.HttpMessage; +import org.eclipse.jetty.util.MultiPartInputStreamParser; + +final class AttachmentHttpBinding extends DefaultHttpBinding { + AttachmentHttpBinding(HttpEndpoint endpoint) { + super(endpoint); + } + + @Override + protected void populateAttachments(HttpServletRequest request, HttpMessage message) { + Object object = request.getAttribute("org.eclipse.jetty.servlet.MultiPartFile.multiPartInputStream"); + if (object instanceof MultiPartInputStreamParser) { + MultiPartInputStreamParser parser = (MultiPartInputStreamParser)object; + Collection<Part> parts; + try { + parts = parser.getParts(); + for (Part part : parts) { + String contentType = part.getContentType(); + if (!contentType.startsWith("application/octet-stream")) { + continue; + } + + DataSource ds = new PartDataSource(part); + message.addAttachment(part.getName(), new DataHandler(ds)); + } + } catch (Exception e) { + e.printStackTrace(); + } + + + } + } + + final class PartDataSource implements DataSource { + private final Part part; + + PartDataSource(Part part) { + this.part = part; + } + + @Override + public OutputStream getOutputStream() throws IOException { + return null; + } + + @Override + public String getName() { + return part.getName(); + } + + @Override + public InputStream getInputStream() throws IOException { + return part.getInputStream(); + } + + @Override + public String getContentType() { + return part.getContentType(); + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/CamelHttpClient9.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/CamelHttpClient9.java b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/CamelHttpClient9.java new file mode 100644 index 0000000..001662f --- /dev/null +++ b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/CamelHttpClient9.java @@ -0,0 +1,52 @@ +/** + * 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.jetty9; + +import java.util.concurrent.Executor; + +import org.apache.camel.component.jetty.CamelHttpClient; +import org.eclipse.jetty.util.ssl.SslContextFactory; + +public class CamelHttpClient9 extends CamelHttpClient { + + public CamelHttpClient9(SslContextFactory sslContextFactory) { + super(sslContextFactory); + } + + protected boolean hasThreadPool() { + return getExecutor() != null; + } + + protected void setThreadPoolOrExecutor(Executor pool) { + setExecutor(pool); + } + + public void setProxy(String host, int port) { + getProxyConfiguration().getProxies().add(new org.eclipse.jetty.client.HttpProxy(host, port)); + } + + @Override + public String getProxyHost() { + return getProxyConfiguration().getProxies().get(0).getAddress().getHost(); + } + + @Override + public int getProxyPort() { + return getProxyConfiguration().getProxies().get(0).getAddress().getPort(); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/a59becd7/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyContentExchange9.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyContentExchange9.java b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyContentExchange9.java new file mode 100644 index 0000000..3ee2072 --- /dev/null +++ b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyContentExchange9.java @@ -0,0 +1,295 @@ +/** + * 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.jetty9; + +import java.io.Closeable; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.MalformedURLException; +import java.util.Collection; +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +import org.apache.camel.AsyncCallback; +import org.apache.camel.CamelExchangeException; +import org.apache.camel.Exchange; +import org.apache.camel.ExchangeTimedOutException; +import org.apache.camel.component.jetty.JettyContentExchange; +import org.apache.camel.component.jetty.JettyHttpBinding; +import org.eclipse.jetty.client.HttpClient; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.client.api.Response; +import org.eclipse.jetty.client.api.Result; +import org.eclipse.jetty.client.util.BufferingResponseListener; +import org.eclipse.jetty.client.util.BytesContentProvider; +import org.eclipse.jetty.client.util.InputStreamContentProvider; +import org.eclipse.jetty.client.util.StringContentProvider; +import org.eclipse.jetty.http.HttpFields; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Jetty specific exchange which keeps track of the the request and response. + * + * @version + */ +public class JettyContentExchange9 implements JettyContentExchange { + + private static final Logger LOG = LoggerFactory.getLogger(JettyContentExchange9.class); + + private volatile Exchange exchange; + private volatile AsyncCallback callback; + private volatile JettyHttpBinding jettyBinding; + private volatile HttpClient client; + private final CountDownLatch done = new CountDownLatch(1); + private Request request; + private Response response; + private byte[] responseContent; + + private String requestContentType; + + private boolean supportRedirect; + + public void init(Exchange exchange, JettyHttpBinding jettyBinding, + final HttpClient client, AsyncCallback callback) { + this.exchange = exchange; + this.jettyBinding = jettyBinding; + this.client = client; + this.callback = callback; + } + + protected void onRequestComplete() { + LOG.trace("onRequestComplete"); + closeRequestContentSource(); + } + + protected void onResponseComplete(Result result, byte[] content, String contentType) { + LOG.trace("onResponseComplete"); + done.countDown(); + this.response = result.getResponse(); + this.responseContent = content; + if (callback == null) { + // this is only for the async callback + return; + } + try { + jettyBinding.populateResponse(exchange, this); + } catch (Exception e) { + exchange.setException(e); + } finally { + callback.done(false); + } + } + + protected void onExpire() { + LOG.trace("onExpire"); + + // need to close the request input stream + closeRequestContentSource(); + doTaskCompleted(new ExchangeTimedOutException(exchange, client.getConnectTimeout())); + } + + protected void onException(Throwable ex) { + LOG.trace("onException {}", ex); + + // need to close the request input stream + closeRequestContentSource(); + doTaskCompleted(ex); + } + + protected void onConnectionFailed(Throwable ex) { + LOG.trace("onConnectionFailed {}", ex); + + // need to close the request input stream + closeRequestContentSource(); + doTaskCompleted(ex); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#getBody() + */ + public byte[] getBody() { + // must return the content as raw bytes + return getResponseContentBytes(); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#getUrl() + */ + public String getUrl() { + try { + return this.request.getURI().toURL().toExternalForm(); + } catch (MalformedURLException e) { + throw new IllegalStateException(e.getMessage(), e); + } + } + + protected void closeRequestContentSource() { + tryClose(this.request.getContent()); + } + + private void tryClose(Object obj) { + if (obj instanceof Closeable) { + try { + ((Closeable)obj).close(); + } catch (IOException e) { + // Ignore + } + } + } + + protected void doTaskCompleted(Throwable ex) { + if (ex instanceof TimeoutException) { + exchange.setException(new ExchangeTimedOutException(exchange, request.getTimeout())); + } else { + exchange.setException(new CamelExchangeException("JettyClient failed cause by: " + ex.getMessage(), exchange, ex)); + } + done.countDown(); + + if (callback != null) { + // now invoke callback to indicate we are done async + callback.done(false); + } + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setRequestContentType(java.lang.String) + */ + public void setRequestContentType(String contentType) { + this.requestContentType = contentType; + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#getResponseStatus() + */ + public int getResponseStatus() { + return this.response.getStatus(); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setMethod(java.lang.String) + */ + public void setMethod(String method) { + this.request.method(method); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setTimeout(long) + */ + public void setTimeout(long timeout) { + this.request.timeout(timeout, TimeUnit.MILLISECONDS); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setURL(java.lang.String) + */ + public void setURL(String url) { + this.request = client.newRequest(url); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setRequestContent(byte[]) + */ + public void setRequestContent(byte[] byteArray) { + this.request.content(new BytesContentProvider(byteArray), this.requestContentType); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setRequestContent(java.lang.String, java.lang.String) + */ + public void setRequestContent(String data, String charset) throws UnsupportedEncodingException { + StringContentProvider cp = charset != null ? new StringContentProvider(data, charset) : new StringContentProvider(data); + this.request.content(cp, this.requestContentType); + } + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#setRequestContent(java.io.InputStream) + */ + public void setRequestContent(InputStream ins) { + this.request.content(new InputStreamContentProvider(ins), this.requestContentType); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#addRequestHeader(java.lang.String, java.lang.String) + */ + public void addRequestHeader(String key, String s) { + this.request.header(key, s); + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#send(org.eclipse.jetty.client.HttpClient) + */ + public void send(HttpClient client) throws IOException { + org.eclipse.jetty.client.api.Request.Listener listener = new Request.Listener.Adapter() { + + @Override + public void onSuccess(Request request) { + onRequestComplete(); + } + + @Override + public void onFailure(Request request, Throwable failure) { + onConnectionFailed(failure); + } + + }; + BufferingResponseListener responseListener = new BufferingResponseListener() { + + @Override + public void onComplete(Result result) { + if (result.isFailed()) { + doTaskCompleted(result.getFailure()); + } else { + onResponseComplete(result, getContent(), getMediaType()); + } + } + }; + request.followRedirects(supportRedirect).listener(listener).send(responseListener); + } + + protected void setResponse(Response response) { + this.response = response; + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#getResponseContentBytes() + */ + public byte[] getResponseContentBytes() { + return responseContent; + } + + /* (non-Javadoc) + * @see org.apache.camel.component.jetty.JettyContentExchangeI#getResponseHeaders() + */ + public Map<String, Collection<String>> getResponseHeaders() { + final HttpFields f = response.getHeaders(); + Map<String, Collection<String>> ret = new TreeMap<String, Collection<String>>(String.CASE_INSENSITIVE_ORDER); + for (String n : f.getFieldNamesCollection()) { + ret.put(n, f.getValuesList(n)); + } + return ret; + } + + @Override + public void setSupportRedirect(boolean supportRedirect) { + this.supportRedirect = supportRedirect; + } + +}