VHostRedirect.cs 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text.RegularExpressions;
  4. namespace System.Net.ApiService.VHost_Server {
  5. public class VHostRedirect {
  6. private string _redirectHost = "localhost";
  7. private ushort _redirectPort = 8080;
  8. private List<VHostRedirectCondition> _conditions = new List<VHostRedirectCondition>();
  9. public VHostRedirect(string redirect) {
  10. if(redirect.Contains(':')) {
  11. string[] r = redirect.Split(':');
  12. this._redirectHost = r[0];
  13. if (!ushort.TryParse(r[1], out this._redirectPort))
  14. this._redirectPort = 8080;
  15. if (String.IsNullOrEmpty(this._redirectHost))
  16. this._redirectHost = "localhost";
  17. }
  18. }
  19. public VHostRedirect(string redirect, VHostRedirectCondition Condition) {
  20. if (redirect.Contains(':')) {
  21. string[] r = redirect.Split(':');
  22. this._redirectHost = r[0];
  23. if (!ushort.TryParse(r[1], out this._redirectPort))
  24. this._redirectPort = 8080;
  25. if (String.IsNullOrEmpty(this._redirectHost))
  26. this._redirectHost = "localhost";
  27. }
  28. this.Conditions.Add(Condition);
  29. }
  30. public VHostRedirect(string redirect, VHostRedirectCondition[] Conditions) {
  31. if (redirect.Contains(':')) {
  32. string[] r = redirect.Split(':');
  33. this._redirectHost = r[0];
  34. if (!ushort.TryParse(r[1], out this._redirectPort))
  35. this._redirectPort = 8080;
  36. if (String.IsNullOrEmpty(this._redirectHost))
  37. this._redirectHost = "localhost";
  38. }
  39. this.Conditions.AddRange(Conditions);
  40. }
  41. public VHostRedirect(ushort redirectPort, VHostRedirectCondition Condition) {
  42. this._redirectPort = redirectPort;
  43. this.Conditions.Add(Condition);
  44. }
  45. public VHostRedirect(ushort redirectPort, VHostRedirectCondition[] Conditions) {
  46. this._redirectPort = redirectPort;
  47. this.Conditions.AddRange(Conditions);
  48. }
  49. public VHostRedirect(ushort redirectPort) {
  50. this._redirectPort = redirectPort;
  51. }
  52. public VHostRedirect(string redirectHost, ushort redirectPort) {
  53. this._redirectHost = redirectHost;
  54. this._redirectPort = redirectPort;
  55. if (String.IsNullOrEmpty(this._redirectHost))
  56. this._redirectHost = "localhost";
  57. }
  58. public VHostRedirect(string redirectHost, ushort redirectPort, VHostRedirectCondition Condition) {
  59. this._redirectHost = redirectHost;
  60. this._redirectPort = redirectPort;
  61. if (String.IsNullOrEmpty(this._redirectHost))
  62. this._redirectHost = "localhost";
  63. this.Conditions.Add(Condition);
  64. }
  65. public VHostRedirect(string redirectHost, ushort redirectPort, VHostRedirectCondition[] Conditions) {
  66. this._redirectHost = redirectHost;
  67. this._redirectPort = redirectPort;
  68. if (String.IsNullOrEmpty(this._redirectHost))
  69. this._redirectHost = "localhost";
  70. this.Conditions.AddRange(Conditions);
  71. }
  72. public List<VHostRedirectCondition> Conditions => this._conditions;
  73. public string RedirectHost => this._redirectHost;
  74. public ushort RedirectPort => this._redirectPort;
  75. public bool IsMatch(RequestHeader request) {
  76. foreach(VHostRedirectCondition cond in this._conditions) {
  77. if (cond.Active) {
  78. if (cond.HeaderVariable == VHostRedirectCondition.eVaraible.Host) {
  79. if (request.Host == null) {
  80. System.Diagnostics.Debug.WriteLine(" - Header Condition: NULL match " + cond.HeaderValue + " = False");
  81. return false;
  82. } else {
  83. bool bIsMatch = Regex.IsMatch(request.Host, cond.HeaderValue);
  84. System.Diagnostics.Debug.WriteLine(" - Header Condition: " + request.Host + " match " + cond.HeaderValue + " = " + (bIsMatch ? "True" : "False"));
  85. if (cond.ConditionType == VHostRedirectCondition.eCondition.Must && bIsMatch == false)
  86. return false;
  87. if (cond.ConditionType == VHostRedirectCondition.eCondition.MustNot && bIsMatch == true)
  88. return false;
  89. }
  90. }
  91. else if (cond.HeaderVariable == VHostRedirectCondition.eVaraible.Method) {
  92. bool bIsMatch = (cond.HeaderValue.ToLower().Trim() == "connect" && (request.Method | HttpMethod.CONNECT) == request.Method) ||
  93. (cond.HeaderValue.ToLower().Trim() == "delete" && (request.Method | HttpMethod.DELETE) == request.Method) ||
  94. (cond.HeaderValue.ToLower().Trim() == "get" && (request.Method | HttpMethod.GET) == request.Method) ||
  95. (cond.HeaderValue.ToLower().Trim() == "options" && (request.Method | HttpMethod.OPTIONS) == request.Method) ||
  96. (cond.HeaderValue.ToLower().Trim() == "patch" && (request.Method | HttpMethod.PATCH) == request.Method) ||
  97. (cond.HeaderValue.ToLower().Trim() == "post" && (request.Method | HttpMethod.POST) == request.Method) ||
  98. (cond.HeaderValue.ToLower().Trim() == "put" && (request.Method | HttpMethod.PUT) == request.Method) ||
  99. (cond.HeaderValue.ToLower().Trim() == "trace" && (request.Method | HttpMethod.TRACE) == request.Method);
  100. System.Diagnostics.Debug.WriteLine(" - Method Condition: " + request.Method.ToString() + " match " + cond.HeaderValue + " = " + (bIsMatch ? "True" : "False"));
  101. if (cond.ConditionType == VHostRedirectCondition.eCondition.Must && bIsMatch == false)
  102. return false;
  103. if (cond.ConditionType == VHostRedirectCondition.eCondition.MustNot && bIsMatch == true)
  104. return false;
  105. }
  106. else if (cond.HeaderVariable == VHostRedirectCondition.eVaraible.Path) {
  107. bool bIsMatch = Regex.IsMatch(request.Path, cond.HeaderValue);
  108. System.Diagnostics.Debug.WriteLine(" - Path Condition: " + request.Path + " match " + cond.HeaderValue + " = " + (bIsMatch ? "True" : "False"));
  109. if (cond.ConditionType == VHostRedirectCondition.eCondition.Must && bIsMatch == false)
  110. return false;
  111. if (cond.ConditionType == VHostRedirectCondition.eCondition.MustNot && bIsMatch == true)
  112. return false;
  113. }
  114. else if (cond.HeaderVariable == VHostRedirectCondition.eVaraible.Query) {
  115. bool bIsMatch = Regex.IsMatch(request.QueryString, cond.HeaderValue);
  116. System.Diagnostics.Debug.WriteLine(" - Query Condition: " + request.QueryString + " match " + cond.HeaderValue + " = " + (bIsMatch ? "True" : "False"));
  117. if (cond.ConditionType == VHostRedirectCondition.eCondition.Must && bIsMatch == false)
  118. return false;
  119. if (cond.ConditionType == VHostRedirectCondition.eCondition.MustNot && bIsMatch == true)
  120. return false;
  121. }
  122. else if (cond.HeaderVariable == VHostRedirectCondition.eVaraible.Referer) {
  123. bool bIsMatch = Regex.IsMatch(request.Referer, cond.HeaderValue);
  124. System.Diagnostics.Debug.WriteLine(" - Referer Condition: " + request.Referer + " match " + cond.HeaderValue + " = " + (bIsMatch ? "True" : "False"));
  125. if (cond.ConditionType == VHostRedirectCondition.eCondition.Must && bIsMatch == false)
  126. return false;
  127. if (cond.ConditionType == VHostRedirectCondition.eCondition.MustNot && bIsMatch == true)
  128. return false;
  129. }
  130. else if (cond.HeaderVariable == VHostRedirectCondition.eVaraible.UserAgent) {
  131. bool bIsMatch = Regex.IsMatch(request.UserAgent, cond.HeaderValue);
  132. System.Diagnostics.Debug.WriteLine(" - UserAgent Condition: " + request.UserAgent + " match " + cond.HeaderValue + " = " + (bIsMatch ? "True" : "False"));
  133. if (cond.ConditionType == VHostRedirectCondition.eCondition.Must && bIsMatch == false)
  134. return false;
  135. if (cond.ConditionType == VHostRedirectCondition.eCondition.MustNot && bIsMatch == true)
  136. return false;
  137. }
  138. }
  139. }
  140. return true;
  141. }
  142. }
  143. }