diff --git a/pom.xml b/pom.xml index 5035e90..8259a2d 100644 --- a/pom.xml +++ b/pom.xml @@ -48,10 +48,14 @@ <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> + <dependency> + <groupId>io.undertow</groupId> + <artifactId>undertow-core</artifactId> + <version>2.2.22.Final</version> + </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> - <scope>test</scope> </dependency> </dependencies> @@ -83,7 +87,7 @@ <connection>scm:git:git://gittr.ch/java/labyrinth-server.git</connection> <developerConnection>scm:git:ssh://git@gittr.ch/java/labyrinth-server.git</developerConnection> <url>https://gittr.ch/java/labyrinth-server</url> - <tag>v0.0.1</tag> + <tag>HEAD</tag> </scm> <distributionManagement> <repository> diff --git a/src/main/java/ch/fritteli/labyrinth/server/Main.java b/src/main/java/ch/fritteli/labyrinth/server/Main.java index ced13bd..21e0d6c 100644 --- a/src/main/java/ch/fritteli/labyrinth/server/Main.java +++ b/src/main/java/ch/fritteli/labyrinth/server/Main.java @@ -1,11 +1,21 @@ package ch.fritteli.labyrinth.server; +import ch.fritteli.labyrinth.server.undertow_playground.UndertowPlayground; +import io.undertow.Undertow; import lombok.extern.slf4j.Slf4j; @Slf4j public class Main { public static void main(String[] args) { - LabyrinthServer.createAndStartServer() - .onEmpty(() -> log.error("Failed to create server. Stopping.")); +// LabyrinthServer.createAndStartServer() +// .onEmpty(() -> log.error("Failed to create server. Stopping.")); + + final ServerConfig config = ServerConfig.init(); + log.info("Starting Server at http://{}:{}/", config.getAddress().getHostAddress(), config.getPort()); + Undertow.builder() + .addHttpListener(config.getPort(), config.getAddress().getHostAddress()) + .setHandler(UndertowPlayground.r) + .build() + .start(); } } diff --git a/src/main/java/ch/fritteli/labyrinth/server/undertow_playground/UndertowPlayground.java b/src/main/java/ch/fritteli/labyrinth/server/undertow_playground/UndertowPlayground.java new file mode 100644 index 0000000..b64a343 --- /dev/null +++ b/src/main/java/ch/fritteli/labyrinth/server/undertow_playground/UndertowPlayground.java @@ -0,0 +1,78 @@ +package ch.fritteli.labyrinth.server.undertow_playground; + +import io.undertow.server.HttpHandler; +import io.undertow.server.HttpServerExchange; +import io.undertow.server.RoutingHandler; +import io.undertow.util.HeaderValues; +import io.undertow.util.Headers; +import io.undertow.util.HttpString; +import io.vavr.control.Option; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; + +import java.util.Deque; +import java.util.Map; + +@Slf4j +public class UndertowPlayground { + public static final RoutingHandler r = new RoutingHandler() + .get("/create/{output}", new HttpHandler() { + @Override + public void handleRequest(HttpServerExchange exchange) throws Exception { + if (exchange.isInIoThread()) { + exchange.dispatch(this); + return; + } + final Map<String, Deque<String>> queryParameters = exchange.getQueryParameters(); + final Option<String> output = getFirstOption(queryParameters, "output"); + final Option<Integer> width = getIntOption(queryParameters, "width"); + final Option<Integer> height = getIntOption(queryParameters, "height"); + final Option<Integer> id = getIntOption(queryParameters, "id"); + + log.info("Output: {}", output); + log.info("Width: {}", width); + log.info("Height: {}", height); + log.info("Id: {}", id); + exchange.getResponseSender().send( + "Output: " + output + + ", Width: " + width + + ", Height: " + height + + ", Id: " + id + ); + } + }) + .post("/render", new HttpHandler() { + @Override + public void handleRequest(final HttpServerExchange exchange) { + if (exchange.isInIoThread()) { + exchange.dispatch(this); + return; + } + exchange.getResponseSender().send("TODO: read body, render stuff"); + } + }) + .setFallbackHandler(new HttpHandler() { + @Override + public void handleRequest(HttpServerExchange exchange) throws Exception { + exchange.getResponseSender().send("Request: " + exchange.getRequestURI()); + final HeaderValues strings = exchange.getRequestHeaders().get(Headers.ACCEPT); + strings.peekFirst(); + } + } + ); + + @NonNull + private static Option<String> getFirstOption(@NonNull final Map<String, Deque<String>> queryParams, @NonNull final String paramName) { + return Option.of(queryParams.get(paramName)) + .map(Deque::peek) + .flatMap(Option::of); + } + + @NonNull + private static Option<Integer> getIntOption(@NonNull final Map<String, Deque<String>> queryParams, @NonNull final String paramName) { + return getFirstOption(queryParams, paramName) + .toTry() + .map(Integer::parseInt) + .toOption(); + } +}