Send auth info with upgrade request for websocket
Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/6259640a Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/6259640a Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/6259640a Branch: refs/heads/master Commit: 6259640a6c59fa917c377c060cceeec441043068 Parents: bd0408c Author: Daniel Kulp <dk...@apache.org> Authored: Fri Aug 18 14:27:59 2017 -0400 Committer: Daniel Kulp <dk...@apache.org> Committed: Fri Aug 18 15:28:36 2017 -0400 ---------------------------------------------------------------------- .../websocket/ahc/AhcWebSocketConduit.java | 39 +++++++++++++++++++- .../websocket/ClientServerWebSocketTest.java | 8 +++- 2 files changed, 43 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/6259640a/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 2e582b8..61f1f9a 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 @@ -34,6 +34,9 @@ import java.util.logging.Level; import java.util.logging.Logger; import com.ning.http.client.AsyncHttpClient; +import com.ning.http.client.AsyncHttpClientConfig; +import com.ning.http.client.Realm.AuthScheme; +import com.ning.http.client.Realm.RealmBuilder; import com.ning.http.client.ws.WebSocket; import com.ning.http.client.ws.WebSocketByteListener; import com.ning.http.client.ws.WebSocketTextListener; @@ -41,6 +44,8 @@ import com.ning.http.client.ws.WebSocketUpgradeHandler; import org.apache.cxf.Bus; import org.apache.cxf.common.logging.LogUtils; +import org.apache.cxf.common.util.StringUtils; +import org.apache.cxf.configuration.security.AuthorizationPolicy; import org.apache.cxf.message.Message; import org.apache.cxf.service.model.EndpointInfo; import org.apache.cxf.transport.http.Address; @@ -69,7 +74,6 @@ public class AhcWebSocketConduit extends URLConnectionHTTPConduit { public AhcWebSocketConduit(Bus b, EndpointInfo ei, EndpointReferenceType t) throws IOException { super(b, ei, t); - ahcclient = new AsyncHttpClient(); } @Override @@ -94,11 +98,40 @@ public class AhcWebSocketConduit extends URLConnectionHTTPConduit { final int rtimeout = determineReceiveTimeout(message, csPolicy); request.setReceiveTimeout(rtimeout); message.put(AhcWebSocketConduitRequest.class, request); + + + } + + private synchronized AsyncHttpClient getAsyncHttpClient(Message message) { + if (ahcclient == null) { + AsyncHttpClientConfig.Builder builder = new AsyncHttpClientConfig.Builder(); + AuthorizationPolicy ap = getEffectiveAuthPolicy(message); + if (ap != null + && (!StringUtils.isEmpty(ap.getAuthorizationType()) + || !StringUtils.isEmpty(ap.getUserName()))) { + RealmBuilder rb = new RealmBuilder(); + if (ap.getAuthorizationType() == null) { + rb.setScheme(AuthScheme.BASIC); + } else { + rb.setScheme(AuthScheme.valueOf(ap.getAuthorizationType().toUpperCase())); + } + rb.setUsePreemptiveAuth(true); + rb.setPassword(ap.getPassword()) + .setPrincipal(ap.getUserName()); + builder.setRealm(rb.build()); + } + + AsyncHttpClientConfig config = builder.build(); + ahcclient = new AsyncHttpClient(config); + } + return ahcclient; } @Override protected OutputStream createOutputStream(Message message, boolean needToCacheRequest, boolean isChunking, int chunkThreshold) throws IOException { + + AhcWebSocketConduitRequest entity = message.get(AhcWebSocketConduitRequest.class); return new AhcWebSocketWrappedOutputStream(message, needToCacheRequest, isChunking, chunkThreshold, getConduitName(), entity.getUri()); @@ -270,7 +303,9 @@ public class AhcWebSocketConduit extends URLConnectionHTTPConduit { LOG.log(Level.FINE, "connecting"); if (websocket == null) { try { - websocket = ahcclient.prepareGet(url.toASCIIString()).execute( + websocket = getAsyncHttpClient(outMessage) + .prepareGet(url.toASCIIString()) + .execute( new WebSocketUpgradeHandler.Builder() .addWebSocketListener(new AhcWebSocketListener()).build()).get(); LOG.log(Level.FINE, "connected"); http://git-wip-us.apache.org/repos/asf/cxf/blob/6259640a/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 index ed727ad..0e6d715 100644 --- 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 @@ -19,6 +19,7 @@ package org.apache.cxf.systest.jaxws.websocket; +import java.io.Closeable; import java.lang.reflect.UndeclaredThrowableException; import java.net.URL; import java.util.Map; @@ -219,7 +220,6 @@ public class ClientServerWebSocketTest extends AbstractBusClientServerTestBase { } @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); @@ -237,7 +237,10 @@ public class ClientServerWebSocketTest extends AbstractBusClientServerTestBase { assertEquals("Hello BJ", s); bp.getRequestContext().remove(BindingProvider.USERNAME_PROPERTY); bp.getRequestContext().remove(BindingProvider.PASSWORD_PROPERTY); - + ((Closeable)greeter).close(); + + greeter = service.getPort(portName, Greeter.class); + updateGreeterAddress(greeter, PORT); //try setting on the conduit directly Client client = ClientProxy.getClient(greeter); HTTPConduit httpConduit = (HTTPConduit)client.getConduit(); @@ -247,6 +250,7 @@ public class ClientServerWebSocketTest extends AbstractBusClientServerTestBase { httpConduit.setAuthorization(policy); s = greeter.greetMe("secure"); + ((Closeable)greeter).close(); assertEquals("Hello BJ2", s); } catch (UndeclaredThrowableException ex) { throw (Exception)ex.getCause();