add FileServer, fix an issue in style

This commit is contained in:
Daniella / Tove 2022-07-07 11:31:01 +02:00
parent 9959d33290
commit 8eca83854d
4 changed files with 83 additions and 2 deletions

View file

@ -54,7 +54,12 @@ public class RequestCatcherConfig {
}) })
.compose((resp, res, rej) -> { .compose((resp, res, rej) -> {
try { try {
if(resp.getConstructors()[0].getParameterCount() == 1) {
res.call((IRequestCatcher) resp.getConstructors()[0].newInstance(this.configHolder));
}
else {
res.call(resp.newInstance()); res.call(resp.newInstance());
}
} catch (Exception e) { } catch (Exception e) {
rej.call(new ProjectException("Main class of RequestCatcher is not instantiable (" + getName().err(rej).ok().await() + ")", e)); rej.call(new ProjectException("Main class of RequestCatcher is not instantiable (" + getName().err(rej).ok().await() + ")", e));
} }

View file

@ -0,0 +1,73 @@
package de.tudbut.tryumph.example;
import java.net.Socket;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import de.tudbut.async.Callback;
import de.tudbut.async.ComposeCallback;
import de.tudbut.async.TaskCallable;
import de.tudbut.tryumph.config.IRequestCatcher;
import de.tudbut.tryumph.events.GET;
import de.tudbut.tryumph.events.POST;
import de.tudbut.tryumph.events.Path;
import de.tudbut.tryumph.events.RequestHandler;
import de.tudbut.tryumph.server.HTMLParsing;
import de.tudbut.tryumph.server.Request;
import de.tudbut.tryumph.server.Response;
import tudbut.parsing.TCN;
public class FileServer implements IRequestCatcher, RequestHandler.Listener {
RequestHandler listener = new RequestHandler(this);
TCN data;
public FileServer(TCN data) {
this.data = data;
}
@Override
public TaskCallable<ComposeCallback<Request, Response>> onConnect(Socket socket) {
return (tres, trej) -> tres.call((resp, res, rej) -> {
listener.handle(resp, r -> {
if(r.isHTML) {
Document html = r.getHTML();
Element element;
element = html.createElement("meta");
element.setAttribute("name", "viewport");
element.setAttribute("content", "width=device-width height=device-height");
html.getElementsByTagName("head").item(0).appendChild(element);
element = html.createElement("link");
element.setAttribute("rel", "stylesheet");
element.setAttribute("href", "/style.css");
html.getElementsByTagName("head").item(0).appendChild(element);
r.updateHTMLData();
}
res.call(r);
}, rej);
if(!resp.hasResponse()) {
res.call(new Response(resp, "<h1>Error: 404 Not found " + resp.realPath + "</h1>", 404, "Not Found"));
}
});
}
@GET
@Path("/style.css")
public void style(Request request, Callback<Response> res, Callback<Throwable> rej) {
res.call(new Response(request, request.context.file("style.css"), 200, "OK", "text/css"));
}
@GET
@Path("/.*")
public void onIndex(Request request, Callback<Response> res, Callback<Throwable> rej) {
res.call(new Response(request, request.context.file("." + request.path.replace("..", "")), 200, "OK"));
}
@Override
public void handleError(Request request, Throwable error, Callback<Response> res, Callback<Throwable> rej) {
rej.call(error);
}
}

View file

@ -2,6 +2,7 @@ package de.tudbut.tryumph.server;
import static de.tudbut.async.Async.*; import static de.tudbut.async.Async.*;
import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.HashMap; import java.util.HashMap;
@ -127,6 +128,8 @@ public class BrowserContext {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
try { try {
InputStream stream = requestCatcher.getClass().getClassLoader().getResourceAsStream(file); InputStream stream = requestCatcher.getClass().getClassLoader().getResourceAsStream(file);
if(stream == null)
stream = new FileInputStream(file);
int i = 0; int i = 0;
while((i = stream.read()) != -1) { while((i = stream.read()) != -1) {

View file

@ -6,5 +6,5 @@ center {
margin: auto; margin: auto;
display: block; display: block;
max-width: 700px; max-width: 700px;
word-break: break-all; word-wrap: break-word;
} }