Sfoglia il codice sorgente

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 8 anni fa
parent
commit
f2598af651

+ 6
- 2
ui_web2/build.gradle Vedi 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 Vedi 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 Vedi File

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

Loading…
Annulla
Salva