LibJF/libjf-web-v0/src/main/java/io/gitlab/jfronny/libjf/web/impl/RequestHandler.java

54 lines
2.0 KiB
Java

package io.gitlab.jfronny.libjf.web.impl;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.web.api.AdvancedSubServer;
import io.gitlab.jfronny.libjf.web.api.ContentProvider;
import io.gitlab.jfronny.libjf.web.impl.util.WebPaths;
import io.gitlab.jfronny.libjf.web.impl.util.bluemapcore.*;
import java.util.*;
public class RequestHandler implements HttpRequestHandler {
public Map<String, AdvancedSubServer> subServers = new HashMap<>();
public Map<String, ContentProvider> contentProviders = new HashMap<>();
@Override
public HttpResponse handle(HttpRequest request) {
HttpResponse resp = null;
try {
String webPath = WebPaths.simplify(request.getPath());
if (webPath.length() == 0)
webPath = "index.html";
if (contentProviders.containsKey(webPath)) {
resp = contentProviders.get(webPath).handle(request);
}
else {
String[] segments = webPath.split("/");
for (int i = segments.length - 1; i >= 0; i--) {
String wp = WebPaths.concat(Arrays.copyOfRange(segments, 0, i));
if (subServers.containsKey(wp)) {
resp = subServers.get(wp).handle(request, Arrays.copyOfRange(segments, i, segments.length));
break;
}
}
if (resp == null) {
resp = new HttpResponse(HttpStatusCode.NOT_FOUND);
}
}
} catch (Throwable e) {
LibJf.LOGGER.error("Caught error while sending", e);
resp = new HttpResponse(HttpStatusCode.INTERNAL_SERVER_ERROR);
}
if (resp.getHeader("Cache-Control").size() == 0)
resp.addHeader("Cache-Control", "no-cache");
if (resp.getHeader("Server").size() == 0)
resp.addHeader("Server", "LibWeb using BlueMapCore");
return resp;
}
public void clear() {
subServers.clear();
contentProviders.clear();
}
}