WebServer.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package com.acdp.transceivr;
  2. import com.eclipsesource.json.JsonArray;
  3. import info.faljse.SDNotify.SDNotify;
  4. import org.slf4j.LoggerFactory;
  5. import java.util.Iterator;
  6. import java.util.Map;
  7. import java.util.Timer;
  8. import java.util.TimerTask;
  9. import java.util.concurrent.ConcurrentHashMap;
  10. import static spark.Spark.*;
  11. public class WebServer {
  12. private final static org.slf4j.Logger logger = LoggerFactory.getLogger(WebServer.class);
  13. private final Params params;
  14. private int nextID = 1;
  15. private ConcurrentHashMap<Integer, Transfer> uploads = new ConcurrentHashMap<>();
  16. private Timer t=new Timer("cleanup",true);
  17. private final static int BS=2014;
  18. public WebServer(Params params) {
  19. this.params = params;
  20. }
  21. public void start() {
  22. port(params.port);
  23. if(!params.webroot.isEmpty())
  24. staticFileLocation(params.webroot);
  25. else
  26. staticFiles.location("/webroot");
  27. get("/zero", (req, res) -> {
  28. var os = res.raw().getOutputStream();
  29. var ba = new byte[BS];
  30. var lengthParam=req.queryParams("length");
  31. if(lengthParam!=null) {
  32. res.header("Content-Length",lengthParam);
  33. int length=Integer.parseInt(lengthParam);
  34. for(;length>BS;length-=BS)
  35. os.write(ba);
  36. os.write(ba,0,length);
  37. }
  38. else {
  39. while (true)
  40. os.write(ba);
  41. }
  42. return "";
  43. });
  44. post("/null", (req, res) -> {
  45. var is = req.raw().getInputStream();
  46. var ba = new byte[BS];
  47. while (is.read(ba)!=-1);
  48. res.status(200);
  49. return "";
  50. });
  51. put("/null", (req, res) -> {
  52. var is = req.raw().getInputStream();
  53. var ba = new byte[BS];
  54. while (is.read(ba)!=-1);
  55. res.status(200);
  56. return "";
  57. });
  58. post("/cancel", (req, res) -> {
  59. int id = Integer.parseInt(req.queryParams("id"));
  60. var t = uploads.get(id);
  61. t.canceled = true;
  62. t.call.cancel();
  63. res.status(200);
  64. return "OK";
  65. });
  66. get("/status", (req, res) -> {
  67. JsonArray ja = new JsonArray();
  68. for (Transfer t : uploads.values())
  69. ja.add(t.toJSON());
  70. res.header("Content-Type", "application/json");
  71. return ja.toString();
  72. });
  73. post("/xfer", (req, res) -> {
  74. try {
  75. Transfer t = new Transfer(nextID++);
  76. t.from = req.queryParams("from");
  77. t.to = req.queryParams("to");
  78. t.toMethod=req.queryParamOrDefault("toMethod","POST");
  79. t.cpeeCallback = req.headers("CPEE-CALLBACK");
  80. t.cpeeCallbackId = req.headers("CPEE-CALLBACK-ID");
  81. t.cpeeInstanceURL = req.headers("CPEE-INSTANCE-URL");
  82. if (Boolean.valueOf(req.queryParams("callback"))) {
  83. res.header("CPEE-CALLBACK", "true");
  84. t.doCpeeCallback = true;
  85. }
  86. LoadTools.startTransfer(t);
  87. uploads.put(t.id, t);
  88. res.status(200);
  89. return "OK: " + t.id;
  90. } catch (Exception e) {
  91. return "FAILED: " + e.toString();
  92. }
  93. });
  94. awaitInitialization();
  95. t.scheduleAtFixedRate(new TimerTask() {
  96. @Override
  97. public void run() {
  98. for (var i = uploads.entrySet().iterator(); i.hasNext();) {
  99. var e = i.next();
  100. if(e.getValue().finished&&(e.getValue().finishedAT+30000<System.currentTimeMillis())){
  101. i.remove();
  102. logger.info("Removed finished transfer {}", e.getValue().id);
  103. }
  104. }
  105. }
  106. },1000,1000);
  107. SDNotify.sendNotify(); //notify: ready
  108. logger.info("Running");
  109. }
  110. }