61 lines
2.4 KiB
Java
61 lines
2.4 KiB
Java
package ch.fritteli.maze.server.handler;
|
|
|
|
import ch.fritteli.maze.generator.model.Maze;
|
|
import ch.fritteli.maze.generator.serialization.v1.SerializerDeserializerV1;
|
|
import ch.fritteli.maze.server.OutputType;
|
|
import io.undertow.server.HttpServerExchange;
|
|
import io.undertow.util.HeaderValues;
|
|
import io.undertow.util.Headers;
|
|
import io.undertow.util.StatusCodes;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
@Slf4j
|
|
public class RenderV1Handler extends AbstractHttpHandler {
|
|
|
|
public static final String PATH_TEMPLATE = "/render/v1/{output}";
|
|
|
|
@Override
|
|
public void handle(@NotNull final HttpServerExchange exchange) {
|
|
log.debug("Handling render request");
|
|
|
|
if (exchange.isInIoThread()) {
|
|
exchange.dispatch(this);
|
|
return;
|
|
}
|
|
exchange.getRequestReceiver().receiveFullBytes((httpServerExchange, bytes) -> {
|
|
final OutputType output = this.getOutputType(httpServerExchange);
|
|
final byte[] render;
|
|
try {
|
|
final Maze maze = SerializerDeserializerV1.deserialize(bytes);
|
|
render = output.render(maze);
|
|
} catch (final Exception e) {
|
|
log.error("Error rendering binary maze data", e);
|
|
httpServerExchange.setStatusCode(StatusCodes.INTERNAL_SERVER_ERROR)
|
|
.getResponseSender()
|
|
.send("Error rendering maze: %s".formatted(e.getMessage()));
|
|
return;
|
|
}
|
|
httpServerExchange
|
|
.setStatusCode(StatusCodes.OK)
|
|
.getResponseHeaders()
|
|
.put(Headers.CONTENT_TYPE, output.getContentType());
|
|
httpServerExchange.getResponseSender()
|
|
.send(ByteBuffer.wrap(render));
|
|
});
|
|
}
|
|
|
|
@NotNull
|
|
private OutputType getOutputType(@NotNull final HttpServerExchange httpServerExchange) {
|
|
return RequestParameter.OUTPUT.<OutputType>getParameterValue(httpServerExchange.getQueryParameters())
|
|
.getOrElse(() -> {
|
|
final HeaderValues accept = httpServerExchange.getRequestHeaders().get(Headers.ACCEPT);
|
|
if (accept.contains(OutputType.HTML.getContentType())) {
|
|
return OutputType.HTML;
|
|
}
|
|
return OutputType.TEXT_PLAIN;
|
|
});
|
|
}
|
|
}
|