http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/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; + } + +}
http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpComponent9.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpComponent9.java b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpComponent9.java new file mode 100644 index 0000000..ec53cdc --- /dev/null +++ b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpComponent9.java @@ -0,0 +1,140 @@ +/** + * 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.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +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.eclipse.jetty.server.AbstractConnector; +import org.eclipse.jetty.server.ConnectionFactory; +import org.eclipse.jetty.server.Connector; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.SslConnectionFactory; +import org.eclipse.jetty.util.ssl.SslContextFactory; + +public class JettyHttpComponent9 extends JettyHttpComponent { + + protected CamelHttpClient createCamelHttpClient(SslContextFactory sslContextFactory) { + return new CamelHttpClient9(sslContextFactory); + } + + protected JettyHttpEndpoint createEndpoint(URI endpointUri, URI httpUri) throws URISyntaxException { + return new JettyHttpEndpoint9(this, endpointUri.toString(), httpUri); + } + + protected Connector getSslSocketConnector(Server server, JettyHttpEndpoint endpoint) { + Connector answer = null; + /* + if (sslSocketConnectors != null) { + SslContextFactory con = sslSocketConnectors.get(endpoint.getPort()); + if (con != null) { + SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(con, null); + @SuppressWarnings("resource") + ServerConnector sc = new ServerConnector(server, sslConnectionFactory); + sc.setPort(endpoint.getPort()); + sc.setHost(endpoint.getHttpUri().getHost()); + answer = sc; + } + } + */ + if (answer == null) { + answer = createConnector(server, endpoint); + } + return answer; + } + + protected AbstractConnector createConnectorJettyInternal(Server server, + JettyHttpEndpoint endpoint, + SslContextFactory sslcf) { + try { + String hosto = endpoint.getHttpUri().getHost(); + int porto = endpoint.getPort(); + org.eclipse.jetty.server.HttpConfiguration httpConfig = new org.eclipse.jetty.server.HttpConfiguration(); + httpConfig.setSendServerVersion(endpoint.isSendServerVersion()); + httpConfig.setSendDateHeader(endpoint.isSendDateHeader()); + httpConfig.setSendDateHeader(endpoint.isSendDateHeader()); + + if (requestBufferSize != null) { + // Does not work + //httpConfig.setRequestBufferSize(requestBufferSize); + } + if (requestHeaderSize != null) { + httpConfig.setRequestHeaderSize(requestHeaderSize); + } + if (responseBufferSize != null) { + httpConfig.setOutputBufferSize(responseBufferSize); + } + if (responseHeaderSize != null) { + httpConfig.setResponseHeaderSize(responseHeaderSize); + } + + HttpConnectionFactory httpFactory = new org.eclipse.jetty.server.HttpConnectionFactory(httpConfig); + + ArrayList<ConnectionFactory> connectionFactories = new ArrayList<ConnectionFactory>(); + ServerConnector result = new org.eclipse.jetty.server.ServerConnector(server); + if (sslcf != null) { + httpConfig.addCustomizer(new org.eclipse.jetty.server.SecureRequestCustomizer()); + SslConnectionFactory scf = new org.eclipse.jetty.server.SslConnectionFactory(sslcf, "HTTP/1.1"); + connectionFactories.add(scf); + result.setDefaultProtocol("SSL-HTTP/1.1"); + } + connectionFactories.add(httpFactory); + result.setConnectionFactories(connectionFactories); + result.setPort(porto); + if (hosto != null) { + result.setHost(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(httpConfig, 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(sslcf, 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 + "]"); + } + } + return result; + } catch (RuntimeException rex) { + throw rex; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpEndpoint9.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpEndpoint9.java b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpEndpoint9.java new file mode 100644 index 0000000..9c5ac6a --- /dev/null +++ b/components/camel-jetty9/src/main/java/org/apache/camel/component/jetty9/JettyHttpEndpoint9.java @@ -0,0 +1,36 @@ +package org.apache.camel.component.jetty9; + +import java.net.URI; +import java.net.URISyntaxException; + +import org.apache.camel.component.http.HttpBinding; +import org.apache.camel.component.jetty.JettyContentExchange; +import org.apache.camel.component.jetty.JettyHttpComponent; +import org.apache.camel.component.jetty.JettyHttpEndpoint; + +public class JettyHttpEndpoint9 extends JettyHttpEndpoint { + private HttpBinding binding; + + public JettyHttpEndpoint9(JettyHttpComponent component, String uri, URI httpURL) throws URISyntaxException { + super(component, uri, httpURL); + } + + @Override + public HttpBinding getBinding() { + if (this.binding == null) { + this.binding = new AttachmentHttpBinding(this); + } + return this.binding; + } + + @Override + public void setBinding(HttpBinding binding) { + super.setBinding(binding); + this.binding = binding; + } + + @Override + public JettyContentExchange createContentExchange() { + return new JettyContentExchange9(); + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/main/resources/META-INF/LICENSE.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/resources/META-INF/LICENSE.txt b/components/camel-jetty9/src/main/resources/META-INF/LICENSE.txt new file mode 100755 index 0000000..6b0b127 --- /dev/null +++ b/components/camel-jetty9/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/0d96e56d/components/camel-jetty9/src/main/resources/META-INF/NOTICE.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/resources/META-INF/NOTICE.txt b/components/camel-jetty9/src/main/resources/META-INF/NOTICE.txt new file mode 100644 index 0000000..2e215bf --- /dev/null +++ b/components/camel-jetty9/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/0d96e56d/components/camel-jetty9/src/main/resources/META-INF/services/org/apache/camel/TypeConverter ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/resources/META-INF/services/org/apache/camel/TypeConverter b/components/camel-jetty9/src/main/resources/META-INF/services/org/apache/camel/TypeConverter new file mode 100644 index 0000000..aa69a0f --- /dev/null +++ b/components/camel-jetty9/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/0d96e56d/components/camel-jetty9/src/main/resources/META-INF/services/org/apache/camel/component/jetty ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/main/resources/META-INF/services/org/apache/camel/component/jetty b/components/camel-jetty9/src/main/resources/META-INF/services/org/apache/camel/component/jetty new file mode 100644 index 0000000..ee67054 --- /dev/null +++ b/components/camel-jetty9/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.jetty9.JettyHttpComponent9 http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/data/logo.jpeg ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/data/logo.jpeg b/components/camel-jetty9/src/test/data/logo.jpeg new file mode 100644 index 0000000..b635017 Binary files /dev/null and b/components/camel-jetty9/src/test/data/logo.jpeg differ http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/data/plain.txt ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/data/plain.txt b/components/camel-jetty9/src/test/data/plain.txt new file mode 100644 index 0000000..3ef60fd --- /dev/null +++ b/components/camel-jetty9/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/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/BaseJettyTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/BaseJettyTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/BaseJettyTest.java new file mode 100644 index 0000000..aeb196f --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/BaseJettyTest.java @@ -0,0 +1,119 @@ +/** + * 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.util.Properties; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.camel.CamelContext; +import org.apache.camel.component.http.DefaultHttpBinding; +import org.apache.camel.component.http.HttpHeaderFilterStrategy; +import org.apache.camel.component.properties.PropertiesComponent; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.test.AvailablePortFinder; +import org.apache.camel.test.junit4.CamelTestSupport; +import org.eclipse.jetty.server.Server; +import org.junit.BeforeClass; + +public abstract class BaseJettyTest extends CamelTestSupport { + + private static volatile int port; + + private static volatile int port2; + + private final AtomicInteger counter = new AtomicInteger(1); + + @BeforeClass + public static void initPort() throws Exception { + // start from somewhere in the 23xxx range + port = AvailablePortFinder.getNextAvailable(23000); + // find another ports for proxy route test + port2 = AvailablePortFinder.getNextAvailable(24000); + } + + @Override + protected CamelContext createCamelContext() throws Exception { + CamelContext context = super.createCamelContext(); + context.addComponent("properties", new PropertiesComponent("ref:prop")); + return context; + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + + Properties prop = new Properties(); + prop.setProperty("port", "" + getPort()); + prop.setProperty("port2", "" + getPort2()); + jndi.bind("prop", prop); + return jndi; + } + + protected int getNextPort() { + return AvailablePortFinder.getNextAvailable(port + counter.getAndIncrement()); + } + + protected int getNextPort(int startWithPort) { + return AvailablePortFinder.getNextAvailable(startWithPort); + } + + public void setSSLProps(JettyHttpComponent jetty, String path, String keyStorePasswd, String keyPasswd) { + if (jettyVersion() == 9) { + jetty.addSslSocketConnectorProperty("keyStorePassword", keyStorePasswd); + jetty.addSslSocketConnectorProperty("keyManagerPassword", keyPasswd); + jetty.addSslSocketConnectorProperty("keyStorePath", path); + jetty.addSslSocketConnectorProperty("trustStoreType", "JKS"); + } else { + jetty.addSslSocketConnectorProperty("password", keyStorePasswd); + jetty.addSslSocketConnectorProperty("keyPassword", keyPasswd); + jetty.addSslSocketConnectorProperty("keystore", path); + jetty.addSslSocketConnectorProperty("truststoreType", "JKS"); + } + } + + protected static int getPort() { + return port; + } + + protected static int getPort2() { + return port2; + } + + public int jettyVersion() { + try { + this.getClass().getClassLoader().loadClass("org.eclipse.jetty.server.ssl.SslSelectChannelConnector"); + return 8; + } catch (ClassNotFoundException e) { + return 9; + } + } + + protected void allowNullHeaders() { + JettyHttpComponent jetty = (JettyHttpComponent)context.getComponent("jetty"); + HttpHeaderFilterStrategy filterStrat = new HttpHeaderFilterStrategy(); + filterStrat.setAllowNullValues(true); + @SuppressWarnings("deprecation") + DefaultHttpBinding httpBinding = new DefaultHttpBinding(filterStrat); + jetty.setHttpBinding(httpBinding); + } + + protected boolean isJetty8() { + String majorVersion = Server.getVersion().split("\\.")[0]; + return "8".equals(majorVersion); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ConvertPayloadToInputStreamTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ConvertPayloadToInputStreamTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ConvertPayloadToInputStreamTest.java new file mode 100644 index 0000000..c1d8f1f --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ConvertPayloadToInputStreamTest.java @@ -0,0 +1,64 @@ +/** + * 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.InputStream; +import java.util.List; + +import org.apache.camel.Exchange; +import org.apache.camel.Message; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.mock.MockEndpoint; +import org.junit.Test; + +/** + * @version + */ +public class ConvertPayloadToInputStreamTest extends BaseJettyTest { + protected String expectedBody = "<hello>world!</hello>"; + + @Test + public void testConvertPayloadToInputStream() throws Exception { + MockEndpoint mockEndpoint = getMockEndpoint("mock:result"); + mockEndpoint.expectedMessageCount(1); + + template.requestBodyAndHeader("http://localhost:{{port}}/test", expectedBody, "Content-Type", "application/xml"); + + mockEndpoint.assertIsSatisfied(); + List<Exchange> list = mockEndpoint.getReceivedExchanges(); + Exchange exchange = list.get(0); + assertNotNull("exchange", exchange); + + Message in = exchange.getIn(); + assertNotNull("in", in); + + Object actual = in.getBody(); + InputStream value = assertIsInstanceOf(InputStream.class, actual); + assertNotNull("InputStream", value); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() { + from("jetty:http://localhost:{{port}}/test"). + convertBodyTo(InputStream.class). + to("mock:result"); + } + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/CustomFiltersTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/CustomFiltersTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/CustomFiltersTest.java new file mode 100644 index 0000000..463151b --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/CustomFiltersTest.java @@ -0,0 +1,109 @@ +/** + * 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.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.FilterConfig; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletResponse; + +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.impl.JndiRegistry; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.methods.PostMethod; +import org.apache.commons.httpclient.methods.StringRequestEntity; +import org.junit.Test; + +public class CustomFiltersTest extends BaseJettyTest { + + private static class MyTestFilter implements Filter { + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + // set a marker attribute to show that this filter class was used + ((HttpServletResponse)response).addHeader("MyTestFilter", "true"); + chain.doFilter(request , response); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + // do nothing here + } + + @Override + public void destroy() { + // do nothing here + } + } + + private void sendRequestAndVerify(String url) throws Exception { + HttpClient httpclient = new HttpClient(); + + PostMethod httppost = new PostMethod(url); + + StringRequestEntity reqEntity = new StringRequestEntity("This is a test", null, null); + httppost.setRequestEntity(reqEntity); + + int status = httpclient.executeMethod(httppost); + + assertEquals("Get a wrong response status", 200, status); + + String result = httppost.getResponseBodyAsString(); + assertEquals("Get a wrong result", "This is a test response", result); + assertNotNull("Did not use custom multipart filter", httppost.getResponseHeader("MyTestFilter")); + } + + @Test + public void testFilters() throws Exception { + sendRequestAndVerify("http://localhost:" + getPort() + "/testFilters"); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + List<Filter> filters = new ArrayList<Filter>(); + filters.add(new MyTestFilter()); + jndi.bind("myFilters", filters); + return jndi; + } + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + + // Test the filter list options + from("jetty://http://localhost:{{port}}/testFilters?filtersRef=myFilters").process(new Processor() { + public void process(Exchange exchange) throws Exception { + Message in = exchange.getIn(); + String request = in.getBody(String.class); + // The other form date can be get from the message header + exchange.getOut().setBody(request + " response"); + } + }); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/EnableCORSTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/EnableCORSTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/EnableCORSTest.java new file mode 100644 index 0000000..e893775 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/EnableCORSTest.java @@ -0,0 +1,71 @@ +/** + * 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 org.apache.camel.builder.RouteBuilder; +import org.apache.commons.httpclient.Header; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.HttpMethod; +import org.apache.commons.httpclient.methods.GetMethod; +import org.junit.Test; + +public class EnableCORSTest extends BaseJettyTest { + + @Test + public void testCORSdisabled() throws Exception { + HttpClient httpclient = new HttpClient(); + HttpMethod httpMethod = new GetMethod("http://localhost:" + getPort() + "/test1"); + httpMethod.addRequestHeader("Origin", "http://localhost:9000"); + httpMethod.addRequestHeader("Referer", "http://localhost:9000"); + + int status = httpclient.executeMethod(httpMethod); + + assertEquals("Get a wrong response status", 200, status); + + Header responseHeader = httpMethod.getResponseHeader("Access-Control-Allow-Credentials"); + assertNull("Access-Control-Allow-Credentials HEADER should not be set", responseHeader); + } + + + @Test + public void testCORSenabled() throws Exception { + HttpClient httpclient = new HttpClient(); + HttpMethod httpMethod = new GetMethod("http://localhost:" + getPort2() + "/test2"); + httpMethod.addRequestHeader("Origin", "http://localhost:9000"); + httpMethod.addRequestHeader("Referer", "http://localhost:9000"); + + + int status = httpclient.executeMethod(httpMethod); + + assertEquals("Get a wrong response status", 200, status); + + Header responseHeader = httpMethod.getResponseHeader("Access-Control-Allow-Credentials"); + assertTrue("CORS not enabled", Boolean.valueOf(responseHeader.getValue())); + + + } + + + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty://http://localhost:{{port}}/test1?enableCORS=false").transform(simple("OK")); + from("jetty://http://localhost:{{port2}}/test2?enableCORS=true").transform(simple("OK")); + } + }; + } +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsRouteTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsRouteTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsRouteTest.java new file mode 100644 index 0000000..6a4b635 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsRouteTest.java @@ -0,0 +1,69 @@ +/** + * 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.net.URISyntaxException; +import java.util.HashMap; +import java.util.Map; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.eclipse.jetty.server.Connector; +import org.junit.Ignore; + +@Ignore +public class ExplicitHttpsRouteTest extends HttpsRouteTest { + + private Connector createSslSocketConnector(int port) throws URISyntaxException { + /* + SslSelectChannelConnector sslSocketConnector = new SslSelectChannelConnector(); + configureSslContextFactory(sslSocketConnector.getSslContextFactory()); + sslSocketConnector.setPort(port); + return sslSocketConnector; + */ + return null; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws URISyntaxException { + // START SNIPPET: e1 + // create SSL select channel connectors for port 9080 and 9090 + Map<Integer, Connector> connectors = new HashMap<Integer, Connector>(); + connectors.put(port1, createSslSocketConnector(port1)); + connectors.put(port2, createSslSocketConnector(port2)); + + JettyHttpComponent jetty = getContext().getComponent("jetty", JettyHttpComponent.class); + jetty.setSslSocketConnectors(connectors); + // END SNIPPET: e1 + + from("jetty:https://localhost:" + port1 + "/test").to("mock:a"); + + Processor proc = new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody("<b>Hello World</b>"); + } + }; + from("jetty:https://localhost:" + port1 + "/hello").process(proc); + + from("jetty:https://localhost:" + port2 + "/test").to("mock:b"); + } + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsSslContextParametersRouteTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsSslContextParametersRouteTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsSslContextParametersRouteTest.java new file mode 100644 index 0000000..79cf75c --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitHttpsSslContextParametersRouteTest.java @@ -0,0 +1,85 @@ +/** + * 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.util.HashMap; +import java.util.Map; + +import org.apache.camel.CamelContext; +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.util.jsse.KeyManagersParameters; +import org.apache.camel.util.jsse.KeyStoreParameters; +import org.apache.camel.util.jsse.SSLContextParameters; +import org.eclipse.jetty.server.Connector; +import org.junit.Ignore; + +@Ignore +public class ExplicitHttpsSslContextParametersRouteTest extends HttpsRouteTest { + + // START SNIPPET: e2 + private Connector createSslSocketConnector(CamelContext context, int port) throws Exception { + KeyStoreParameters ksp = new KeyStoreParameters(); + ksp.setResource(this.getClass().getClassLoader().getResource("jsse/localhost.ks").toString()); + ksp.setPassword(pwd); + + KeyManagersParameters kmp = new KeyManagersParameters(); + kmp.setKeyPassword(pwd); + kmp.setKeyStore(ksp); + + SSLContextParameters sslContextParameters = new SSLContextParameters(); + sslContextParameters.setKeyManagers(kmp); + + // From Camel 2.5.0 Camel-Jetty is using SslSelectChannelConnector instead of SslSocketConnector + //SslSelectChannelConnector sslSocketConnector = new SslSelectChannelConnector(); + //sslSocketConnector.getSslContextFactory().setSslContext(sslContextParameters.createSSLContext()); + //sslSocketConnector.setPort(port); + + //return sslSocketConnector; + return null; + } + // END SNIPPET: e2 + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + // START SNIPPET: e1 + // create SSL select channel connectors for port 9080 and 9090 + Map<Integer, Connector> connectors = new HashMap<Integer, Connector>(); + connectors.put(port1, createSslSocketConnector(getContext(), port1)); + connectors.put(port2, createSslSocketConnector(getContext(), port2)); + + JettyHttpComponent jetty = getContext().getComponent("jetty", JettyHttpComponent.class); + jetty.setSslSocketConnectors(connectors); + // END SNIPPET: e1 + + from("jetty:https://localhost:" + port1 + "/test").to("mock:a"); + + Processor proc = new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody("<b>Hello World</b>"); + } + }; + from("jetty:https://localhost:" + port1 + "/hello").process(proc); + + from("jetty:https://localhost:" + port2 + "/test").to("mock:b"); + } + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitJettyRouteTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitJettyRouteTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitJettyRouteTest.java new file mode 100644 index 0000000..194c42f --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/ExplicitJettyRouteTest.java @@ -0,0 +1,65 @@ +/** + * 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 javax.servlet.http.HttpServletRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.junit.Test; + +/** + * Unit test for wiki demonstration. + */ +public class ExplicitJettyRouteTest extends BaseJettyTest { + + @Test + public void testSendToJetty() throws Exception { + Object response = template.requestBody("http://localhost:{{port}}/myapp/myservice", "bookid=123"); + // convert the response to a String + String body = context.getTypeConverter().convertTo(String.class, response); + assertEquals("<html><body>Book 123 is Camel in Action</body></html>", body); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + from("jetty:http://localhost:{{port}}/myapp/myservice").process(new MyBookService()); + } + }; + } + + public class MyBookService implements Processor { + public void process(Exchange exchange) throws Exception { + // just get the body as a string + String body = exchange.getIn().getBody(String.class); + + // we have access to the HttpServletRequest here and we can grab it if we need it + HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); + assertNotNull(req); + + // for unit testing + assertEquals("bookid=123", body); + + // send a html response + exchange.getOut().setBody("<html><body>Book 123 is Camel in Action</body></html>"); + } + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HandlerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HandlerTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HandlerTest.java new file mode 100644 index 0000000..7ff661f --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HandlerTest.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.impl.JndiRegistry; +import org.apache.camel.util.IOHelper; + +import org.eclipse.jetty.server.handler.StatisticsHandler; + +import org.junit.Test; + +public class HandlerTest extends BaseJettyTest { + private StatisticsHandler statisticsHandler1 = new StatisticsHandler(); + private StatisticsHandler statisticsHandler2 = new StatisticsHandler(); + private StatisticsHandler statisticsHandler3 = new StatisticsHandler(); + + private String htmlResponse = "<html><body>Book 123 is Camel in Action</body></html>"; + private int port1; + private int port2; + + @Test + public void testWithOneHandler() throws Exception { + // First test the situation where one should invoke the handler once + assertEquals(0, statisticsHandler1.getRequests()); + assertEquals(0, statisticsHandler2.getRequests()); + assertEquals(0, statisticsHandler3.getRequests()); + + InputStream html = (InputStream) template.requestBody("http://localhost:" + port1, ""); + BufferedReader br = IOHelper.buffered(new InputStreamReader(html)); + + assertEquals(htmlResponse, br.readLine()); + assertEquals(1, statisticsHandler1.getRequests()); + assertEquals(0, statisticsHandler2.getRequests()); + assertEquals(0, statisticsHandler3.getRequests()); + } + + @Test + public void testWithTwoHandlers() throws Exception { + // First test the situation where one should invoke the handler once + assertEquals(0, statisticsHandler1.getRequests()); + assertEquals(0, statisticsHandler2.getRequests()); + assertEquals(0, statisticsHandler3.getRequests()); + + InputStream html = (InputStream) template.requestBody("http://localhost:" + port2, ""); + BufferedReader br = IOHelper.buffered(new InputStreamReader(html)); + + assertEquals(htmlResponse, br.readLine()); + assertEquals(0, statisticsHandler1.getRequests()); + assertEquals(1, statisticsHandler2.getRequests()); + assertEquals(1, statisticsHandler3.getRequests()); + } + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("statisticsHandler1", statisticsHandler1); + jndi.bind("statisticsHandler2", statisticsHandler2); + jndi.bind("statisticsHandler3", statisticsHandler3); + return jndi; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + public void configure() throws Exception { + port1 = getPort(); + port2 = getNextPort(); + + from("jetty:http://localhost:" + port1 + "/?handlers=#statisticsHandler1") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody(htmlResponse); + } + }); + + from("jetty:http://localhost:" + port2 + "/?handlers=#statisticsHandler2,#statisticsHandler3") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + exchange.getOut().setBody(htmlResponse); + } + }); + }; + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpAuthMethodPriorityTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpAuthMethodPriorityTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpAuthMethodPriorityTest.java new file mode 100644 index 0000000..ec1a616 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpAuthMethodPriorityTest.java @@ -0,0 +1,125 @@ +/** + * 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.IOException; +import java.security.Principal; +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.FailedToCreateProducerException; +import org.apache.camel.Processor; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpOperationFailedException; +import org.apache.camel.impl.JndiRegistry; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; +import org.eclipse.jetty.util.security.Constraint; +import org.junit.Test; + +/** + * @version + */ +public class HttpAuthMethodPriorityTest extends BaseJettyTest { + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myAuthHandler", getSecurityHandler()); + return jndi; + } + private SecurityHandler getSecurityHandler() throws IOException { + Constraint constraint = new Constraint(Constraint.__BASIC_AUTH, "user"); + constraint.setAuthenticate(true); + + ConstraintMapping cm = new ConstraintMapping(); + cm.setPathSpec("/*"); + cm.setConstraint(constraint); + + ConstraintSecurityHandler sh = new ConstraintSecurityHandler(); + sh.setAuthenticator(new BasicAuthenticator()); + sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[] {cm})); + + HashLoginService loginService = new HashLoginService("MyRealm", "src/test/resources/myRealm.properties"); + sh.setLoginService(loginService); + sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[]{cm})); + + return sh; + } + + @Test + public void testAuthMethodPriorityBasicDigest() throws Exception { + String out = template.requestBody("http://localhost:{{port}}/test?authMethod=Basic&authMethodPriority=Basic,Digest&authUsername=donald&authPassword=duck", "Hello World", String.class); + assertEquals("Bye World", out); + } + + @Test + public void testAuthMethodPriorityNTLMBasic() throws Exception { + String out = template.requestBody("http://localhost:{{port}}/test?authMethod=Basic&authMethodPriority=NTLM,Basic&authUsername=donald&authPassword=duck", "Hello World", String.class); + assertEquals("Bye World", out); + } + + @Test + public void testAuthMethodPriorityInvalid() throws Exception { + try { + template.requestBody("http://localhost:{{port}}/test?authMethod=Basic&authMethodPriority=Basic,foo&authUsername=donald&authPassword=duck", "Hello World", String.class); + fail("Should have thrown an exception"); + } catch (FailedToCreateProducerException e) { + IllegalArgumentException cause = assertIsInstanceOf(IllegalArgumentException.class, e.getCause().getCause().getCause()); + //JAXB 2.2 uses a slightly different message + boolean b = cause.getMessage().contains("No enum const") + && cause.getMessage().contains("org.apache.camel.component.http.AuthMethod.foo"); + assertTrue("Bad fault message: " + cause.getMessage(), b); + } + } + + @Test + public void testAuthMethodPriorityNTLM() throws Exception { + try { + template.requestBody("http://localhost:{{port}}/test?authMethod=Basic&authMethodPriority=NTLM&authUsername=donald&authPassword=duck", "Hello World", String.class); + fail("Should have thrown exception"); + } catch (RuntimeCamelException e) { + HttpOperationFailedException cause = assertIsInstanceOf(HttpOperationFailedException.class, e.getCause()); + assertEquals(401, cause.getStatusCode()); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty://http://localhost:{{port}}/test?handlers=myAuthHandler") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); + assertNotNull(req); + Principal user = req.getUserPrincipal(); + assertNotNull(user); + assertEquals("donald", user.getName()); + } + }) + .transform(constant("Bye World")); + } + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthComponentConfiguredTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthComponentConfiguredTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthComponentConfiguredTest.java new file mode 100644 index 0000000..18fccfc --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthComponentConfiguredTest.java @@ -0,0 +1,109 @@ +/** + * 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.IOException; +import java.security.Principal; +import java.util.Arrays; +import javax.servlet.http.HttpServletRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.AuthMethod; +import org.apache.camel.component.http.HttpComponent; +import org.apache.camel.component.http.HttpConfiguration; +import org.apache.camel.impl.JndiRegistry; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; +import org.eclipse.jetty.util.security.Constraint; +import org.junit.Test; + +/** + * @version + */ +public class HttpBasicAuthComponentConfiguredTest extends BaseJettyTest { + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myAuthHandler", getSecurityHandler()); + return jndi; + } + + private SecurityHandler getSecurityHandler() throws IOException { + Constraint constraint = new Constraint(Constraint.__BASIC_AUTH, "user"); + constraint.setAuthenticate(true); + + ConstraintMapping cm = new ConstraintMapping(); + cm.setPathSpec("/*"); + cm.setConstraint(constraint); + + ConstraintSecurityHandler sh = new ConstraintSecurityHandler(); + sh.setAuthenticator(new BasicAuthenticator()); + sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[] {cm})); + + HashLoginService loginService = new HashLoginService("MyRealm", "src/test/resources/myRealm.properties"); + sh.setLoginService(loginService); + sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[]{cm})); + + return sh; + } + + @Test + public void testHttpBasicAuth() throws Exception { + String out = template.requestBody("http://localhost:{{port}}/test", "Hello World", String.class); + assertEquals("Bye World", out); + + out = template.requestBody("http://localhost:{{port}}/anotherTest", "Hello World", String.class); + assertEquals("See you later", out); + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + HttpConfiguration config = new HttpConfiguration(); + config.setAuthMethod(AuthMethod.Basic); + config.setAuthUsername("donald"); + config.setAuthPassword("duck"); + + HttpComponent http = context.getComponent("http", HttpComponent.class); + http.setHttpConfiguration(config); + + from("jetty://http://localhost:{{port}}/test?handlers=myAuthHandler") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); + assertNotNull(req); + Principal user = req.getUserPrincipal(); + assertNotNull(user); + assertEquals("donald", user.getName()); + } + }) + .transform(constant("Bye World")); + + from("jetty://http://localhost:{{port}}/anotherTest?handlers=myAuthHandler") + .transform(constant("See you later")); + } + }; + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/camel/blob/0d96e56d/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthTest.java ---------------------------------------------------------------------- diff --git a/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthTest.java b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthTest.java new file mode 100644 index 0000000..2aebd95 --- /dev/null +++ b/components/camel-jetty9/src/test/java/org/apache/camel/component/jetty/HttpBasicAuthTest.java @@ -0,0 +1,106 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.camel.component.jetty; + +import java.io.IOException; +import java.security.Principal; +import java.util.Arrays; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.camel.Exchange; +import org.apache.camel.Processor; +import org.apache.camel.RuntimeCamelException; +import org.apache.camel.builder.RouteBuilder; +import org.apache.camel.component.http.HttpOperationFailedException; +import org.apache.camel.impl.JndiRegistry; +import org.eclipse.jetty.security.ConstraintMapping; +import org.eclipse.jetty.security.ConstraintSecurityHandler; +import org.eclipse.jetty.security.HashLoginService; +import org.eclipse.jetty.security.SecurityHandler; +import org.eclipse.jetty.security.authentication.BasicAuthenticator; +import org.eclipse.jetty.util.security.Constraint; +import org.junit.Test; + +/** + * @version + */ +public class HttpBasicAuthTest extends BaseJettyTest { + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("myAuthHandler", getSecurityHandler()); + return jndi; + } + + private SecurityHandler getSecurityHandler() throws IOException { + Constraint constraint = new Constraint(Constraint.__BASIC_AUTH, "user"); + constraint.setAuthenticate(true); + + ConstraintMapping cm = new ConstraintMapping(); + cm.setPathSpec("/*"); + cm.setConstraint(constraint); + + ConstraintSecurityHandler sh = new ConstraintSecurityHandler(); + sh.setAuthenticator(new BasicAuthenticator()); + sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[] {cm})); + + HashLoginService loginService = new HashLoginService("MyRealm", "src/test/resources/myRealm.properties"); + sh.setLoginService(loginService); + sh.setConstraintMappings(Arrays.asList(new ConstraintMapping[]{cm})); + + return sh; + } + + @Test + public void testHttpBaiscAuth() throws Exception { + String out = template.requestBody("http://localhost:{{port}}/test?authMethod=Basic&authUsername=donald&authPassword=duck", "Hello World", String.class); + assertEquals("Bye World", out); + } + + @Test + public void testHttpBasicAuthInvalidPassword() throws Exception { + try { + template.requestBody("http://localhost:{{port}}/test?authMethod=Basic&authUsername=donald&authPassword=sorry", "Hello World", String.class); + fail("Should have thrown exception"); + } catch (RuntimeCamelException e) { + HttpOperationFailedException cause = assertIsInstanceOf(HttpOperationFailedException.class, e.getCause()); + assertEquals(401, cause.getStatusCode()); + } + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + from("jetty://http://localhost:{{port}}/test?handlers=myAuthHandler") + .process(new Processor() { + public void process(Exchange exchange) throws Exception { + HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class); + assertNotNull(req); + Principal user = req.getUserPrincipal(); + assertNotNull(user); + assertEquals("donald", user.getName()); + } + }) + .transform(constant("Bye World")); + } + }; + } +}