From fbe3d0b78cc278210fc2cb839217fde23817ebb0 Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Thu, 13 Jun 2024 17:49:06 +0200 Subject: [PATCH] Added content-type handling. --- .../java/com/jessebrault/site/JbHandler.java | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/server/java/com/jessebrault/site/JbHandler.java b/src/server/java/com/jessebrault/site/JbHandler.java index 652ad30..09304c7 100644 --- a/src/server/java/com/jessebrault/site/JbHandler.java +++ b/src/server/java/com/jessebrault/site/JbHandler.java @@ -1,5 +1,6 @@ package com.jessebrault.site; +import org.eclipse.jetty.http.HttpHeader; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.Response; @@ -13,13 +14,23 @@ import java.util.regex.Pattern; public final class JbHandler extends Handler.Abstract { - private static final Pattern extensionPattern = Pattern.compile(".*\\..+$"); + private static final Pattern hasExtensionPattern = Pattern.compile(".*\\..+$"); + private static final Pattern getExtensionPattern = Pattern.compile(".*(\\..+)$"); private static boolean hasExtension(String path) { - final var m = extensionPattern.matcher(path); + final var m = hasExtensionPattern.matcher(path); return m.matches(); } + private static String getExtension(Path resolved) { + final var m = getExtensionPattern.matcher(resolved.toString()); + if (m.matches()) { + return m.group(1); + } else { + throw new IllegalArgumentException("Could not determine extension for: " + resolved); + } + } + private final Set bases; public JbHandler(Set bases) { @@ -48,6 +59,15 @@ public final class JbHandler extends Handler.Abstract { for (final Path base : this.bases) { final Path resolved = base.resolve(relative); if (Files.exists(resolved)) { + final var contentType = switch (getExtension(resolved)) { + case ".html" -> "text/html"; + case ".js" -> "text/javascript"; + case ".css" -> "text/css"; + case ".png" -> "image/png"; + case ".ico" -> "image/vnd.microsoft.icon"; + default -> "text/plain"; + }; + response.getHeaders().add(HttpHeader.CONTENT_TYPE, contentType); try (final var inputStream = Files.newInputStream(resolved)) { final ByteBuffer byteBuffer = ByteBuffer.wrap(inputStream.readAllBytes()); response.write(true, byteBuffer, callback);