You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ff...@apache.org on 2016/02/26 04:50:52 UTC
[2/6] cxf git commit: [CXF-6800]add http-undertow transport
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/StatefulGreeterImpl.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/StatefulGreeterImpl.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/StatefulGreeterImpl.java
new file mode 100644
index 0000000..97fc7a5
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/StatefulGreeterImpl.java
@@ -0,0 +1,96 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.systest.http_undertow;
+
+import java.util.concurrent.Future;
+
+import javax.jws.WebService;
+import javax.xml.ws.AsyncHandler;
+import javax.xml.ws.Response;
+
+
+import org.apache.cxf.greeter_control.Greeter;
+import org.apache.cxf.greeter_control.types.GreetMeResponse;
+import org.apache.cxf.greeter_control.types.PingMeResponse;
+import org.apache.cxf.greeter_control.types.SayHiResponse;
+
+@WebService(serviceName = "GreeterService",
+ portName = "GreeterPort",
+ endpointInterface = "org.apache.cxf.greeter_control.Greeter",
+ targetNamespace = "http://cxf.apache.org/greeter_control")
+public class StatefulGreeterImpl implements Greeter {
+ String name;
+
+ // greetMe will use session to return last called name
+ public String greetMe(String me) {
+ name = me;
+ return "Hello " + me;
+ }
+
+
+ public String sayHi() {
+ return "Bonjour " + name;
+ }
+
+ public void pingMe() {
+ }
+
+
+ public Future<?> greetMeAsync(String requestType, AsyncHandler<GreetMeResponse> asyncHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public Response<GreetMeResponse> greetMeAsync(String requestType) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public void greetMeOneWay(String requestType) {
+ // TODO Auto-generated method stub
+
+ }
+
+
+ public Future<?> pingMeAsync(AsyncHandler<PingMeResponse> asyncHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public Response<PingMeResponse> pingMeAsync() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public Future<?> sayHiAsync(AsyncHandler<SayHiResponse> asyncHandler) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+
+ public Response<SayHiResponse> sayHiAsync() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/ThreadPoolTest.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/ThreadPoolTest.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/ThreadPoolTest.java
new file mode 100644
index 0000000..e0c7ba1
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/ThreadPoolTest.java
@@ -0,0 +1,112 @@
+/**
+ * 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.cxf.systest.http_undertow;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.SOAPService;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Tests thread pool config.
+ */
+
+public class ThreadPoolTest extends AbstractClientServerTestBase {
+ private static final String ADDRESS = Server.ADDRESS;
+ private static final QName SERVICE_NAME =
+ new QName("http://apache.org/hello_world_soap_http", "SOAPServiceAddressing");
+
+ private Greeter greeter;
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ assertTrue("server did not launch correctly",
+ launchServer(Server.class, true));
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ greeter = new SOAPService(wsdl, SERVICE_NAME).getPort(Greeter.class);
+ BindingProvider bp = (BindingProvider)greeter;
+ bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ ADDRESS);
+ }
+
+ class TestRunnable implements Runnable {
+ int i;
+ long total;
+
+ TestRunnable(int i) {
+ this.i = i;
+ }
+ public void run() {
+ long start = System.currentTimeMillis();
+ try {
+ greeter.greetMeLater(1600);
+ } catch (Throwable t) {
+ //ignore
+ }
+ long end = System.currentTimeMillis();
+ total = end - start;
+ }
+ public long getTotal() {
+ return total;
+ }
+ }
+
+
+ @Test
+
+ public void testFallbackThreadPoolConfig() throws Exception {
+ //make sure things are running
+ greeter.greetMeLater(1);
+ greeter.greetMeLater(1);
+ TestRunnable r[] = new TestRunnable[5];
+ Thread[] invokers = new Thread[5];
+ for (int i = 0; i < invokers.length; i++) {
+ r[i] = new TestRunnable(i);
+ invokers[i] = new Thread(r[i]);
+ invokers[i].setDaemon(true);
+ invokers[i].start();
+ }
+
+ int countLess = 0;
+ int countMore = 0;
+ for (int i = 0; i < invokers.length; i++) {
+ invokers[i].join(6 * 1000);
+ if (r[i].getTotal() > 3000) {
+ countMore++;
+ } else {
+ countLess++;
+ }
+ }
+
+ assertTrue(countLess >= 2 && countLess <= 3);
+ assertTrue(countMore >= 2 && countMore <= 3);
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthHandler.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthHandler.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthHandler.java
new file mode 100644
index 0000000..eb39c47
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthHandler.java
@@ -0,0 +1,80 @@
+/**
+ * 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.cxf.systest.http_undertow;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.transport.http_undertow.CXFUndertowHttpHandler;
+
+import io.undertow.security.api.AuthenticationMechanism;
+import io.undertow.security.api.AuthenticationMode;
+import io.undertow.security.handlers.AuthenticationCallHandler;
+import io.undertow.security.handlers.AuthenticationConstraintHandler;
+import io.undertow.security.handlers.AuthenticationMechanismsHandler;
+import io.undertow.security.handlers.SecurityInitialHandler;
+import io.undertow.security.idm.IdentityManager;
+import io.undertow.security.impl.BasicAuthenticationMechanism;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+
+public class UndertowBasicAuthHandler implements CXFUndertowHttpHandler {
+
+ private HttpHandler next;
+ private HttpHandler securityHandler;
+ private IdentityManager identityManager;
+
+ @Override
+ public void handleRequest(HttpServerExchange exchange) throws Exception {
+ if (identityManager == null) {
+ buildIdMgr();
+ }
+ if (securityHandler == null) {
+ buildSecurityHandler();
+ }
+ this.securityHandler.handleRequest(exchange);
+ }
+
+ private void buildSecurityHandler() {
+ HttpHandler handler = this.next;
+ handler = new AuthenticationCallHandler(handler);
+ handler = new AuthenticationConstraintHandler(handler);
+ final List<AuthenticationMechanism> mechanisms
+ = Collections.<AuthenticationMechanism>singletonList(new BasicAuthenticationMechanism("My Realm"));
+ handler = new AuthenticationMechanismsHandler(handler, mechanisms);
+ this.securityHandler = new SecurityInitialHandler(AuthenticationMode.PRO_ACTIVE, identityManager, handler);
+
+ }
+
+ @Override
+ public void setNext(HttpHandler nextHandler) {
+ this.next = nextHandler;
+ }
+
+ private void buildIdMgr() {
+ final Map<String, char[]> users = new HashMap<>(1);
+ users.put("ffang", "pswd".toCharArray());
+
+ identityManager = new MapIdentityManager(users);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthServer.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthServer.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthServer.java
new file mode 100644
index 0000000..616794f
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthServer.java
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.http_undertow;
+
+
+import java.net.URL;
+
+import javax.xml.ws.Endpoint;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+
+
+public class UndertowBasicAuthServer extends AbstractBusTestServerBase {
+ static final String PORT = allocatePort(UndertowBasicAuthServer.class);
+ static final String ADDRESS = "http://localhost:" + PORT + "/SoapContext/SoapPort";
+
+ Endpoint ep;
+
+ protected void run() {
+ String configurationFile = "undertowBasicAuthServer.xml";
+ URL configure =
+ UndertowBasicAuthServer.class.getResource(configurationFile);
+ Bus bus = new SpringBusFactory().createBus(configure, true);
+ bus.getInInterceptors().add(new LoggingInInterceptor());
+ bus.getOutInterceptors().add(new LoggingOutInterceptor());
+ SpringBusFactory.setDefaultBus(bus);
+ setBus(bus);
+
+ GreeterImpl implementor = new GreeterImpl();
+ ep = Endpoint.publish(ADDRESS, implementor);
+ }
+
+ public void tearDown() throws Exception {
+ if (ep != null) {
+ ep.stop();
+ ep = null;
+ }
+ }
+
+ public static void main(String[] args) {
+ try {
+ UndertowBasicAuthServer s = new UndertowBasicAuthServer();
+ s.start();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ System.exit(-1);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthTest.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthTest.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthTest.java
new file mode 100644
index 0000000..c479789
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowBasicAuthTest.java
@@ -0,0 +1,102 @@
+/**
+ * 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.cxf.systest.http_undertow;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.bus.CXFBusFactory;
+import org.apache.cxf.configuration.security.AuthorizationPolicy;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
+import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transport.http.HTTPConduitConfigurer;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.SOAPService;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+/**
+ * Tests thread pool config.
+ */
+
+public class UndertowBasicAuthTest extends AbstractClientServerTestBase {
+ private static final String ADDRESS = UndertowBasicAuthServer.ADDRESS;
+ private static final QName SERVICE_NAME =
+ new QName("http://apache.org/hello_world_soap_http", "SOAPServiceAddressing");
+
+ private Greeter greeter;
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ assertTrue("server did not launch correctly",
+ launchServer(UndertowBasicAuthServer.class, true));
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ greeter = new SOAPService(wsdl, SERVICE_NAME).getPort(Greeter.class);
+ BindingProvider bp = (BindingProvider)greeter;
+ ClientProxy.getClient(greeter).getInInterceptors().add(new LoggingInInterceptor());
+ ClientProxy.getClient(greeter).getOutInterceptors().add(new LoggingOutInterceptor());
+ bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ ADDRESS);
+ bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "ffang");
+ bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pswd");
+ }
+
+ @org.junit.Test
+ public void testBasicAuth() throws Exception {
+ assertEquals("Hello Alice", greeter.greetMe("Alice"));
+ }
+
+ @org.junit.Test
+ public void testGetWSDL() throws Exception {
+ BusFactory bf = CXFBusFactory.newInstance();
+ Bus bus = bf.createBus();
+ bus.getInInterceptors().add(new LoggingInInterceptor());
+ bus.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ MyHTTPConduitConfigurer myHttpConduitConfig = new MyHTTPConduitConfigurer();
+ bus.setExtension(myHttpConduitConfig, HTTPConduitConfigurer.class);
+ JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(bus);
+ factory.createClient(ADDRESS + "?wsdl");
+ }
+
+ private static class MyHTTPConduitConfigurer implements HTTPConduitConfigurer {
+ public void configure(String name, String address, HTTPConduit c) {
+
+ AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
+
+ authorizationPolicy.setUserName("ffang");
+ authorizationPolicy.setPassword("pswd");
+ authorizationPolicy.setAuthorizationType("Basic");
+ c.setAuthorization(authorizationPolicy);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthHandler.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthHandler.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthHandler.java
new file mode 100644
index 0000000..674aa06
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthHandler.java
@@ -0,0 +1,81 @@
+/**
+ * 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.cxf.systest.http_undertow;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.transport.http_undertow.CXFUndertowHttpHandler;
+
+import io.undertow.security.api.AuthenticationMechanism;
+import io.undertow.security.api.AuthenticationMode;
+import io.undertow.security.handlers.AuthenticationCallHandler;
+import io.undertow.security.handlers.AuthenticationConstraintHandler;
+import io.undertow.security.handlers.AuthenticationMechanismsHandler;
+import io.undertow.security.handlers.SecurityInitialHandler;
+import io.undertow.security.idm.IdentityManager;
+import io.undertow.security.impl.DigestAuthenticationMechanism;
+import io.undertow.server.HttpHandler;
+import io.undertow.server.HttpServerExchange;
+
+public class UndertowDigestAuthHandler implements CXFUndertowHttpHandler {
+
+ private HttpHandler next;
+ private HttpHandler securityHandler;
+ private IdentityManager identityManager;
+
+ @Override
+ public void handleRequest(HttpServerExchange exchange) throws Exception {
+ if (identityManager == null) {
+ buildIdMgr();
+ }
+ if (securityHandler == null) {
+ buildSecurityHandler();
+ }
+ this.securityHandler.handleRequest(exchange);
+ }
+
+ private void buildSecurityHandler() {
+ HttpHandler handler = this.next;
+ handler = new AuthenticationCallHandler(handler);
+ handler = new AuthenticationConstraintHandler(handler);
+ final List<AuthenticationMechanism> mechanisms
+ = Collections.<AuthenticationMechanism>singletonList(
+ new DigestAuthenticationMechanism("WSRealm", "WSDomain", "DIGEST", this.identityManager));
+ handler = new AuthenticationMechanismsHandler(handler, mechanisms);
+ this.securityHandler = new SecurityInitialHandler(AuthenticationMode.PRO_ACTIVE, identityManager, handler);
+
+ }
+
+ @Override
+ public void setNext(HttpHandler nextHandler) {
+ this.next = nextHandler;
+ }
+
+ private void buildIdMgr() {
+ final Map<String, char[]> users = new HashMap<>(1);
+ users.put("ffang", "pswd".toCharArray());
+
+ identityManager = new MapIdentityManager(users);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
new file mode 100644
index 0000000..cbcbfbf
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/UndertowDigestAuthTest.java
@@ -0,0 +1,202 @@
+/**
+ * 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.cxf.systest.http_undertow;
+
+import java.net.URL;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+import javax.xml.ws.Endpoint;
+import javax.xml.ws.WebServiceException;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.bus.CXFBusFactory;
+import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.configuration.security.AuthorizationPolicy;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.jaxws.endpoint.dynamic.JaxWsDynamicClientFactory;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.cxf.transport.http.HTTPConduitConfigurer;
+import org.apache.cxf.transport.http.asyncclient.AsyncHTTPConduit;
+import org.apache.cxf.transport.http.auth.DigestAuthSupplier;
+import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.SOAPService;
+import org.apache.http.auth.Credentials;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+/**
+ * Tests thread pool config.
+ */
+
+public class UndertowDigestAuthTest extends AbstractClientServerTestBase {
+ private static final String PORT = allocatePort(UndertowDigestAuthTest.class);
+ private static final String ADDRESS = "http://127.0.0.1:" + PORT + "/SoapContext/SoapPort";
+ private static final QName SERVICE_NAME =
+ new QName("http://apache.org/hello_world_soap_http", "SOAPServiceAddressing");
+
+ private Greeter greeter;
+
+
+ public static class UndertowDigestServer extends AbstractBusTestServerBase {
+ Endpoint ep;
+
+ protected void run() {
+ String configurationFile = "undertowDigestServer.xml";
+ URL configure =
+ UndertowBasicAuthServer.class.getResource(configurationFile);
+ Bus bus = new SpringBusFactory().createBus(configure, true);
+ //bus.getInInterceptors().add(new LoggingInInterceptor());
+ //bus.getOutInterceptors().add(new LoggingOutInterceptor());
+ SpringBusFactory.setDefaultBus(bus);
+ setBus(bus);
+
+ GreeterImpl implementor = new GreeterImpl();
+ ep = Endpoint.publish(ADDRESS, implementor);
+ }
+
+ public void tearDown() throws Exception {
+ if (ep != null) {
+ ep.stop();
+ ep = null;
+ }
+ }
+ }
+
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ assertTrue("server did not launch correctly",
+ launchServer(UndertowDigestServer.class, true));
+ }
+
+ private HTTPConduit setupClient(boolean async) throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ greeter = new SOAPService(wsdl, SERVICE_NAME).getPort(Greeter.class);
+ BindingProvider bp = (BindingProvider)greeter;
+ ClientProxy.getClient(greeter).getInInterceptors().add(new LoggingInInterceptor());
+ ClientProxy.getClient(greeter).getOutInterceptors().add(new LoggingOutInterceptor());
+ bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ ADDRESS);
+ HTTPConduit cond = (HTTPConduit)ClientProxy.getClient(greeter).getConduit();
+ HTTPClientPolicy client = new HTTPClientPolicy();
+ client.setConnectionTimeout(600000);
+ client.setReceiveTimeout(600000);
+ cond.setClient(client);
+ if (async) {
+ if (cond instanceof AsyncHTTPConduit) {
+ UsernamePasswordCredentials creds = new UsernamePasswordCredentials("ffang", "pswd");
+ bp.getRequestContext().put(Credentials.class.getName(), creds);
+ bp.getRequestContext().put(AsyncHTTPConduit.USE_ASYNC, Boolean.TRUE);
+ client.setAutoRedirect(true);
+ } else {
+ fail("Not an async conduit");
+ }
+ } else {
+ bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "ffang");
+ bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pswd");
+ cond.setAuthSupplier(new DigestAuthSupplier());
+ }
+
+ ClientProxy.getClient(greeter).getOutInterceptors()
+ .add(new AbstractPhaseInterceptor<Message>(Phase.PRE_STREAM_ENDING) {
+
+ public void handleMessage(Message message) throws Fault {
+ Map<String, ?> headers = CastUtils.cast((Map<?, ?>)message.get(Message.PROTOCOL_HEADERS));
+ if (headers.containsKey("Proxy-Authorization")) {
+ throw new RuntimeException("Should not have Proxy-Authorization");
+ }
+ }
+ });
+ client.setAllowChunking(false);
+ return cond;
+ }
+
+ @Test
+ public void testDigestAuth() throws Exception {
+ //CXF will handle the auth stuff within it's conduit implementation
+ doTest(false);
+ }
+ @Test
+ public void testDigestAuthAsyncClient() throws Exception {
+ //We'll let HTTP async handle it. Useful for things like NTLM
+ //which async client can handle but we cannot.
+ doTest(true);
+ }
+
+ private void doTest(boolean async) throws Exception {
+ setupClient(async);
+ assertEquals("Hello Alice", greeter.greetMe("Alice"));
+ assertEquals("Hello Bob", greeter.greetMe("Bob"));
+
+ try {
+ BindingProvider bp = (BindingProvider)greeter;
+ if (async) {
+ UsernamePasswordCredentials creds = new UsernamePasswordCredentials("blah", "foo");
+ bp.getRequestContext().put(Credentials.class.getName(), creds);
+ } else {
+ bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "blah");
+ bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "foo");
+ }
+ greeter.greetMe("Alice");
+ fail("Password was wrong, should have failed");
+ } catch (WebServiceException wse) {
+ //ignore - expected
+ }
+ }
+
+ @Test
+ public void testGetWSDL() throws Exception {
+ BusFactory bf = CXFBusFactory.newInstance();
+ Bus bus = bf.createBus();
+ bus.getInInterceptors().add(new LoggingInInterceptor());
+ bus.getOutInterceptors().add(new LoggingOutInterceptor());
+
+ MyHTTPConduitConfigurer myHttpConduitConfig = new MyHTTPConduitConfigurer();
+ bus.setExtension(myHttpConduitConfig, HTTPConduitConfigurer.class);
+ JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance(bus);
+ factory.createClient(ADDRESS + "?wsdl");
+ }
+
+ private static class MyHTTPConduitConfigurer implements HTTPConduitConfigurer {
+ public void configure(String name, String address, HTTPConduit c) {
+
+ AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
+
+ authorizationPolicy.setUserName("ffang");
+ authorizationPolicy.setPassword("pswd");
+ authorizationPolicy.setAuthorizationType("Digest");
+ c.setAuthorization(authorizationPolicy);
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ClientServerWrappedContinuationTest.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ClientServerWrappedContinuationTest.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ClientServerWrappedContinuationTest.java
new file mode 100644
index 0000000..6a976d4
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ClientServerWrappedContinuationTest.java
@@ -0,0 +1,159 @@
+/**
+ * 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.cxf.systest.http_undertow.continuations;
+
+import java.net.URL;
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Endpoint;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.BusFactory;
+import org.apache.cxf.bus.spring.SpringBusFactory;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.interceptor.LoggingInInterceptor;
+import org.apache.cxf.interceptor.LoggingOutInterceptor;
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ClientServerWrappedContinuationTest extends AbstractClientServerTestBase {
+ public static final String PORT = allocatePort(Server.class);
+ public static final String HTTPS_PORT = allocatePort(Server.class, 1);
+
+ private static final String CLIENT_CONFIG_FILE =
+ "org/apache/cxf/systest/http_undertow/continuations/cxf.xml";
+ private static final String CLIENT_HTTPS_CONFIG_FILE =
+ "org/apache/cxf/systest/http_undertow/continuations/cxf_https.xml";
+ private static final String SERVER_CONFIG_FILE =
+ "org/apache/cxf/systest/http_undertow/continuations/jaxws-server.xml";
+
+ public static class Server extends AbstractBusTestServerBase {
+
+ protected void run() {
+ SpringBusFactory bf = new SpringBusFactory();
+ Bus bus = bf.createBus(SERVER_CONFIG_FILE);
+ setBus(bus);
+ BusFactory.setDefaultBus(bus);
+
+ Object implementor = new HelloImplWithWrapppedContinuation();
+ String address = "http://localhost:" + PORT + "/hellocontinuation";
+ EndpointImpl endpointImpl = (EndpointImpl)Endpoint.publish(address, implementor);
+ endpointImpl.getInInterceptors().add(new LoggingInInterceptor());
+ endpointImpl.getOutInterceptors().add(new LoggingOutInterceptor());
+ address = "https://localhost:" + HTTPS_PORT + "/securecontinuation";
+ Endpoint.publish(address, implementor);
+ }
+
+ public static void main(String[] args) {
+ try {
+ Server s = new Server();
+ s.start();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ System.exit(-1);
+ }
+ }
+ }
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ assertTrue("server did not launch correctly", launchServer(Server.class));
+ }
+
+ @Test
+ public void testHttpWrappedContinuations() throws Exception {
+ SpringBusFactory bf = new SpringBusFactory();
+ Bus bus = bf.createBus(CLIENT_CONFIG_FILE);
+ BusFactory.setDefaultBus(bus);
+
+ QName serviceName = new QName("http://cxf.apache.org/systest/jaxws", "HelloContinuationService");
+
+ URL wsdlURL = new URL("http://localhost:" + PORT + "/hellocontinuation?wsdl");
+
+ HelloContinuationService service = new HelloContinuationService(wsdlURL, serviceName);
+ assertNotNull(service);
+ final HelloContinuation helloPort = service.getHelloContinuationPort();
+ ClientProxy.getClient(helloPort).getInInterceptors().add(new LoggingInInterceptor());
+ ClientProxy.getClient(helloPort).getOutInterceptors().add(new LoggingOutInterceptor());
+ doTest(helloPort);
+ bus.shutdown(true);
+ }
+
+ @Test
+ public void testHttpsWrappedContinuations() throws Exception {
+ SpringBusFactory bf = new SpringBusFactory();
+ Bus bus = bf.createBus(CLIENT_HTTPS_CONFIG_FILE);
+ BusFactory.setDefaultBus(bus);
+
+ QName serviceName = new QName("http://cxf.apache.org/systest/jaxws", "HelloContinuationService");
+
+ URL wsdlURL = new URL("https://localhost:" + HTTPS_PORT + "/securecontinuation?wsdl");
+
+ HelloContinuationService service = new HelloContinuationService(wsdlURL, serviceName);
+ assertNotNull(service);
+ final HelloContinuation helloPort = service.getHelloContinuationPort();
+ doTest(helloPort);
+ bus.shutdown(true);
+ }
+
+ private void doTest(final HelloContinuation helloPort) throws Exception {
+ ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 0, TimeUnit.SECONDS,
+ new ArrayBlockingQueue<Runnable>(6));
+ CountDownLatch startSignal = new CountDownLatch(1);
+ CountDownLatch controlDoneSignal = new CountDownLatch(5);
+ CountDownLatch helloDoneSignal = new CountDownLatch(5);
+
+ executor.execute(new ControlWorker(helloPort, "Fred", startSignal, controlDoneSignal));
+ executor.execute(new HelloWorker(helloPort, "Fred", "", startSignal, helloDoneSignal));
+
+ executor.execute(new ControlWorker(helloPort, "Barry", startSignal, controlDoneSignal));
+ executor.execute(new HelloWorker(helloPort, "Barry", "Jameson", startSignal, helloDoneSignal));
+
+ executor.execute(new ControlWorker(helloPort, "Harry", startSignal, controlDoneSignal));
+ executor.execute(new HelloWorker(helloPort, "Harry", "", startSignal, helloDoneSignal));
+
+ executor.execute(new ControlWorker(helloPort, "Rob", startSignal, controlDoneSignal));
+ executor.execute(new HelloWorker(helloPort, "Rob", "Davidson", startSignal, helloDoneSignal));
+
+ executor.execute(new ControlWorker(helloPort, "James", startSignal, controlDoneSignal));
+ executor.execute(new HelloWorker(helloPort, "James", "ServiceMix", startSignal, helloDoneSignal));
+
+ startSignal.countDown();
+
+ controlDoneSignal.await(100, TimeUnit.SECONDS);
+ helloDoneSignal.await(100, TimeUnit.SECONDS);
+ executor.shutdownNow();
+ assertEquals("Not all invocations have been resumed", 0, controlDoneSignal.getCount());
+ assertEquals("Not all invocations have completed", 0, helloDoneSignal.getCount());
+
+ helloPort.sayHi("Dan1", "to:100");
+ helloPort.sayHi("Dan2", "to:100");
+ helloPort.sayHi("Dan3", "to:100");
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ControlWorker.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ControlWorker.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ControlWorker.java
new file mode 100644
index 0000000..f624d73
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/ControlWorker.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.cxf.systest.http_undertow.continuations;
+
+import java.util.concurrent.CountDownLatch;
+
+import org.junit.Assert;
+
+public class ControlWorker implements Runnable {
+
+ private HelloContinuation helloPort;
+ private String firstName;
+ private CountDownLatch startSignal;
+ private CountDownLatch resumeSignal;
+ public ControlWorker(HelloContinuation helloPort,
+ String firstName,
+ CountDownLatch startSignal,
+ CountDownLatch resumeSignal) {
+ this.helloPort = helloPort;
+ this.firstName = firstName;
+ this.startSignal = startSignal;
+ this.resumeSignal = resumeSignal;
+ }
+
+ public void run() {
+ try {
+ startSignal.await();
+ if (!helloPort.isRequestSuspended(firstName)) {
+ Assert.fail("No suspended invocation for " + firstName);
+ }
+ helloPort.resumeRequest(firstName);
+ resumeSignal.countDown();
+ } catch (InterruptedException ex) {
+ // ignore
+ } catch (RuntimeException ex) {
+ ex.printStackTrace();
+ Assert.fail("Control thread for " + firstName + " failed");
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuation.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuation.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuation.java
new file mode 100644
index 0000000..9df05d7
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuation.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.cxf.systest.http_undertow.continuations;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.jws.soap.SOAPBinding;
+
+@SOAPBinding(style = SOAPBinding.Style.RPC, use = SOAPBinding.Use.LITERAL)
+@WebService(name = "HelloContinuation", targetNamespace = "http://cxf.apache.org/systest/jaxws")
+public interface HelloContinuation {
+ @WebMethod(operationName = "sayHi", exclude = false)
+ String sayHi(String firstName, String secondName);
+
+ @WebMethod(operationName = "isRequestSuspended", exclude = false)
+ boolean isRequestSuspended(String name);
+
+ @WebMethod(operationName = "resumeRequest", exclude = false)
+ void resumeRequest(String name);
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuationService.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuationService.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuationService.java
new file mode 100644
index 0000000..f7eea8e
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloContinuationService.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.cxf.systest.http_undertow.continuations;
+
+import java.net.URL;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.Service;
+import javax.xml.ws.WebEndpoint;
+import javax.xml.ws.WebServiceClient;
+
+/**
+ *
+ */
+
+@WebServiceClient(name = "HelloService",
+ targetNamespace = "http://cxf.apache.org/systest/jaxws",
+ wsdlLocation = "testutils/hello.wsdl")
+public class HelloContinuationService extends Service {
+ static final QName SERVICE =
+ new QName("http://cxf.apache.org/systest/jaxws", "HelloContinuationService");
+ static final QName HELLO_PORT =
+ new QName("http://cxf.apache.org/systest/jaxws", "HelloContinuationPort");
+ public HelloContinuationService(URL wsdlLocation, QName serviceName) {
+ super(wsdlLocation, serviceName);
+ }
+
+ @WebEndpoint(name = "HelloContinuationPort")
+ public HelloContinuation getHelloContinuationPort() {
+ return super.getPort(HELLO_PORT, HelloContinuation.class);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloImplWithWrapppedContinuation.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloImplWithWrapppedContinuation.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloImplWithWrapppedContinuation.java
new file mode 100644
index 0000000..aa067ff
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloImplWithWrapppedContinuation.java
@@ -0,0 +1,129 @@
+/**
+ * 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.cxf.systest.http_undertow.continuations;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.jws.WebService;
+import javax.xml.ws.WebServiceContext;
+
+import org.apache.cxf.continuations.Continuation;
+import org.apache.cxf.continuations.ContinuationProvider;
+
+
+@WebService(name = "HelloContinuation",
+ serviceName = "HelloContinuationService",
+ portName = "HelloContinuationPort",
+ targetNamespace = "http://cxf.apache.org/systest/jaxws",
+ endpointInterface = "org.apache.cxf.systest.http_undertow.continuations.HelloContinuation")
+public class HelloImplWithWrapppedContinuation implements HelloContinuation {
+
+
+ private Map<String, Continuation> suspended =
+ new HashMap<String, Continuation>();
+
+
+ @Resource
+ private WebServiceContext context;
+
+ public String sayHi(String firstName, String secondName) {
+
+ Continuation continuation = getContinuation(firstName);
+ if (continuation == null) {
+ throw new RuntimeException("Failed to get continuation");
+ }
+ synchronized (continuation) {
+ if (continuation.isNew()) {
+ Object userObject = secondName != null && secondName.length() > 0
+ ? secondName : null;
+ continuation.setObject(userObject);
+ long timeout = 20000;
+ if (secondName.startsWith("to:")) {
+ timeout = Long.parseLong(secondName.substring(3));
+ }
+ suspendInvocation(firstName, continuation, timeout);
+ } else {
+ StringBuilder sb = new StringBuilder();
+ sb.append(firstName);
+
+ // if the actual parameter is not null
+ if (secondName != null && secondName.length() > 0) {
+ String surname = continuation.getObject().toString();
+ sb.append(' ').append(surname);
+ }
+ // System.out.println("Saying hi to " + sb.toString());
+ return "Hi " + sb.toString();
+ }
+ }
+ // unreachable
+ return null;
+ }
+
+ public boolean isRequestSuspended(String name) {
+ synchronized (suspended) {
+ while (!suspended.containsKey(name)) {
+ try {
+ suspended.wait(10000);
+ } catch (InterruptedException ex) {
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ public void resumeRequest(final String name) {
+
+ Continuation suspendedCont = null;
+ synchronized (suspended) {
+ suspendedCont = suspended.get(name);
+ }
+
+ if (suspendedCont != null) {
+ synchronized (suspendedCont) {
+ suspendedCont.resume();
+ }
+ }
+ }
+
+ private void suspendInvocation(String name, Continuation cont, long timeout) {
+ try {
+ cont.suspend(timeout);
+ } finally {
+ synchronized (suspended) {
+ suspended.put(name, cont);
+ suspended.notifyAll();
+ }
+ }
+ }
+
+ private Continuation getContinuation(String name) {
+ synchronized (suspended) {
+ Continuation suspendedCont = suspended.remove(name);
+ if (suspendedCont != null) {
+ return suspendedCont;
+ }
+ }
+
+ ContinuationProvider provider =
+ (ContinuationProvider)context.getMessageContext().get(ContinuationProvider.class.getName());
+ return provider.getContinuation();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloWorker.java
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloWorker.java b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloWorker.java
new file mode 100644
index 0000000..fc85173
--- /dev/null
+++ b/systests/transport-undertow/src/test/java/org/apache/cxf/systest/http_undertow/continuations/HelloWorker.java
@@ -0,0 +1,67 @@
+/**
+ * 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.cxf.systest.http_undertow.continuations;
+
+import java.util.concurrent.CountDownLatch;
+
+import org.junit.Assert;
+
+public class HelloWorker implements Runnable {
+
+ private HelloContinuation helloPort;
+ private String firstName;
+ private String secondName;
+ private CountDownLatch startSignal;
+ private CountDownLatch doneSignal;
+ public HelloWorker(HelloContinuation helloPort,
+ String firstName,
+ String secondName,
+ CountDownLatch startSignal,
+ CountDownLatch doneSignal) {
+ this.helloPort = helloPort;
+ this.firstName = firstName;
+ this.secondName = secondName;
+ this.startSignal = startSignal;
+ this.doneSignal = doneSignal;
+ }
+
+ public void run() {
+ StringBuilder expected = new StringBuilder();
+ expected.append(firstName);
+ if (secondName != null && secondName.length() > 0) {
+ expected.append(' ').append(secondName);
+ }
+
+ try {
+ startSignal.await();
+
+ Assert.assertEquals("Wrong hello", "Hi " + expected.toString(),
+ helloPort.sayHi(firstName, secondName));
+ doneSignal.countDown();
+ } catch (InterruptedException ex) {
+ // ignore
+ } catch (RuntimeException ex) {
+ ex.printStackTrace();
+ Assert.fail("Hello thread failed for : " + expected.toString());
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Bethal.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Bethal.jks b/systests/transport-undertow/src/test/resources/keys/Bethal.jks
new file mode 100644
index 0000000..8da2ad0
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Bethal.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Bethal.p12
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Bethal.p12 b/systests/transport-undertow/src/test/resources/keys/Bethal.p12
new file mode 100644
index 0000000..5b627c5
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Bethal.p12 differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Gordy.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Gordy.jks b/systests/transport-undertow/src/test/resources/keys/Gordy.jks
new file mode 100644
index 0000000..8fa8847
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Gordy.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Morpit.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Morpit.jks b/systests/transport-undertow/src/test/resources/keys/Morpit.jks
new file mode 100644
index 0000000..b179baf
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Morpit.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Morpit.p12
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Morpit.p12 b/systests/transport-undertow/src/test/resources/keys/Morpit.p12
new file mode 100644
index 0000000..b18c8ed
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Morpit.p12 differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Poltim.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Poltim.jks b/systests/transport-undertow/src/test/resources/keys/Poltim.jks
new file mode 100644
index 0000000..f3b3e68
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Poltim.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Tarpin.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Tarpin.jks b/systests/transport-undertow/src/test/resources/keys/Tarpin.jks
new file mode 100644
index 0000000..cf1ceb6
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Tarpin.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Truststore.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Truststore.jks b/systests/transport-undertow/src/test/resources/keys/Truststore.jks
new file mode 100644
index 0000000..0abd848
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/Truststore.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/Truststore.pem
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/Truststore.pem b/systests/transport-undertow/src/test/resources/keys/Truststore.pem
new file mode 100644
index 0000000..c04eaf8
--- /dev/null
+++ b/systests/transport-undertow/src/test/resources/keys/Truststore.pem
@@ -0,0 +1,86 @@
+-----BEGIN CERTIFICATE-----
+MIIDSTCCAjGgAwIBAgIEGFcAsjANBgkqhkiG9w0BAQsFADBVMQswCQYDVQQGEwJVUzERMA8GA1UE
+BxMIU3lyYWN1c2UxEzARBgNVBAoTCkFwYWNoZVRlc3QxDjAMBgNVBAsTBUdvcmR5MQ4wDAYDVQQD
+EwVHb3JkeTAeFw0xNTA5MDkxNTUyMzRaFw0yNTA5MDYxNTUyMzRaMFUxCzAJBgNVBAYTAlVTMREw
+DwYDVQQHEwhTeXJhY3VzZTETMBEGA1UEChMKQXBhY2hlVGVzdDEOMAwGA1UECxMFR29yZHkxDjAM
+BgNVBAMTBUdvcmR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuVubnwltwu38Slqe
+ANXNBFkWQ3PV4n/T5tU1PLrkg+g7AEOtaWn/3TDfcxYovDF/TWnkwcYeYDeILdXcLJgoa0mhMO2n
+46JrR3NpLM5jBtw0NVBeBR+HuFfbdlLIABgD90+aalm4kB0Fq8BO1moP4NnbxccSl2vLdP6u9oLE
+xXDog+FpHfwffKvgnyDh0Mc3lYJ7dJpwQNOmPO8docyePR53IbQuAXL8C5rYc+OHU/smj4rvwqP9
+S5zj/yOpl+7tTAq+0kLJetHJ03Cb+KVhpl6Gn/80a5DGjm7c1gAzlEwQpxltY0PkD62WJhPsVOkW
+CtRhvUNWrxq+68i460m4ZwIDAQABoyEwHzAdBgNVHQ4EFgQUSYfZ7HYvl7iTrZaoOOwXMbR80Fow
+DQYJKoZIhvcNAQELBQADggEBAAFJpi0Fu74YK0TZk96ApCgGXKU4+CyRtk5OyBeYUN746ImacDO8
+Qg2idSnOAw08sEZGN0RQnHec9r/3dhIZvULf00uDLybhN+Q9ErqI2seooJo4oF0fsd3gR4jJIU5K
+fVL8UJ0mSqUVMyH7oklyN0e3btKgAjY24ycNt+WTXaX0e1K7phsX0vNc9WMp1ZQN9NjozWXW0mte
+5FsrjiFAdnbRx8Bsj4E25ZkyplibBqDnKmlQxl+VDk1QEdignRexdJIBsjRguJfdyl6u//fSRhp0
+GMFO9ovDEyegHf0ZnWJthq4egYTMLmkzReE2neQDzuN8zYoZLTngbA3ynP+Ghgc=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTTCCAjWgAwIBAgIEOEaECjANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJVUzERMA8GA1UE
+BxMIU3lyYWN1c2UxEzARBgNVBAoTCkFwYWNoZVRlc3QxDzANBgNVBAsTBkJldGhhbDEPMA0GA1UE
+AxMGQmV0aGFsMB4XDTE1MDkwOTE1NTIwN1oXDTI1MDkwNjE1NTIwN1owVzELMAkGA1UEBhMCVVMx
+ETAPBgNVBAcTCFN5cmFjdXNlMRMwEQYDVQQKEwpBcGFjaGVUZXN0MQ8wDQYDVQQLEwZCZXRoYWwx
+DzANBgNVBAMTBkJldGhhbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMxgwx2lxVDL
+teM15IOsdgBGff42ozTaLVjr30qHsREbnZrk+1G8KscUtVYUwtCDCEErz64tu/TY2jskUi54q1j2
+tOXCz0awxDRKbE4ddyvnqSqItYC9nB+T/LLFJ65bqyleRbO+Zsqj4Gi+8lGmzgk0kCLoCJ9LTrpt
+VzsHHuBsvEkcBHEX8in5umzbTy6y1jq3zsUdclgA/EV4eyvFd5+8J8XiB6Ac4q7qYJdUaOrDKk5X
+Ns05WuzW3hP/qXDpmyxgS1GQLBMj8yuopVR7/FuGCeDBSJe60cyWtDTxosjTLwjTEYIEB/ySIcgK
+0TU+QxU8XEwwutjMzecKd9PQdpMCAwEAAaMhMB8wHQYDVR0OBBYEFDWt03QU4rqQa91UjYCNkfx0
+tp3HMA0GCSqGSIb3DQEBCwUAA4IBAQCwObHeIssS3e1INNs67T2g0v17Z1+HDEx65dfwph6Wxbex
+hb9yNKEXFUIUk+Z6ZzTmv1fc4DBZ2z0Nbk8rrS2BD6kojWVRwZVnv6pfPDjU82mFL7kHztiNPq8u
+23+lTrhO9HjuQZtVnTW3+Uw9RW5mBu+8QVgze0Q1DjL5PqX3YHq16LCYp6vVjdm0o7fKDQke2Z01
+a4hYtUF17m/Sw6319ocSI2fRA2ppQ7Ts8J3GSkAyygSR52mqaC7jDgD2Oh1eRhRaTgiyxLNLnAHu
+Koxbcr3sGFP2ZYwtP9DlhxwZzzpPcNWwFMqcQ79WPKmRvBMNOQDBdW77P3cxG3DF5KkO
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIEDV+5sjANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQGEwJVUzERMA8GA1UE
+BxMIU3lyYWN1c2UxEzARBgNVBAoTCkFwYWNoZVRlc3QxDzANBgNVBAsTBk1vcnBpdDEZMBcGA1UE
+AxMQd2hhdGV2ZXJob3N0LmNvbTAeFw0xNTA5MDkxNTUzMTRaFw0yNTA5MDYxNTUzMTRaMGExCzAJ
+BgNVBAYTAlVTMREwDwYDVQQHEwhTeXJhY3VzZTETMBEGA1UEChMKQXBhY2hlVGVzdDEPMA0GA1UE
+CxMGTW9ycGl0MRkwFwYDVQQDExB3aGF0ZXZlcmhvc3QuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAjKod4Ne5+B5rPhvl7Dt7//O1fRZYw5GACCgTG6F2Cy8ozF7lfQo7jy3KTjrC
+xOkty6IUxcll5EKZQBfsqfKq2beEWI+tG//ZEfc1paK+4HGrqARtFXYm/azzEC8E66cVKRIej8DM
+yXPHvNsSSN/T7c5QCMBAd5p+uQFCGkHcX6ywiCu5hOBDhxBTr3680lRIOjBoICd3ytlT8pnHqjm7
+VexiG5sPg32f90Tf1UCJQL41Jn1miow4xLjDw0L9pCcoLtoh1jjOwErwISeTXtfp0zMAZ1T0Cwmu
+DQCL2Ek0ysmoDSQlpwL/zi/9XzeZCUY9a4KK2DV6q1WNnGJq6pMu0QIDAQABoyEwHzAdBgNVHQ4E
+FgQULNllc99it0vTugh22XKUn7H3zUkwDQYJKoZIhvcNAQELBQADggEBAFnOo+ghsy59M25gjVBG
+82siBQkhgl0eSzp/wVqa41F/KCY5hY8moKZARelNgOFQQxRpK6gBhj53TjF7B0w834r3S30F37qA
+d+T7yfH9drN5I4mNeTHpxPKeI1KJneZUqKt1PR1iZScwPzHHIfUWRiZ8ilJwNNy2MoZONKh7lhf4
+ILfYclRmMu7UJfb2gFjvTnzUwS5YJ8U0H5EYy7oHZS+7q3GXuL953tFypr1m0kvDYW4kYwyhHRZE
+XcDvDWvmO83BIk1AOQhzQ4ak4JLBpVQJnrPBhGUZOUAmIuRoV9If5WfvjVymH13VuAKoPJR3902u
+Gul/3Uq+ifNDF8btPpw=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTTCCAjWgAwIBAgIEOHEczzANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJVUzERMA8GA1UE
+BxMIU3lyYWN1c2UxEzARBgNVBAoTCkFwYWNoZVRlc3QxDzANBgNVBAsTBlRhcnBpbjEPMA0GA1UE
+AxMGVGFycGluMB4XDTE1MDkwOTE1NTA1M1oXDTI1MDkwNjE1NTA1M1owVzELMAkGA1UEBhMCVVMx
+ETAPBgNVBAcTCFN5cmFjdXNlMRMwEQYDVQQKEwpBcGFjaGVUZXN0MQ8wDQYDVQQLEwZUYXJwaW4x
+DzANBgNVBAMTBlRhcnBpbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJlWtQr06Soq
+QwTIKgvrLXxcqs/i6FNep3OF5nhzi4K7GOuV88UTyD3TBCFOF/sOtnVfR+mPPSfWe0z+avMKsRiw
+szzak+w2eM9cOBofO+3Ag1i9mQLpkjmkMHxflZ45C0GPcwnU/BekOKZvJ0OcJYZU6S8wszpGPinv
+OPeN1V56Wj3ud/lLR3Ll14G4QdbOxbS6tstJ+olL7Xtz7CfARqCNEjGbKx4VceiIjraheqKM0kLE
+RpdQ0DBgefGEI41BW1wogg92t6PQ6Em1RYeu97pDppSYoA/RYBW5xIDj7vz7aTVY6RaHZwAGNF+1
+Yzj8PVgV7Ppgf5VIhcIFiTyaUuECAwEAAaMhMB8wHQYDVR0OBBYEFMhTmGMuJOrPNTUCjKuRLGQ9
+la4gMA0GCSqGSIb3DQEBCwUAA4IBAQA86Rqp0xrNYb/M7dfk8SzVLaCMPyTslnhiZOVIWwQScwu8
+xqfiDXGg1000r/3N9/ACduiMwwmxYRT3OZOK8DhsHsmQXbY1vTBUEAQ3hx+mV7dPMi3WtmdU4vz6
+KtLPbl3G0803Jujxe0qcFk6FzOhlIiqd0jBRQqvMFWqzzRXDjhy64uLeVY2fNtX9w/b3xWUTL1kI
+mR8SpQnOdWunLqZLrksnuzVGU/hutD11ge0JOQRKHhTBoLBSpqGD8PPTjJipR0p7JII8KI8LbDI6
+YesmuRQmkEbpCMqM5FGVjN7VLeLjRSWcf5dT056WjErd/1zRNFrC0Jjf++g37arTOLQn
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDTTCCAjWgAwIBAgIEUgxbaTANBgkqhkiG9w0BAQsFADBXMQswCQYDVQQGEwJVUzERMA8GA1UE
+BxMIU3lyYWN1c2UxEzARBgNVBAoTCkFwYWNoZVRlc3QxDzANBgNVBAsTBlBvbHRpbTEPMA0GA1UE
+AxMGUG9sdGltMB4XDTE1MDkwOTE1NTM0NFoXDTI1MDkwNjE1NTM0NFowVzELMAkGA1UEBhMCVVMx
+ETAPBgNVBAcTCFN5cmFjdXNlMRMwEQYDVQQKEwpBcGFjaGVUZXN0MQ8wDQYDVQQLEwZQb2x0aW0x
+DzANBgNVBAMTBlBvbHRpbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKxyUZCjOaVe
+IpptbRbdr9Ki+3W/n2G6jmEOp3LJGtQC6JbAh1IprMpC6nbWwp/W0nnBXyCpevYk6Dj5VtLV0NU/
+1pLnzaS5E/EhZKmxL2PXpMozH7js3FsP/8j9FflvIhhMybSa3otw9tmBf1+Tc6mGlcDsZlHRju91
+WdVMRUVEsOBhNPZccKRTd2QK0H83kYSXMrcGc7dmtuWUWzavbVXdq20+UrV6V8Z/aW/Um270d3Zj
+9VFw6Ax4m0IlCmPM7OA/ONA/gzmsT5BVu0EueE4s9RtXCvK+vR+l2o1fwHW0gtIkQShvR8RBGZjf
+9onepE27U/Uya/+CxQWb3K17g+kCAwEAAaMhMB8wHQYDVR0OBBYEFKI4clFM35A+xunrsFmmuN8i
+Rc/gMA0GCSqGSIb3DQEBCwUAA4IBAQCceUMhVspIAMhA4JMdXgdowWhVEY9vhKJhoILRQ4wdorLs
+pQrUZMBxB7juJ2RdOCO+17Y2gYJi4F1HYaPn0q70iZQRAH4AxiSGPpKD9Qxgs4wIHZgzZ5NwCkko
+AXmSM+SyNiDDZBFd01120gmw40Ly8/3HcDR/um6/kx/YAKgJhc6fDGpzQOrLnoTxeyVV1twAmA+R
+PcrmRA6NAS8baWlzUXAYu8pq/xTOl77niKdAvndmtmlEDmsj0BXeXeCURRVODYU8cMTueudHjois
+tj5C6jX6xjGz1/XcXUaZX5Lr34GixSwJRzabrrGYl7S2sKHmEBUUoB4hortyb2Ufedg+
+-----END CERTIFICATE-----
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/alice.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/alice.jks b/systests/transport-undertow/src/test/resources/keys/alice.jks
new file mode 100644
index 0000000..213b26c
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/alice.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/bob.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/bob.jks b/systests/transport-undertow/src/test/resources/keys/bob.jks
new file mode 100644
index 0000000..5550912
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/bob.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/cxfca.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/cxfca.jks b/systests/transport-undertow/src/test/resources/keys/cxfca.jks
new file mode 100644
index 0000000..53ad239
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/cxfca.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/genkeys.sh
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/genkeys.sh b/systests/transport-undertow/src/test/resources/keys/genkeys.sh
new file mode 100755
index 0000000..a01a569
--- /dev/null
+++ b/systests/transport-undertow/src/test/resources/keys/genkeys.sh
@@ -0,0 +1,53 @@
+
+# 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.
+
+#
+# This file generates a number of keys/certificates and keystores for
+# names to be used with corresponding CXF configuration files (*.cxf).
+#
+
+#
+# Start with a clean slate. Remove all keystores.
+#
+rm -f *.jks
+rm -f Truststore.pem
+
+#
+# This function generates a key/self-signed certificate with the following DN.
+# "CN=$1, OU=$2, O=ApacheTest, L=Syracuse, C=US" and adds it to
+# the truststore.
+#
+function genkey {
+ keytool -genkey -alias $2 -keystore $2.jks -dname "CN=$1, OU=$2, O=ApacheTest, L=Syracuse, C=US" -keyalg RSA -keypass password -storepass password -storetype jks -validity 10000
+ keytool -export -file $2.cer -alias $2 -keystore $2.jks -storepass password
+ keytool -import -file $2.cer -alias $2 -noprompt -keystore Truststore.jks -storepass password
+}
+
+#
+# We generate keys/certificates with the following CN=<name> OU=<name>
+# The CN used to be "localhost" to conform to the default HostnameVerifier of
+# HttpsURLConnection so it would work for tests. However, we have enhanced
+# the HTTP Conduit logic to accept anything in the CN in favor of the
+# MessageTrustDecider callback making the verification determination.
+#
+for name in Bethal Gordy Tarpin Poltim Morpit
+do
+ genkey $name $name
+ keytool -export -keystore Truststore.jks -storepass password -alias $i -rfc >> Truststore.pem
+done
+
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/keys/subjalt.jks
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/keys/subjalt.jks b/systests/transport-undertow/src/test/resources/keys/subjalt.jks
new file mode 100644
index 0000000..fefac18
Binary files /dev/null and b/systests/transport-undertow/src/test/resources/keys/subjalt.jks differ
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/SessionServer.xml
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/SessionServer.xml b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/SessionServer.xml
new file mode 100644
index 0000000..cf12454
--- /dev/null
+++ b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/SessionServer.xml
@@ -0,0 +1,46 @@
+<?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" xmlns:sec="http://cxf.apache.org/configuration/security" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:httpu="http://cxf.apache.org/transports/http-undertow/configuration" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans http://www.springframework.org/
schema/beans/spring-beans.xsd">
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+ <httpu:engine-factory bus="cxf">
+ <httpu:engine port="${testutil.ports.SessionServer}">
+ </httpu:engine>
+ </httpu:engine-factory>
+ <jaxws:endpoint address="http://localhost:${testutil.ports.SessionServer}/SoapContext/GreeterPort" implementor="org.apache.cxf.systest.http_undertow.GreeterSessionImpl">
+ <jaxws:properties>
+ <entry key="org.apache.cxf.oneway.robust" value="true"/>
+ </jaxws:properties>
+ </jaxws:endpoint>
+ <jaxws:endpoint address="http://localhost:${testutil.ports.SessionServer}/Stateful1" implementorClass="org.apache.cxf.systest.http_undertow.StatefulGreeterImpl">
+ <jaxws:invoker>
+ <bean class="org.apache.cxf.jaxws.JAXWSMethodInvoker">
+ <constructor-arg>
+ <bean class="org.apache.cxf.service.invoker.SessionFactory">
+ <constructor-arg value="org.apache.cxf.systest.http_undertow.StatefulGreeterImpl"/>
+ </bean>
+ </constructor-arg>
+ </bean>
+ </jaxws:invoker>
+ </jaxws:endpoint>
+ <jaxws:endpoint address="http://localhost:${testutil.ports.SessionServer}/Stateful2" implementorClass="org.apache.cxf.systest.http_undertow.SessionAnnotationGreeterImpl"/>
+ <jaxws:endpoint address="http://localhost:${testutil.ports.SessionServer}/PerRequest" implementorClass="org.apache.cxf.systest.http_undertow.PerRequestAnnotationGreeterImpl"/>
+ <bean id="SpringBean" class="org.apache.cxf.systest.http_undertow.SpringAnnotationGreeterImpl"/>
+ <jaxws:endpoint address="http://localhost:${testutil.ports.SessionServer}/SpringBean" implementorClass="org.apache.cxf.systest.http_undertow.SpringAnnotationGreeterImpl"/>
+</beans>
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf.xml
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf.xml b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf.xml
new file mode 100644
index 0000000..2e67318
--- /dev/null
+++ b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf.xml
@@ -0,0 +1,24 @@
+<?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" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+ <http:conduit name="{http://cxf.apache.org/systest/jaxws}HelloContinuationPort.http-conduit">
+ <http:client ConnectionTimeout="3000000" ReceiveTimeout="3000000"/>
+ </http:conduit>
+</beans>
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf_https.xml
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf_https.xml b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf_https.xml
new file mode 100644
index 0000000..272926c
--- /dev/null
+++ b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/cxf_https.xml
@@ -0,0 +1,36 @@
+<?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" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:sec="http://cxf.apache.org/configuration/security" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd ">
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+ <!-- -->
+ <!-- HTTP/S configuration for clients -->
+ <!-- -->
+ <http:conduit name="https://localhost:.*">
+ <http:client ConnectionTimeout="3000000" ReceiveTimeout="3000000"/>
+ <http:tlsClientParameters disableCNCheck="true">
+ <sec:keyManagers keyPassword="password">
+ <sec:keyStore type="JKS" password="password" resource="keys/Morpit.jks"/>
+ </sec:keyManagers>
+ <sec:trustManagers>
+ <sec:keyStore type="JKS" password="password" resource="keys/Truststore.jks"/>
+ </sec:trustManagers>
+ </http:tlsClientParameters>
+ </http:conduit>
+</beans>
http://git-wip-us.apache.org/repos/asf/cxf/blob/e61a83d4/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/jaxws-server.xml
----------------------------------------------------------------------
diff --git a/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/jaxws-server.xml b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/jaxws-server.xml
new file mode 100644
index 0000000..725ba01
--- /dev/null
+++ b/systests/transport-undertow/src/test/resources/org/apache/cxf/systest/http_undertow/continuations/jaxws-server.xml
@@ -0,0 +1,47 @@
+<?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" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:httpu="http://cxf.apache.org/transports/http-undertow/configuration" xmlns:sec="http://cxf.apache.org/configuration/security" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://cxf.apache.org/transports/http-undertow/configuration http://cxf.apache.org/schemas/configuration/http-undertow.xsd http://cxf.apache.org/configuration/security http://cxf.apache.org/schemas/configuration/security.xsd ">
+ <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
+ <!-- -->
+ <!-- This Spring config file is designed to represent a minimal -->
+ <!-- configuration for spring-loading a CXF servant, where the -->
+ <!-- servant listens using HTTP/S as the transport protocol. -->
+ <!-- -->
+ <!-- Note that the service endpoint is spring-loaded. In the -->
+ <!-- scenario in which this config is designed to run, the -->
+ <!-- server application merely instantiates a Bus, and does not -->
+ <!-- publish any services programmatically -->
+ <!-- -->
+ <!-- -->
+ <!-- TLS Port configuration parameters for port 9091 -->
+ <!-- -->
+ <httpu:engine-factory>
+ <httpu:engine port="${testutil.ports.Server.1}">
+ <httpu:tlsServerParameters>
+ <sec:keyManagers keyPassword="password">
+ <sec:keyStore type="JKS" password="password" resource="keys/Bethal.jks"/>
+ </sec:keyManagers>
+ <sec:trustManagers>
+ <sec:keyStore type="JKS" password="password" resource="keys/Truststore.jks"/>
+ </sec:trustManagers>
+ </httpu:tlsServerParameters>
+ </httpu:engine>
+ </httpu:engine-factory>
+</beans>