Improve Jetty integration in order to support consistent HTTP sessions.
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / client / WebSocketEventClient.java
index 294b485fb450668352baac32a63e457ebd30233d..ed20e95b271a7b7168ad43821fcf0fbf96b9896c 100644 (file)
@@ -7,59 +7,80 @@ import java.net.http.WebSocket;
 import java.nio.ByteBuffer;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionStage;
+import java.util.concurrent.ExecutionException;
 
 import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
 
 import org.argeo.cms.auth.RemoteAuthUtils;
 import org.argeo.util.http.HttpHeader;
 
 /** Tests connectivity to the web socket server. */
-public class WebSocketEventClient {
+public class WebSocketEventClient implements Runnable {
 
-       public static void main(String[] args) throws Exception {
-               if (args.length == 0) {
-                       System.err.println("usage: java " + WebSocketEventClient.class.getName() + " <url>");
-                       System.exit(1);
-                       return;
-               }
-               URI uri = URI.create(args[0]);
-               WebSocket.Listener listener = new WebSocket.Listener() {
+       private final URI uri;
 
-                       public CompletionStage<?> onText(WebSocket webSocket, CharSequence message, boolean last) {
-                               System.out.println(message);
-                               CompletionStage<String> res = CompletableFuture.completedStage(message.toString());
-                               return res;
-                       }
+       private WebSocket webSocket;
+       
+       public WebSocketEventClient(URI uri) {
+               this.uri = uri;
+       }
 
-                       @Override
-                       public CompletionStage<?> onPong(WebSocket webSocket, ByteBuffer message) {
-                               // System.out.println("Pong received.");
-                               return null;
-                       }
+       @Override
+       public void run() {
+               try {
+                       WebSocket.Listener listener = new WebSocket.Listener() {
 
-               };
+                               public CompletionStage<?> onText(WebSocket webSocket, CharSequence message, boolean last) {
+                                       System.out.println(message);
+                                       CompletionStage<String> res = CompletableFuture.completedStage(message.toString());
+                                       return res;
+                               }
 
-               // SPNEGO
-               URL jaasUrl = SpnegoHttpClient.class.getResource("jaas-client-ipa.cfg");
-               System.setProperty("java.security.auth.login.config", jaasUrl.toExternalForm());
-               LoginContext lc = new LoginContext(SpnegoHttpClient.CLIENT_LOGIN_CONTEXT);
-               lc.login();
-               String token = RemoteAuthUtils.createGssToken(lc.getSubject(), "HTTP", uri.getHost());
+                               @Override
+                               public CompletionStage<?> onPong(WebSocket webSocket, ByteBuffer message) {
+                                       // System.out.println("Pong received.");
+                                       return null;
+                               }
 
-               HttpClient client = SpnegoHttpClient.openHttpClient(lc.getSubject());
-               CompletableFuture<WebSocket> ws = client.newWebSocketBuilder()
-                               .header(HttpHeader.AUTHORIZATION.getHeaderName(), HttpHeader.NEGOTIATE + " " + token)
-                               .buildAsync(uri, listener);
+                       };
 
-               WebSocket webSocket = ws.get();
-               webSocket.request(Long.MAX_VALUE);
+                       // SPNEGO
+                       URL jaasUrl = SpnegoHttpClient.class.getResource("jaas-client-ipa.cfg");
+                       System.setProperty("java.security.auth.login.config", jaasUrl.toExternalForm());
+                       LoginContext lc = new LoginContext(SpnegoHttpClient.CLIENT_LOGIN_CONTEXT);
+                       lc.login();
+                       String token = RemoteAuthUtils.createGssToken(lc.getSubject(), "HTTP", uri.getHost());
 
-               Runtime.getRuntime().addShutdownHook(new Thread(() -> webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "")));
+                       HttpClient client = SpnegoHttpClient.openHttpClient(lc.getSubject());
+                       CompletableFuture<WebSocket> ws = client.newWebSocketBuilder()
+                                       .header(HttpHeader.AUTHORIZATION.getHeaderName(), HttpHeader.NEGOTIATE + " " + token)
+                                       .buildAsync(uri, listener);
 
-               while (!webSocket.isInputClosed()) {
-                       webSocket.sendPing(ByteBuffer.allocate(0));
-                       Thread.sleep(10000);
+                       WebSocket webSocket = ws.get();
+                       webSocket.request(Long.MAX_VALUE);
+
+                       Runtime.getRuntime().addShutdownHook(new Thread(() -> webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "")));
+
+                       while (!webSocket.isInputClosed()) {
+                               webSocket.sendPing(ByteBuffer.allocate(0));
+                               Thread.sleep(10000);
+                       }
+               }catch (InterruptedException e) {
+                       if (webSocket != null)
+                               webSocket.sendClose(WebSocket.NORMAL_CLOSURE, "");
+               } catch (ExecutionException | LoginException e) {
+                       throw new RuntimeException("Cannot listent to " + uri, e.getCause());
                }
        }
 
+//     public static void main(String[] args) throws Exception {
+//             if (args.length == 0) {
+//                     System.err.println("usage: java " + WebSocketEventClient.class.getName() + " <url>");
+//                     System.exit(1);
+//                     return;
+//             }
+//             URI uri = URI.create(args[0]);
+//     }
+
 }