You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

110 lines
3.4 KiB

3 years ago
  1. using Apewer.Network;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text;
  6. namespace Apewer.Web
  7. {
  8. /// <summary></summary>
  9. public sealed class MiniProvider : ApiProvider
  10. {
  11. MiniConnection connection;
  12. MiniContext context;
  13. MiniRequest request;
  14. MiniResponse response;
  15. /// <summary>创建服务程序实例。</summary>
  16. /// <exception cref="ArgumentNullException"></exception>
  17. public MiniProvider(MiniContext context)
  18. {
  19. if (context == null) throw new ArgumentNullException(nameof(context));
  20. this.context = context;
  21. connection = context.Connection;
  22. request = context.Request;
  23. response = context.Response;
  24. }
  25. /// <summary>发送完毕后执行。</summary>
  26. public override void Sent() => connection.Close();
  27. /// <summary>结束本次请求和响应。</summary>
  28. public override void End() => connection.Close(true);
  29. /// <summary>释放非托管资源。</summary>
  30. public override void Dispose() => connection.Close(true);
  31. #region request
  32. /// <summary></summary>
  33. public override string GetClientIP() => connection.RemoteEndPoint.Address.ToString();
  34. /// <summary></summary>
  35. public override long GetContentLength() => request.ContentLength;
  36. /// <summary></summary>
  37. public override string GetContentType() => request.Headers.GetValue("Content-Type", true);
  38. /// <summary></summary>
  39. public override StringPairs GetHeaders() => request.Headers;
  40. /// <summary></summary>
  41. public override HttpMethod GetMethod() => NetworkUtility.ParseHttpMethod(request.Method);
  42. /// <summary></summary>
  43. public override string GetReferrer() => request.Headers.GetValue("Referrer", true);
  44. /// <summary></summary>
  45. public override Uri GetUrl() => request.Url;
  46. /// <summary></summary>
  47. public override Stream RequestBody() => request.Body;
  48. #endregion
  49. #region response
  50. /// <summary></summary>
  51. public override void SetCache(int seconds)
  52. {
  53. if (seconds > 0)
  54. {
  55. SetHeader("Cache-Control", $"public, max-age={seconds}, s-maxage={seconds}");
  56. return;
  57. }
  58. SetHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  59. SetHeader("Pragma", "no-cache");
  60. }
  61. /// <summary></summary>
  62. public override void SetContentLength(long value) => response.ContentLength = value;
  63. /// <summary></summary>
  64. public override void SetContentType(string value) => response.ContentType = value;
  65. /// <summary></summary>
  66. public override string SetHeader(string name, string value) => response.Headers[name] = value;
  67. /// <summary></summary>
  68. public override void SetRedirect(string location)
  69. {
  70. if (string.IsNullOrEmpty(location)) location = "/";
  71. response.Status = 302;
  72. response.Location = location;
  73. response.Close();
  74. }
  75. /// <summary></summary>
  76. public override void SetStatus(int status, int subStatus = 0) => response.Status = status;
  77. /// <summary></summary>
  78. public override Stream ResponseBody() => response.Body;
  79. #endregion
  80. }
  81. }