You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by ay...@apache.org on 2014/06/12 18:58:38 UTC
git commit: [CXF-5798] WebSocket transport fails to transport a large
message; add a jaxws websocket test
Repository: cxf
Updated Branches:
refs/heads/master 5ec1b6025 -> bbee298c2
[CXF-5798] WebSocket transport fails to transport a large message; add a jaxws websocket test
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo
Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/bbee298c
Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/bbee298c
Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/bbee298c
Branch: refs/heads/master
Commit: bbee298c2a1e457c2dae8e1d600517d218d4906e
Parents: 5ec1b60
Author: Akitoshi Yoshida <ay...@apache.org>
Authored: Thu Jun 12 18:57:07 2014 +0200
Committer: Akitoshi Yoshida <ay...@apache.org>
Committed: Thu Jun 12 18:57:07 2014 +0200
----------------------------------------------------------------------
.../transport/websocket/WebSocketConstants.java | 4 +-
.../WebSocketVirtualServletRequest.java | 4 +
.../WebSocketVirtualServletResponse.java | 105 ++++----
.../websocket/ahc/AhcWebSocketConduit.java | 3 +-
.../websocket/jetty/JettyWebSocket.java | 1 +
systests/jaxws/pom.xml | 29 +++
.../websocket/ClientServerWebSocketTest.java | 258 +++++++++++++++++++
.../cxf/systest/jaxws/websocket/Server.java | 81 ++++++
8 files changed, 436 insertions(+), 49 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketConstants.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketConstants.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketConstants.java
index 64efc1d..ec78cb4 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketConstants.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketConstants.java
@@ -23,8 +23,8 @@ package org.apache.cxf.transport.websocket;
*
*/
public final class WebSocketConstants {
- public static final String DEFAULT_REQUEST_ID_KEY = "requestId";
- public static final String DEFAULT_RESPONSE_ID_KEY = "responseId";
+ public static final String DEFAULT_REQUEST_ID_KEY = "Request-Id";
+ public static final String DEFAULT_RESPONSE_ID_KEY = "Response-Id";
private WebSocketConstants() {
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletRequest.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletRequest.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletRequest.java
index 9f7bc1a..fabe28c 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletRequest.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletRequest.java
@@ -408,6 +408,10 @@ public class WebSocketVirtualServletRequest implements HttpServletRequest {
LOG.log(Level.INFO, "getPathTranslated");
String path = getPathInfo();
String opathtrans = webSocketHolder.getPathTranslated();
+ // some container may choose not to return this value
+ if (opathtrans == null) {
+ return null;
+ }
String opathinfo = webSocketHolder.getPathInfo();
int pos = opathtrans.indexOf(opathinfo);
//REVISIT may cache this value in requstHeaders?
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletResponse.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletResponse.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletResponse.java
index 1594dab..d1fa3b1 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletResponse.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/WebSocketVirtualServletResponse.java
@@ -19,6 +19,7 @@
package org.apache.cxf.transport.websocket;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
@@ -41,25 +42,17 @@ public class WebSocketVirtualServletResponse implements HttpServletResponse {
private static final Logger LOG = LogUtils.getL7dLogger(WebSocketVirtualServletResponse.class);
private WebSocketServletHolder webSocketHolder;
private Map<String, String> responseHeaders;
- private boolean flushed;
+ private ServletOutputStream outputStream;
public WebSocketVirtualServletResponse(WebSocketServletHolder websocket) {
this.webSocketHolder = websocket;
this.responseHeaders = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
+ this.outputStream = createOutputStream();
}
@Override
public void flushBuffer() throws IOException {
LOG.log(Level.INFO, "flushBuffer()");
- if (!flushed) {
- //REVISIT this mechanism to determine if the headers have been flushed
- if (responseHeaders.get(WebSocketUtils.FLUSHED_KEY) == null) {
- byte[] data = WebSocketUtils.buildResponse(responseHeaders, null, 0, 0);
- webSocketHolder.write(data, 0, data.length);
- responseHeaders.put(WebSocketUtils.FLUSHED_KEY, "true");
- }
- flushed = true;
- }
}
@Override
@@ -88,42 +81,7 @@ public class WebSocketVirtualServletResponse implements HttpServletResponse {
@Override
public ServletOutputStream getOutputStream() throws IOException {
- return new ServletOutputStream() {
-
- @Override
- public void write(int b) throws IOException {
- byte[] data = new byte[1];
- data[0] = (byte)b;
- write(data, 0, 1);
- }
-
- @Override
- public void write(byte[] data) throws IOException {
- write(data, 0, data.length);
- }
-
- @Override
- public void write(byte[] data, int offset, int length) throws IOException {
- if (responseHeaders.get(WebSocketUtils.FLUSHED_KEY) == null) {
- data = WebSocketUtils.buildResponse(responseHeaders, data, offset, length);
- responseHeaders.put(WebSocketUtils.FLUSHED_KEY, "true");
- } else {
- data = WebSocketUtils.buildResponse(data, offset, length);
- }
- webSocketHolder.write(data, 0, data.length);
- }
-
- @Override
- public void close() throws IOException {
- if (responseHeaders.get(WebSocketUtils.FLUSHED_KEY) == null) {
- byte[] data = WebSocketUtils.buildResponse(responseHeaders, null, 0, 0);
- webSocketHolder.write(data, 0, data.length);
- responseHeaders.put(WebSocketUtils.FLUSHED_KEY, "true");
- }
- super.close();
- }
-
- };
+ return outputStream;
}
@Override
@@ -347,4 +305,59 @@ public class WebSocketVirtualServletResponse implements HttpServletResponse {
responseHeaders.put(WebSocketUtils.SC_KEY, Integer.toString(sc));
responseHeaders.put(WebSocketUtils.SM_KEY, sm);
}
+
+ private ServletOutputStream createOutputStream() {
+ return new ServletOutputStream() {
+ //REVISIT
+ // This output buffering is needed as the server side websocket does
+ // not support the fragment transmission mode when sending back a large data.
+ // And this buffering is only used for the response for the initial service innovation.
+ // For the subsequently pushed data to the socket are sent back
+ // unbuffered as individual websocket messages.
+ // the things to consider :
+ // - provide a size limit if we are use this buffering
+ // - add a chunking mode in the cxf websocket's binding.
+ private InternalByteArrayOutputStream buffer = new InternalByteArrayOutputStream();
+
+ @Override
+ public void write(int b) throws IOException {
+ byte[] data = new byte[1];
+ data[0] = (byte)b;
+ write(data, 0, 1);
+ }
+
+ @Override
+ public void write(byte[] data) throws IOException {
+ write(data, 0, data.length);
+ }
+
+ @Override
+ public void write(byte[] data, int offset, int length) throws IOException {
+ if (responseHeaders.get(WebSocketUtils.FLUSHED_KEY) == null) {
+ // buffer the data until it gets flushed
+ buffer.write(data, offset, length);
+ } else {
+ // unbuffered write to the socket
+ data = WebSocketUtils.buildResponse(data, offset, length);
+ webSocketHolder.write(data, 0, data.length);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (responseHeaders.get(WebSocketUtils.FLUSHED_KEY) == null) {
+ byte[] data = WebSocketUtils.buildResponse(responseHeaders, buffer.getBytes(), 0, buffer.size());
+ webSocketHolder.write(data, 0, data.length);
+ responseHeaders.put(WebSocketUtils.FLUSHED_KEY, "true");
+ }
+ super.close();
+ }
+ };
+ }
+
+ private static class InternalByteArrayOutputStream extends ByteArrayOutputStream {
+ public byte[] getBytes() {
+ return buf;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/ahc/AhcWebSocketConduit.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/ahc/AhcWebSocketConduit.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/ahc/AhcWebSocketConduit.java
index 5da490e..4275d20 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/ahc/AhcWebSocketConduit.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/ahc/AhcWebSocketConduit.java
@@ -23,6 +23,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
+import java.net.SocketTimeoutException;
import java.net.URI;
import java.util.Collections;
import java.util.HashMap;
@@ -298,7 +299,7 @@ public class AhcWebSocketConduit extends URLConnectionHTTPConduit {
}
}
if (response == null) {
- throw new IOException("timeout");
+ throw new SocketTimeoutException("Read timed out while invoking " + entity.getUri());
}
}
return response;
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
----------------------------------------------------------------------
diff --git a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
index 1685338..0086095 100644
--- a/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
+++ b/rt/transports/websocket/src/main/java/org/apache/cxf/transport/websocket/jetty/JettyWebSocket.java
@@ -202,6 +202,7 @@ class JettyWebSocket implements WebSocket.OnBinaryMessage, WebSocket.OnTextMessa
properties.put("locale", request.getLocale());
properties.put("locales", request.getLocales());
properties.put("remoteHost", request.getRemoteHost());
+ properties.put("remotePort", request.getRemotePort());
properties.put("remoteAddr", request.getRemoteAddr());
properties.put("serverName", request.getServerName());
properties.put("serverPort", request.getServerPort());
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/systests/jaxws/pom.xml
----------------------------------------------------------------------
diff --git a/systests/jaxws/pom.xml b/systests/jaxws/pom.xml
index 82538f4..825cfa5 100644
--- a/systests/jaxws/pom.xml
+++ b/systests/jaxws/pom.xml
@@ -125,10 +125,21 @@
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
+ <artifactId>cxf-rt-transports-websocket</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-clustering</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
+ <groupId>org.eclipse.jetty</groupId>
+ <artifactId>jetty-websocket</artifactId>
+ <version>${cxf.jetty.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<scope>test</scope>
@@ -220,6 +231,24 @@
</exclusions>
<scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>com.ning</groupId>
+ <artifactId>async-http-client</artifactId>
+ <version>${cxf.ahc.version}</version>
+ <scope>test</scope>
+ <exclusions>
+ <exclusion>
+ <groupId>io.netty</groupId>
+ <artifactId>netty</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty</artifactId>
+ <version>${cxf.netty3.version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<profiles>
<profile>
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/ClientServerWebSocketTest.java
----------------------------------------------------------------------
diff --git a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/ClientServerWebSocketTest.java b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/ClientServerWebSocketTest.java
new file mode 100644
index 0000000..336fbe9
--- /dev/null
+++ b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/ClientServerWebSocketTest.java
@@ -0,0 +1,258 @@
+/**
+ * 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.jaxws.websocket;
+
+import java.lang.reflect.UndeclaredThrowableException;
+import java.net.URL;
+import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+import javax.xml.ws.BindingProvider;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.configuration.security.AuthorizationPolicy;
+import org.apache.cxf.endpoint.Client;
+import org.apache.cxf.frontend.ClientProxy;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase;
+import org.apache.cxf.transport.http.HTTPConduit;
+import org.apache.hello_world_soap_http.BadRecordLitFault;
+import org.apache.hello_world_soap_http.Greeter;
+import org.apache.hello_world_soap_http.NoSuchCodeLitFault;
+import org.apache.hello_world_soap_http.SOAPService;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ClientServerWebSocketTest extends AbstractBusClientServerTestBase {
+ static final String PORT = allocatePort(Server.class);
+
+ static final Logger LOG = LogUtils.getLogger(ClientServerWebSocketTest.class);
+ private final QName serviceName = new QName("http://apache.org/hello_world_soap_http",
+ "SOAPService");
+ private final QName portName = new QName("http://apache.org/hello_world_soap_http",
+ "SoapPort");
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ // set up configuration to enable schema validation
+ assertTrue("server did not launch correctly", launchServer(Server.class, true));
+ createStaticBus();
+ }
+
+ @Test
+ public void testBasicConnection() throws Exception {
+
+ SOAPService service = new SOAPService();
+
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ updateGreeterAddress(greeter, PORT);
+
+ try {
+ String reply = greeter.greetMe("test");
+ assertNotNull("no response received from service", reply);
+ assertEquals("Hello test", reply);
+
+ reply = greeter.sayHi();
+ assertNotNull("no response received from service", reply);
+ assertEquals("Bonjour", reply);
+ } catch (UndeclaredThrowableException ex) {
+ throw (Exception)ex.getCause();
+ }
+ BindingProvider bp = (BindingProvider)greeter;
+ Map<String, Object> responseContext = bp.getResponseContext();
+ Integer responseCode = (Integer) responseContext.get(Message.RESPONSE_CODE);
+ assertEquals(200, responseCode.intValue());
+ }
+
+ @Test
+ public void testBasicConnection2() throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ assertNotNull(wsdl);
+
+ SOAPService service = new SOAPService(wsdl, serviceName);
+
+ //getPort only passing in SEI
+ Greeter greeter = service.getPort(Greeter.class);
+ updateGreeterAddress(greeter, PORT);
+
+ String response1 = new String("Hello Milestone-");
+ String response2 = new String("Bonjour");
+ try {
+ for (int idx = 0; idx < 5; idx++) {
+ String greeting = greeter.greetMe("Milestone-" + idx);
+ assertNotNull("no response received from service", greeting);
+ String exResponse = response1 + idx;
+ assertEquals(exResponse, greeting);
+
+ String reply = greeter.sayHi();
+ assertNotNull("no response received from service", reply);
+ assertEquals(response2, reply);
+
+ greeter.greetMeOneWay("Milestone-" + idx);
+ }
+ } catch (UndeclaredThrowableException ex) {
+ throw (Exception)ex.getCause();
+ }
+ }
+
+ @Test
+ public void testTimeoutConfigutation() throws Exception {
+
+ SOAPService service = new SOAPService();
+
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ updateGreeterAddress(greeter, PORT);
+
+ ((javax.xml.ws.BindingProvider)greeter).getRequestContext().put("javax.xml.ws.client.receiveTimeout",
+ "1");
+ try {
+ greeter.greetMe("test");
+ // remove fail() check to let this test pass in the powerful machine
+ } catch (Throwable ex) {
+ Object cause = null;
+ if (ex.getCause() != null) {
+ cause = ex.getCause();
+ }
+ assertTrue("Timeout cause is expected", cause instanceof java.net.SocketTimeoutException);
+ }
+ }
+
+ @Test
+ public void testBasicConnectionAndOneway() throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ assertNotNull(wsdl);
+
+ SOAPService service = new SOAPService(wsdl, serviceName);
+
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ updateGreeterAddress(greeter, PORT);
+
+ String response1 = new String("Hello Milestone-");
+ String response2 = new String("Bonjour");
+ try {
+ for (int idx = 0; idx < 1; idx++) {
+ String greeting = greeter.greetMe("Milestone-" + idx);
+ assertNotNull("no response received from service", greeting);
+ String exResponse = response1 + idx;
+ assertEquals(exResponse, greeting);
+
+ String reply = greeter.sayHi();
+ assertNotNull("no response received from service", reply);
+ assertEquals(response2, reply);
+
+ greeter.greetMeOneWay("Milestone-" + idx);
+
+
+
+ }
+ } catch (UndeclaredThrowableException ex) {
+ throw (Exception)ex.getCause();
+ }
+ }
+
+ @Test
+ public void testFaults() throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ assertNotNull(wsdl);
+
+ SOAPService service = new SOAPService(wsdl, serviceName);
+ ExecutorService ex = Executors.newFixedThreadPool(1);
+ service.setExecutor(ex);
+ assertNotNull(service);
+
+ String noSuchCodeFault = "NoSuchCodeLitFault";
+ String badRecordFault = "BadRecordLitFault";
+
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ updateGreeterAddress(greeter, PORT);
+
+ for (int idx = 0; idx < 2; idx++) {
+ try {
+ greeter.testDocLitFault(noSuchCodeFault);
+ fail("Should have thrown NoSuchCodeLitFault exception");
+ } catch (NoSuchCodeLitFault nslf) {
+ assertNotNull(nslf.getFaultInfo());
+ assertNotNull(nslf.getFaultInfo().getCode());
+ }
+
+ try {
+ greeter.testDocLitFault(badRecordFault);
+ fail("Should have thrown BadRecordLitFault exception");
+ } catch (BadRecordLitFault brlf) {
+ BindingProvider bp = (BindingProvider)greeter;
+ Map<String, Object> responseContext = bp.getResponseContext();
+ String contentType = (String) responseContext.get(Message.CONTENT_TYPE);
+ assertEquals("text/xml; charset=utf-8", contentType.toLowerCase());
+ Integer responseCode = (Integer) responseContext.get(Message.RESPONSE_CODE);
+ assertEquals(500, responseCode.intValue());
+ assertNotNull(brlf.getFaultInfo());
+ assertEquals("BadRecordLitFault", brlf.getFaultInfo());
+ }
+
+ }
+
+ }
+
+ @Test
+ @org.junit.Ignore //TODO need to pass the principal of the original upgrade request to its subsequent service calls
+ public void testBasicAuth() throws Exception {
+ URL wsdl = getClass().getResource("/wsdl/hello_world.wsdl");
+ assertNotNull(wsdl);
+
+ SOAPService service = new SOAPService(wsdl, serviceName);
+ Greeter greeter = service.getPort(portName, Greeter.class);
+ updateGreeterAddress(greeter, PORT);
+
+ try {
+ //try the jaxws way
+ BindingProvider bp = (BindingProvider)greeter;
+ bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "BJ");
+ bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pswd");
+ String s = greeter.greetMe("secure");
+ assertEquals("Hello BJ", s);
+ bp.getRequestContext().remove(BindingProvider.USERNAME_PROPERTY);
+ bp.getRequestContext().remove(BindingProvider.PASSWORD_PROPERTY);
+
+ //try setting on the conduit directly
+ Client client = ClientProxy.getClient(greeter);
+ HTTPConduit httpConduit = (HTTPConduit)client.getConduit();
+ AuthorizationPolicy policy = new AuthorizationPolicy();
+ policy.setUserName("BJ2");
+ policy.setPassword("pswd");
+ httpConduit.setAuthorization(policy);
+
+ s = greeter.greetMe("secure");
+ assertEquals("Hello BJ2", s);
+ } catch (UndeclaredThrowableException ex) {
+ throw (Exception)ex.getCause();
+ }
+ }
+
+ private void updateGreeterAddress(Greeter greeter, String port) {
+ ((BindingProvider)greeter).getRequestContext()
+ .put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,
+ "ws://localhost:" + PORT + "/SoapContext/SoapPort");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cxf/blob/bbee298c/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/Server.java
----------------------------------------------------------------------
diff --git a/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/Server.java b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/Server.java
new file mode 100644
index 0000000..6ffe044
--- /dev/null
+++ b/systests/jaxws/src/test/java/org/apache/cxf/systest/jaxws/websocket/Server.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.jaxws.websocket;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.jws.WebService;
+import javax.xml.ws.Endpoint;
+
+import org.apache.cxf.jaxws.EndpointImpl;
+import org.apache.cxf.testutil.common.AbstractBusTestServerBase;
+import org.apache.hello_world_soap_http.BaseGreeterImpl;
+import org.apache.hello_world_soap_http.GreeterImpl;
+
+public class Server extends AbstractBusTestServerBase {
+ static final String PORT = allocatePort(Server.class);
+ static final String BOGUS_REAL_PORT = allocatePort(Server.class, 2);
+
+ List<Endpoint> eps = new LinkedList<Endpoint>();
+
+ protected void run() {
+ Object implementor;
+ String address;
+
+ implementor = new GreeterImpl();
+ address = "ws://localhost:" + PORT + "/SoapContext/SoapPort";
+ Endpoint ep = Endpoint.publish(address, implementor);
+ eps.add(ep);
+
+ //publish port with soap12 binding
+ address = "ws://localhost:" + PORT + "/SoapContext/SoapPort";
+ EndpointImpl e = (EndpointImpl) Endpoint.create(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING,
+ new Greeter12Impl());
+ e.publish(address);
+ eps.add(e);
+ }
+
+ public void tearDown() {
+ while (!eps.isEmpty()) {
+ Endpoint ep = eps.remove(0);
+ ep.stop();
+ }
+ }
+
+ @WebService(endpointInterface = "org.apache.hello_world_soap_http.Greeter",
+ targetNamespace = "http://apache.org/hello_world_soap_http")
+ public class Greeter12Impl extends BaseGreeterImpl {
+
+ }
+
+
+ public static void main(String[] args) {
+ try {
+ Server s = new Server();
+ s.start();
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ System.exit(-1);
+ } finally {
+ System.out.println("done!");
+ }
+ }
+}