package com.acdp.transceivr; import java.net.http.HttpClient; import java.nio.charset.StandardCharsets; 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.BlockingHandler; import io.undertow.server.handlers.form.EagerFormParsingHandler; import io.undertow.server.handlers.form.FormDataParser; import io.undertow.server.handlers.resource.ClassPathResourceManager; 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 int nextID=1; private ConcurrentHashMap uploads=new ConcurrentHashMap(); public WebServer(int port, boolean debug) { this.port = port; } public void start() { Undertow.Builder builder = Undertow.builder(); builder.addHttpListener(port, "0.0.0.0"); builder.setHandler(Handlers.routing() .post("/xfer", new BlockingHandler(new EagerFormParsingHandler(ex -> { // var qParams=ex.getQueryParameters(); var pParams=ex.getAttachment(FormDataParser.FORM_DATA); Transfer t=new Transfer(nextID++); t.from=pParams.getFirst("from").getValue(); t.to=pParams.getFirst("to").getValue(); LoadTools.startTransfer(t); uploads.put(t.id, t); ex.getResponseSender().send("OK: "+t.id); }))) .get("/zero",new HttpHandler() { @Override public void handleRequest(HttpServerExchange ex) throws Exception { if(!dispatch(ex,this)) return; ex.startBlocking(); var ba=new byte[1024]; while(true) ex.getOutputStream().write(ba); } }) .post("/null",new BlockingHandler (ex -> { var ba=new byte[1024]; while(true) { ex.getInputStream().read(ba); } })) .get("/status", ex -> { 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 ClassPathResourceManager(getClass().getClassLoader(),"webroot" )) .setDirectoryListingEnabled(true)) // .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; } }