package com.acdp.transceivr; import java.net.http.HttpClient; import java.nio.file.Paths; import java.util.concurrent.ConcurrentHashMap; import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import io.undertow.Handlers; import io.undertow.Undertow; import io.undertow.server.HttpHandler; import io.undertow.server.HttpServerExchange; import io.undertow.server.handlers.resource.PathResourceManager; import io.undertow.util.Headers; import org.slf4j.LoggerFactory; import static io.undertow.Handlers.resource; public class WebServer { private final static org.slf4j.Logger logger = LoggerFactory.getLogger(WebServer.class); private final int port; private Undertow server; private HttpClient client; private int nextID=1; private ConcurrentHashMap uploads=new ConcurrentHashMap(); public WebServer(int port, boolean debug) { this.port = port; client= HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.NORMAL) .build(); } public void start() { Undertow.Builder builder = Undertow.builder(); builder.addHttpListener(port, "0.0.0.0"); builder.setHandler(Handlers.routing() .post("/xfer", new HttpHandler() { @Override public void handleRequest(HttpServerExchange ex) throws Exception { if(!dispatch(ex,this)) return; JsonObject value = Json.parse(new String(ex.getInputStream().readAllBytes())).asObject(); Transfer t=new Transfer(nextID++); t.from=value.get("from").asString(); t.to=value.get("to").asString(); LoadTools.startTransfer(t); uploads.put(t.id, t); ex.getResponseSender().send("OK: "+t.id); } }) .get("/status", new HttpHandler() { @Override public void handleRequest(HttpServerExchange ex) throws Exception { if (!dispatch(ex, this)) return; JsonArray ja=new JsonArray(); for(Transfer t:uploads.values()) { ja.add(t.toJSON()); } ex.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json"); ex.getResponseSender().send(ja.toString()); }}) .get("/*", resource(new PathResourceManager(Paths.get("webroot"), 100)) .setDirectoryListingEnabled(true)) ); server = builder.build(); server.start(); } private boolean dispatch(HttpServerExchange ex, HttpHandler handler) { if (ex.isInIoThread()) { ex.dispatch(handler); return false; } ex.startBlocking(); return true; } }