WebServer.java 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package com.acdp.transceivr;
  2. import java.net.http.HttpClient;
  3. import java.nio.charset.StandardCharsets;
  4. import java.util.concurrent.ConcurrentHashMap;
  5. import com.eclipsesource.json.Json;
  6. import com.eclipsesource.json.JsonArray;
  7. import com.eclipsesource.json.JsonObject;
  8. import io.undertow.Handlers;
  9. import io.undertow.Undertow;
  10. import io.undertow.server.HttpHandler;
  11. import io.undertow.server.HttpServerExchange;
  12. import io.undertow.server.handlers.BlockingHandler;
  13. import io.undertow.server.handlers.form.EagerFormParsingHandler;
  14. import io.undertow.server.handlers.form.FormDataParser;
  15. import io.undertow.server.handlers.resource.ClassPathResourceManager;
  16. import io.undertow.server.handlers.resource.PathResourceManager;
  17. import io.undertow.util.Headers;
  18. import org.slf4j.LoggerFactory;
  19. import static io.undertow.Handlers.resource;
  20. public class WebServer {
  21. private final static org.slf4j.Logger logger = LoggerFactory.getLogger(WebServer.class);
  22. private final int port;
  23. private Undertow server;
  24. private int nextID=1;
  25. private ConcurrentHashMap<Integer, Transfer> uploads=new ConcurrentHashMap();
  26. public WebServer(int port, boolean debug) {
  27. this.port = port;
  28. }
  29. public void start() {
  30. Undertow.Builder builder = Undertow.builder();
  31. builder.addHttpListener(port, "0.0.0.0");
  32. builder.setHandler(Handlers.routing()
  33. .post("/xfer", new BlockingHandler(new EagerFormParsingHandler(ex -> {
  34. // var qParams=ex.getQueryParameters();
  35. var pParams=ex.getAttachment(FormDataParser.FORM_DATA);
  36. Transfer t=new Transfer(nextID++);
  37. t.from=pParams.getFirst("from").getValue();
  38. t.to=pParams.getFirst("to").getValue();
  39. LoadTools.startTransfer(t);
  40. uploads.put(t.id, t);
  41. ex.getResponseSender().send("OK: "+t.id);
  42. })))
  43. .get("/zero",new HttpHandler() {
  44. @Override
  45. public void handleRequest(HttpServerExchange ex) throws Exception {
  46. if(!dispatch(ex,this)) return;
  47. ex.startBlocking();
  48. var ba=new byte[1024];
  49. while(true)
  50. ex.getOutputStream().write(ba);
  51. }
  52. })
  53. .post("/null",new BlockingHandler (ex -> {
  54. var ba=new byte[1024];
  55. while(true) {
  56. ex.getInputStream().read(ba);
  57. }
  58. }))
  59. .get("/status", ex -> {
  60. JsonArray ja=new JsonArray();
  61. for(Transfer t:uploads.values())
  62. ja.add(t.toJSON());
  63. ex.getResponseHeaders().put(Headers.CONTENT_TYPE, "application/json");
  64. ex.getResponseSender().send(ja.toString());
  65. })
  66. .get("/*", resource(new ClassPathResourceManager(getClass().getClassLoader(),"webroot" ))
  67. .setDirectoryListingEnabled(true))
  68. // .get("/*", resource(new PathResourceManager(Paths.get("webroot"), 100))
  69. // .setDirectoryListingEnabled(true))
  70. );
  71. server = builder.build();
  72. server.start();
  73. }
  74. private boolean dispatch(HttpServerExchange ex, HttpHandler handler) {
  75. if (ex.isInIoThread()) {
  76. ex.dispatch(handler);
  77. return false;
  78. }
  79. ex.startBlocking();
  80. return true;
  81. }
  82. }