feature/undertow #4
3 changed files with 96 additions and 4 deletions
8
pom.xml
8
pom.xml
|
@ -48,10 +48,14 @@
|
||||||
<artifactId>logback-classic</artifactId>
|
<artifactId>logback-classic</artifactId>
|
||||||
<version>${logback.version}</version>
|
<version>${logback.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.undertow</groupId>
|
||||||
|
<artifactId>undertow-core</artifactId>
|
||||||
|
<version>2.2.22.Final</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.junit.jupiter</groupId>
|
<groupId>org.junit.jupiter</groupId>
|
||||||
<artifactId>junit-jupiter-api</artifactId>
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
<scope>test</scope>
|
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
@ -83,7 +87,7 @@
|
||||||
<connection>scm:git:git://gittr.ch/java/labyrinth-server.git</connection>
|
<connection>scm:git:git://gittr.ch/java/labyrinth-server.git</connection>
|
||||||
<developerConnection>scm:git:ssh://git@gittr.ch/java/labyrinth-server.git</developerConnection>
|
<developerConnection>scm:git:ssh://git@gittr.ch/java/labyrinth-server.git</developerConnection>
|
||||||
<url>https://gittr.ch/java/labyrinth-server</url>
|
<url>https://gittr.ch/java/labyrinth-server</url>
|
||||||
<tag>v0.0.1</tag>
|
<tag>HEAD</tag>
|
||||||
</scm>
|
</scm>
|
||||||
<distributionManagement>
|
<distributionManagement>
|
||||||
<repository>
|
<repository>
|
||||||
|
|
|
@ -1,11 +1,21 @@
|
||||||
package ch.fritteli.labyrinth.server;
|
package ch.fritteli.labyrinth.server;
|
||||||
|
|
||||||
|
import ch.fritteli.labyrinth.server.undertow_playground.UndertowPlayground;
|
||||||
|
import io.undertow.Undertow;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
LabyrinthServer.createAndStartServer()
|
// LabyrinthServer.createAndStartServer()
|
||||||
.onEmpty(() -> log.error("Failed to create server. Stopping."));
|
// .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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue