This repository has been archived on 2024-05-08. You can view files and clone it, but cannot push or open issues or pull requests.

71 lines
3.2 KiB
Java

package ru.redguy.webinfomod;
import fi.iki.elonen.NanoHTTPD;
import org.apache.commons.io.IOUtils;
import org.reflections.Reflections;
import org.reflections.scanners.FieldAnnotationsScanner;
import org.reflections.scanners.MethodAnnotationsScanner;
import org.reflections.scanners.MethodParameterScanner;
import org.reflections.scanners.TypeAnnotationsScanner;
import org.reflections.util.ClasspathHelper;
import org.reflections.util.ConfigurationBuilder;
import org.reflections.util.FilterBuilder;
import ru.redguy.webinfomod.langs.Localization;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.nio.charset.StandardCharsets;
public class WebServer extends NanoHTTPD {
Config config;
Reflections reflections;
public WebServer(int port, Config config) throws IOException {
super(port);
ConfigurationBuilder configBuilder =
new ConfigurationBuilder()
.filterInputsBy(new FilterBuilder().includePackage("ru.redguy.webinfomod.pages"))
.setUrls(ClasspathHelper.forPackage("ru.redguy.webinfomod.pages"))
.setScanners(
new TypeAnnotationsScanner(),
new MethodParameterScanner(),
new MethodAnnotationsScanner(),
new FieldAnnotationsScanner()
);
this.reflections = new Reflections(configBuilder);
start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
this.config = config;
}
@Override
public Response serve(IHTTPSession session) {
if(session.getUri().startsWith("/css/")||session.getUri().startsWith("/js/")) {
String path = "/resources/web"+session.getUri();
try {
//TODO: 400 код при авторизоавном доступе
return newFixedLengthResponse(Response.Status.OK,session.getUri().startsWith("/css/") ? "text/css" : "application/javascript", IOUtils.toString(WebServer.class.getResourceAsStream(path), StandardCharsets.UTF_8));
} catch (IOException ignored) {
}
} else {
for (Class<?> mClass : reflections.getTypesAnnotatedWith(WebPage.class, true)) {
if (session.getUri().equals(mClass.getAnnotation(WebPage.class).url()) || session.getUri().equals(mClass.getAnnotation(WebPage.class).url()+"/")) {
try {
return (Response) mClass.getMethod("getPage", Config.class, IHTTPSession.class).invoke(mClass.newInstance(), config, session);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
}
return newFixedLengthResponse(Response.Status.NOT_FOUND,"text/plain","Not Founded!");
}
}