WorkerController.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. using Microsoft.AspNetCore.Mvc;
  2. using XZ.NET;
  3. using static CompServ.CompServConst;
  4. namespace CompServ.Worker
  5. {
  6. [ApiController]
  7. public class WorkerController : ControllerBase
  8. {
  9. [HttpGet]
  10. [Route(ApiPathWorkerRootForCheckAlive)]
  11. public async Task<ActionResult> CheckAlive() => await Task.FromResult(Content(AliveMessageWorker));
  12. [HttpPost]
  13. [Route(ApiPathWorkerCompress)]
  14. public async Task<ActionResult> Compress()
  15. {
  16. Interlocked.Increment(ref StatusHolder.RequestIn);
  17. try
  18. {
  19. var req = await HttpContext.Request.ExtractCompressRequestAsync();
  20. Interlocked.Add(ref StatusHolder.BytesIn, req.DataToCompress.Count);
  21. var msOutput = new MemoryStream();
  22. var xz = new XZOutputStream(msOutput, req.Threads, (uint)req.Level, true);
  23. await xz.WriteAsync(req.DataToCompress);
  24. xz.Close();
  25. Interlocked.Add(ref StatusHolder.BytesOut, msOutput.Length);
  26. msOutput.Position = 0;
  27. var fileStreamResult = File(msOutput, "compressed/xz");
  28. Interlocked.Increment(ref StatusHolder.RequestSuccess);
  29. return fileStreamResult;
  30. }
  31. finally
  32. {
  33. Interlocked.Increment(ref StatusHolder.RequestOut);
  34. }
  35. }
  36. [HttpPost]
  37. [Route(ApiPathWorkerDecompress)]
  38. public async Task<ActionResult> Decompress()
  39. {
  40. Interlocked.Increment(ref StatusHolder.RequestIn);
  41. try
  42. {
  43. var msInput = HttpContext.Request.ContentLength.HasValue
  44. ? new MemoryStream((int)HttpContext.Request.ContentLength.Value)
  45. : new MemoryStream();
  46. await HttpContext.Request.Body.CopyToAsync(msInput);
  47. msInput.Position = 0;
  48. var xz = new XZInputStream(msInput);
  49. var msOutput = new MemoryStream();
  50. await xz.CopyToAsync(msOutput);
  51. xz.Close();
  52. msOutput.Position = 0;
  53. var fileStreamResult = File(msOutput, "binary/data");
  54. Interlocked.Increment(ref StatusHolder.RequestSuccess);
  55. return fileStreamResult;
  56. }
  57. finally
  58. {
  59. Interlocked.Increment(ref StatusHolder.RequestOut);
  60. }
  61. }
  62. }
  63. }