From 892506f2f94e0fc65c6a60dcd20b87bea9d40e02 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Fri, 24 Feb 2023 13:55:21 +0100 Subject: [PATCH] Remove uneccesary lock, fix double server header, organize packages and class-names --- .../bluemap/common/plugin/Plugin.java | 7 +- .../common/web/JsonDataRequestHandler.java | 2 - .../bluemap/common/web/WebServer.java | 23 ----- .../common/web/http/HttpConnection.java | 96 +++++++++---------- .../bluemap/common/web/http/HttpServer.java | 18 ++++ .../bluecolored/bluemap/cli/BlueMapCLI.java | 3 +- 6 files changed, 68 insertions(+), 81 deletions(-) delete mode 100644 BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/WebServer.java create mode 100644 BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java index ad030648..0c2e069c 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java @@ -38,6 +38,7 @@ import de.bluecolored.bluemap.common.rendermanager.RenderManager; import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; import de.bluecolored.bluemap.common.serverinterface.ServerInterface; import de.bluecolored.bluemap.common.web.*; +import de.bluecolored.bluemap.common.web.http.HttpServer; import de.bluecolored.bluemap.core.debug.StateDumper; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.map.BmMap; @@ -81,7 +82,7 @@ public class Plugin implements ServerEventListener { private Map maps; private RenderManager renderManager; - private WebServer webServer; + private HttpServer webServer; private BlueMapAPIImpl api; @@ -192,7 +193,7 @@ public class Plugin implements ServerEventListener { } try { - webServer = new WebServer(routingRequestHandler); + webServer = new HttpServer(routingRequestHandler); webServer.bind(new InetSocketAddress( webserverConfig.resolveIp(), webserverConfig.getPort() @@ -581,7 +582,7 @@ public class Plugin implements ServerEventListener { return renderManager; } - public WebServer getWebServer() { + public HttpServer getWebServer() { return webServer; } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java index dcde43f0..41f734ef 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java @@ -28,7 +28,6 @@ import de.bluecolored.bluemap.common.web.http.HttpRequest; import de.bluecolored.bluemap.common.web.http.HttpRequestHandler; import de.bluecolored.bluemap.common.web.http.HttpResponse; import de.bluecolored.bluemap.common.web.http.HttpStatusCode; -import de.bluecolored.bluemap.core.BlueMap; import java.util.function.Supplier; @@ -43,7 +42,6 @@ public class JsonDataRequestHandler implements HttpRequestHandler { @Override public HttpResponse handle(HttpRequest request) { HttpResponse response = new HttpResponse(HttpStatusCode.OK); - response.addHeader("Server", "BlueMap v" + BlueMap.VERSION); response.addHeader("Cache-Control", "no-cache"); response.addHeader("Content-Type", "application/json"); response.setData(dataSupplier.get()); diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/WebServer.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/WebServer.java deleted file mode 100644 index fcfda292..00000000 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/WebServer.java +++ /dev/null @@ -1,23 +0,0 @@ -package de.bluecolored.bluemap.common.web; - -import de.bluecolored.bluemap.common.web.http.HttpConnection; -import de.bluecolored.bluemap.common.web.http.HttpRequestHandler; -import de.bluecolored.bluemap.common.web.http.SelectionConsumer; -import de.bluecolored.bluemap.common.web.http.Server; - -import java.io.IOException; - -public class WebServer extends Server { - - private final HttpRequestHandler requestHandler; - - public WebServer(HttpRequestHandler requestHandler) throws IOException { - this.requestHandler = requestHandler; - } - - @Override - public SelectionConsumer createConnectionHandler() { - return new HttpConnection(requestHandler); - } - -} diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java index 3a4a7ba8..769b8a61 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java @@ -9,11 +9,9 @@ import java.net.SocketAddress; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; -import java.util.concurrent.locks.ReentrantLock; public class HttpConnection implements SelectionConsumer { - private final ReentrantLock processingLock = new ReentrantLock(); private final HttpRequestHandler requestHandler; private HttpRequest request; private HttpResponse response; @@ -25,62 +23,56 @@ public class HttpConnection implements SelectionConsumer { @Override public void accept(SelectionKey selectionKey) { if (!selectionKey.isValid()) return; - if (!processingLock.tryLock()) return; + + SelectableChannel selChannel = selectionKey.channel(); + + if (!(selChannel instanceof SocketChannel)) return; + SocketChannel channel = (SocketChannel) selChannel; try { - SelectableChannel selChannel = selectionKey.channel(); - if (!(selChannel instanceof SocketChannel)) return; - SocketChannel channel = (SocketChannel) selChannel; + if (request == null) { + SocketAddress remote = channel.getRemoteAddress(); + InetAddress remoteInet = null; + if (remote instanceof InetSocketAddress) + remoteInet = ((InetSocketAddress) remote).getAddress(); - try { - - if (request == null) { - SocketAddress remote = channel.getRemoteAddress(); - InetAddress remoteInet = null; - if (remote instanceof InetSocketAddress) - remoteInet = ((InetSocketAddress) remote).getAddress(); - - request = new HttpRequest(remoteInet); - } - - // receive request - if (!request.write(channel)) { - if (!selectionKey.isValid()) return; - selectionKey.interestOps(SelectionKey.OP_READ); - return; - } - - // process request - if (response == null) { - this.response = requestHandler.handle(request); - } - - if (!selectionKey.isValid()) return; - - // send response - if (!response.read(channel)){ - selectionKey.interestOps(SelectionKey.OP_WRITE); - return; - } - - // reset to accept new request - request.clear(); - response.close(); - response = null; - selectionKey.interestOps(SelectionKey.OP_READ); - - } catch (IOException e) { - Logger.global.logDebug("Failed to process selection: " + e); - try { - channel.close(); - } catch (IOException e2) { - Logger.global.logWarning("Failed to close channel" + e2); - } + request = new HttpRequest(remoteInet); } - } finally { - processingLock.unlock(); + // receive request + if (!request.write(channel)) { + if (!selectionKey.isValid()) return; + selectionKey.interestOps(SelectionKey.OP_READ); + return; + } + + // process request + if (response == null) { + this.response = requestHandler.handle(request); + } + + if (!selectionKey.isValid()) return; + + // send response + if (!response.read(channel)){ + selectionKey.interestOps(SelectionKey.OP_WRITE); + return; + } + + // reset to accept new request + request.clear(); + response.close(); + response = null; + selectionKey.interestOps(SelectionKey.OP_READ); + + } catch (IOException e) { + Logger.global.logDebug("Failed to process selection: " + e); + try { + channel.close(); + } catch (IOException e2) { + Logger.global.logWarning("Failed to close channel" + e2); + } } } diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java new file mode 100644 index 00000000..9456f3ec --- /dev/null +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java @@ -0,0 +1,18 @@ +package de.bluecolored.bluemap.common.web.http; + +import java.io.IOException; + +public class HttpServer extends Server { + + private final HttpRequestHandler requestHandler; + + public HttpServer(HttpRequestHandler requestHandler) throws IOException { + this.requestHandler = requestHandler; + } + + @Override + public SelectionConsumer createConnectionHandler() { + return new HttpConnection(requestHandler); + } + +} diff --git a/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java b/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java index 57643ad8..4bcddf98 100644 --- a/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java +++ b/implementations/cli/src/main/java/de/bluecolored/bluemap/cli/BlueMapCLI.java @@ -40,6 +40,7 @@ import de.bluecolored.bluemap.common.serverinterface.ServerInterface; import de.bluecolored.bluemap.common.serverinterface.ServerWorld; import de.bluecolored.bluemap.common.web.*; import de.bluecolored.bluemap.common.web.http.HttpRequestHandler; +import de.bluecolored.bluemap.common.web.http.HttpServer; import de.bluecolored.bluemap.core.MinecraftVersion; import de.bluecolored.bluemap.core.logger.Logger; import de.bluecolored.bluemap.core.logger.LoggerLogger; @@ -202,7 +203,7 @@ public class BlueMapCLI implements ServerInterface { HttpRequestHandler handler = new BlueMapResponseModifier(routingRequestHandler); if (verbose) handler = new LoggingRequestHandler(handler); - WebServer webServer = new WebServer(handler); + HttpServer webServer = new HttpServer(handler); webServer.bind(new InetSocketAddress( config.resolveIp(), config.getPort()