Browse Source

Switch to using Jetty directly.

Spark doesn't work with recent versions, old versions of Jetty
have nasty bugs, and spark doesn't really give us much benefit.
pull/478/head
Chris Smith 7 years ago
parent
commit
f2598af651

+ 6
- 2
ui_web2/build.gradle View File

@@ -1,4 +1,8 @@
1 1
 dependencies {
2
-  bundle group: 'com.sparkjava', name: 'spark-core', version: '2.5'
3
-  bundle group: 'com.google.code.gson', name: 'gson', 'version': '2.5'
2
+    bundle group: 'com.google.code.gson', name: 'gson', version: '2.5'
3
+
4
+    bundle group: 'org.eclipse.jetty', name: 'jetty-server', version: '9.3.9.v20160517'
5
+    bundle group: 'org.eclipse.jetty.websocket', name: 'websocket-server', version: '9.3.9.v20160517'
6
+    bundle group: 'org.eclipse.jetty.websocket', name: 'websocket-servlet', version: '9.3.9.v20160517'
7
+
4 8
 }

+ 62
- 6
ui_web2/src/main/java/com/dmdirc/addons/ui_web2/WebServer.java View File

@@ -22,28 +22,84 @@
22 22
 
23 23
 package com.dmdirc.addons.ui_web2;
24 24
 
25
-import spark.Spark;
25
+import com.dmdirc.util.LogUtils;
26
+
27
+import org.eclipse.jetty.server.Handler;
28
+import org.eclipse.jetty.server.Server;
29
+import org.eclipse.jetty.server.handler.DefaultHandler;
30
+import org.eclipse.jetty.server.handler.HandlerList;
31
+import org.eclipse.jetty.server.handler.ResourceHandler;
32
+import org.eclipse.jetty.servlet.ServletContextHandler;
33
+import org.eclipse.jetty.util.resource.Resource;
34
+import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
35
+import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
36
+import org.slf4j.Logger;
37
+import org.slf4j.LoggerFactory;
26 38
 
27 39
 /**
28 40
  * Web server used by the web UI.
29 41
  */
30 42
 public class WebServer {
31 43
 
44
+    private static final Logger LOG = LoggerFactory.getLogger(WebServer.class);
45
+
32 46
     private final int port;
47
+    private Server server;
33 48
 
34 49
     public WebServer(final int port) {
35 50
         this.port = port;
36 51
     }
37 52
 
38 53
     public void start() {
39
-        Spark.port(port);
40
-        Spark.webSocket("/ws", WebSocketHandler.class);
41
-        Spark.staticFileLocation("/www");
42
-        Spark.get("/test", (request, response) -> "HELLO");
54
+        server = new Server(port);
55
+
56
+        // Override the context classloader, so that Jetty uses the plugin classloader not the main DMDirc loader.
57
+        final Thread currentThread = Thread.currentThread();
58
+        final ClassLoader classLoader = currentThread.getContextClassLoader();
59
+        currentThread.setContextClassLoader(getClass().getClassLoader());
60
+
61
+        try {
62
+            final ResourceHandler resourceHandler = new ResourceHandler();
63
+            resourceHandler.setWelcomeFiles(new String[]{ "index.html" });
64
+            resourceHandler.setBaseResource(Resource.newClassPathResource("/www"));
65
+
66
+            final ServletContextHandler wsHandler = new ServletContextHandler();
67
+            wsHandler.setContextPath("/");
68
+            wsHandler.addServlet(WebUiWebSocketServlet.class, "/ws");
69
+
70
+            HandlerList handlers = new HandlerList();
71
+            handlers.setHandlers(new Handler[] { resourceHandler, wsHandler, new DefaultHandler() });
72
+            server.setHandler(handlers);
73
+
74
+            server.start();
75
+        } catch (Exception ex) {
76
+            LOG.error(LogUtils.USER_ERROR, "Unable to start web server", ex);
77
+            server = null;
78
+        } finally {
79
+            // Restore the usual context class loader.
80
+            currentThread.setContextClassLoader(classLoader);
81
+        }
43 82
     }
44 83
 
45 84
     public void stop() {
46
-        Spark.stop();
85
+        try {
86
+            server.stop();
87
+        } catch (Exception ex) {
88
+            LOG.error(LogUtils.USER_ERROR, "Unable to stop web server", ex);
89
+        }
90
+
91
+        server = null;
47 92
     }
48 93
 
94
+    /**
95
+     * Web Socket Servlet that creates a {@link WebSocketHandler} for each connection.
96
+     */
97
+    public static class WebUiWebSocketServlet extends WebSocketServlet {
98
+
99
+        @Override
100
+        public void configure(final WebSocketServletFactory factory) {
101
+            factory.register(WebSocketHandler.class);
102
+        }
103
+
104
+    }
49 105
 }

+ 0
- 1
ui_web2/src/main/resources/META-INF/services/org.eclipse.jetty.http.HttpFieldPreEncoder View File

@@ -1 +0,0 @@
1
-org.eclipse.jetty.http.Http1FieldPreEncoder

Loading…
Cancel
Save