/** * Copyright (C) 2014 Red Hat, Inc, and individual contributors. */ package org.projectodd.sockjs; import io.undertow.Undertow; import io.undertow.server.HttpHandler; import io.undertow.server.handlers.PathHandler; import sun.misc.Signal; import sun.misc.SignalHandler; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import java.util.concurrent.CountDownLatch; import java.util.logging.FileHandler; import java.util.logging.Filter; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; public class SockJsProtocolTestServer extends AbstractSockJsTest { public static void main(String[] args) throws Exception { configureLogging(Level.FINEST); SockJsServer echoServer = new SockJsServer(); echoServer.options.responseLimit = 4096; echoServer.onConnection(new SockJsServer.OnConnectionHandler() { @Override public void handle(final SockJsConnection connection) { System.out.println(" [+] echo open " + connection); connection.onClose(new SockJsConnection.OnCloseHandler() { @Override public void handle() { System.out.println(" [-] echo close " + connection); } }); connection.onData(new SockJsConnection.OnDataHandler() { @Override public void handle(String message) { System.out.println(" [ ] echo message " + connection + " " + message); connection.write(message); } }); } }); SockJsServer echoNoWsServer = new SockJsServer(); echoNoWsServer.options.responseLimit = 4096; echoNoWsServer.options.websocket = false; echoNoWsServer.onConnection(new SockJsServer.OnConnectionHandler() { @Override public void handle(final SockJsConnection connection) { System.out.println(" [+] echo open " + connection); connection.onClose(new SockJsConnection.OnCloseHandler() { @Override public void handle() { System.out.println(" [-] echo close " + connection); } }); connection.onData(new SockJsConnection.OnDataHandler() { @Override public void handle(String message) { System.out.println(" [ ] echo message " + connection + " " + message); connection.write(message); } }); } }); SockJsServer echoCookie = new SockJsServer(); echoCookie.options.responseLimit = 4096; echoCookie.options.jsessionid = true; echoCookie.onConnection(new SockJsServer.OnConnectionHandler() { @Override public void handle(final SockJsConnection connection) { System.out.println(" [+] echo open " + connection); connection.onClose(new SockJsConnection.OnCloseHandler() { @Override public void handle() { System.out.println(" [-] echo close " + connection); } }); connection.onData(new SockJsConnection.OnDataHandler() { @Override public void handle(String message) { System.out.println(" [ ] echo message " + connection + " " + message); connection.write(message); } }); } }); SockJsServer closeServer = new SockJsServer(); closeServer.onConnection(new SockJsServer.OnConnectionHandler() { @Override public void handle(final SockJsConnection connection) { System.out.println(" [+] clos open " + connection); connection.close(3000, "Go away!"); connection.onClose(new SockJsConnection.OnCloseHandler() { @Override public void handle() { System.out.println(" [-] clos close " + connection); } }); } }); SockJsProtocolTestServer servletTest = new SockJsProtocolTestServer(); PathHandler pathHandler = new PathHandler(); servletTest.installHandler(pathHandler, echoServer, "/echo"); servletTest.installHandler(pathHandler, echoNoWsServer, "/disabled_websocket_echo"); servletTest.installHandler(pathHandler, echoCookie, "/cookie_needed_echo"); servletTest.installHandler(pathHandler, closeServer, "/close"); servletTest.runServer(pathHandler, "localhost", 8081); } private void runServer(HttpHandler handler, String host, int port) throws Exception { Undertow undertow = createUndertow(handler, host, port); final CountDownLatch latch = new CountDownLatch(1); SignalHandler signalHandler = new SignalHandler() { @Override public void handle(Signal sig) { latch.countDown(); } }; undertow.start(); System.out.println("SockJS Servlet running on http://" + host + ":" + port); System.out.println("CTRL+C to terminate"); Signal.handle(new Signal("INT"), signalHandler); Signal.handle(new Signal("TERM"), signalHandler); latch.await(); } private static void configureLogging(Level level) throws Exception { Logger rootLogger = Logger.getLogger(""); String logFile = System.getProperty("logFile"); if (logFile != null) { rootLogger.addHandler(new FileHandler(logFile)); } for (Handler handler : rootLogger.getHandlers()) { handler.setFilter(new Filter() { private String[] noisyLoggers = new String[] { "com.sun.jmx", "javax.management", "org.xnio" }; @Override public boolean isLoggable(LogRecord record) { String loggerName = record.getLoggerName(); for (String noisyLogger : noisyLoggers) { if (loggerName != null && loggerName.startsWith(noisyLogger)) { return false; } } return true; } }); handler.setLevel(level); handler.setFormatter(new java.util.logging.Formatter() { // Totally ripped off from java.util.logging.SimpleFormatter private final String format = "%1$tb %1$td, %1$tY %1$tl:%1$tM:%1$tS %1$Tp %4$s [%2$s] %5$s%6$s%n"; private final Date dat = new Date(); @Override public synchronized String format(LogRecord record) { dat.setTime(record.getMillis()); String source = record.getLoggerName(); String message = formatMessage(record); String throwable = ""; if (record.getThrown() != null) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); pw.println(); record.getThrown().printStackTrace(pw); pw.close(); throwable = sw.toString(); } return String.format(format, dat, source, record.getLoggerName(), record.getLevel().getName(), message, throwable); } }); } rootLogger.setLevel(level); } }