2
0

HttpUtility.cs 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace MediaBrowser.Model.Services
  6. {
  7. public static class MyHttpUtility
  8. {
  9. // Must be sorted
  10. static readonly long[] entities = new long[] {
  11. (long)'A' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
  12. (long)'A' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  13. (long)'A' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  14. (long)'A' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  15. (long)'A' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24,
  16. (long)'A' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24,
  17. (long)'A' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
  18. (long)'A' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  19. (long)'B' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
  20. (long)'C' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16,
  21. (long)'C' << 56 | (long)'h' << 48 | (long)'i' << 40,
  22. (long)'D' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16,
  23. (long)'D' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24,
  24. (long)'E' << 56 | (long)'T' << 48 | (long)'H' << 40,
  25. (long)'E' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  26. (long)'E' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  27. (long)'E' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  28. (long)'E' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
  29. (long)'E' << 56 | (long)'t' << 48 | (long)'a' << 40,
  30. (long)'E' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  31. (long)'G' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24,
  32. (long)'I' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  33. (long)'I' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  34. (long)'I' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  35. (long)'I' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32,
  36. (long)'I' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  37. (long)'K' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24,
  38. (long)'L' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16,
  39. (long)'M' << 56 | (long)'u' << 48,
  40. (long)'N' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
  41. (long)'N' << 56 | (long)'u' << 48,
  42. (long)'O' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
  43. (long)'O' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  44. (long)'O' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  45. (long)'O' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  46. (long)'O' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24,
  47. (long)'O' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8,
  48. (long)'O' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16,
  49. (long)'O' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
  50. (long)'O' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  51. (long)'P' << 56 | (long)'h' << 48 | (long)'i' << 40,
  52. (long)'P' << 56 | (long)'i' << 48,
  53. (long)'P' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24,
  54. (long)'P' << 56 | (long)'s' << 48 | (long)'i' << 40,
  55. (long)'R' << 56 | (long)'h' << 48 | (long)'o' << 40,
  56. (long)'S' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16,
  57. (long)'S' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24,
  58. (long)'T' << 56 | (long)'H' << 48 | (long)'O' << 40 | (long)'R' << 32 | (long)'N' << 24,
  59. (long)'T' << 56 | (long)'a' << 48 | (long)'u' << 40,
  60. (long)'T' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24,
  61. (long)'U' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  62. (long)'U' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  63. (long)'U' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  64. (long)'U' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
  65. (long)'U' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  66. (long)'X' << 56 | (long)'i' << 48,
  67. (long)'Y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  68. (long)'Y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  69. (long)'Z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
  70. (long)'a' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  71. (long)'a' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  72. (long)'a' << 56 | (long)'c' << 48 | (long)'u' << 40 | (long)'t' << 32 | (long)'e' << 24,
  73. (long)'a' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
  74. (long)'a' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  75. (long)'a' << 56 | (long)'l' << 48 | (long)'e' << 40 | (long)'f' << 32 | (long)'s' << 24 | (long)'y' << 16 | (long)'m' << 8,
  76. (long)'a' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24,
  77. (long)'a' << 56 | (long)'m' << 48 | (long)'p' << 40,
  78. (long)'a' << 56 | (long)'n' << 48 | (long)'d' << 40,
  79. (long)'a' << 56 | (long)'n' << 48 | (long)'g' << 40,
  80. (long)'a' << 56 | (long)'p' << 48 | (long)'o' << 40 | (long)'s' << 32,
  81. (long)'a' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24,
  82. (long)'a' << 56 | (long)'s' << 48 | (long)'y' << 40 | (long)'m' << 32 | (long)'p' << 24,
  83. (long)'a' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
  84. (long)'a' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  85. (long)'b' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  86. (long)'b' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
  87. (long)'b' << 56 | (long)'r' << 48 | (long)'v' << 40 | (long)'b' << 32 | (long)'a' << 24 | (long)'r' << 16,
  88. (long)'b' << 56 | (long)'u' << 48 | (long)'l' << 40 | (long)'l' << 32,
  89. (long)'c' << 56 | (long)'a' << 48 | (long)'p' << 40,
  90. (long)'c' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16,
  91. (long)'c' << 56 | (long)'e' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'l' << 24,
  92. (long)'c' << 56 | (long)'e' << 48 | (long)'n' << 40 | (long)'t' << 32,
  93. (long)'c' << 56 | (long)'h' << 48 | (long)'i' << 40,
  94. (long)'c' << 56 | (long)'i' << 48 | (long)'r' << 40 | (long)'c' << 32,
  95. (long)'c' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'b' << 32 | (long)'s' << 24,
  96. (long)'c' << 56 | (long)'o' << 48 | (long)'n' << 40 | (long)'g' << 32,
  97. (long)'c' << 56 | (long)'o' << 48 | (long)'p' << 40 | (long)'y' << 32,
  98. (long)'c' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'r' << 24,
  99. (long)'c' << 56 | (long)'u' << 48 | (long)'p' << 40,
  100. (long)'c' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'n' << 16,
  101. (long)'d' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
  102. (long)'d' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16,
  103. (long)'d' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
  104. (long)'d' << 56 | (long)'e' << 48 | (long)'g' << 40,
  105. (long)'d' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24,
  106. (long)'d' << 56 | (long)'i' << 48 | (long)'a' << 40 | (long)'m' << 32 | (long)'s' << 24,
  107. (long)'d' << 56 | (long)'i' << 48 | (long)'v' << 40 | (long)'i' << 32 | (long)'d' << 24 | (long)'e' << 16,
  108. (long)'e' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  109. (long)'e' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  110. (long)'e' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  111. (long)'e' << 56 | (long)'m' << 48 | (long)'p' << 40 | (long)'t' << 32 | (long)'y' << 24,
  112. (long)'e' << 56 | (long)'m' << 48 | (long)'s' << 40 | (long)'p' << 32,
  113. (long)'e' << 56 | (long)'n' << 48 | (long)'s' << 40 | (long)'p' << 32,
  114. (long)'e' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
  115. (long)'e' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'i' << 32 | (long)'v' << 24,
  116. (long)'e' << 56 | (long)'t' << 48 | (long)'a' << 40,
  117. (long)'e' << 56 | (long)'t' << 48 | (long)'h' << 40,
  118. (long)'e' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  119. (long)'e' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'o' << 32,
  120. (long)'e' << 56 | (long)'x' << 48 | (long)'i' << 40 | (long)'s' << 32 | (long)'t' << 24,
  121. (long)'f' << 56 | (long)'n' << 48 | (long)'o' << 40 | (long)'f' << 32,
  122. (long)'f' << 56 | (long)'o' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'l' << 24 | (long)'l' << 16,
  123. (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'2' << 16,
  124. (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'4' << 16,
  125. (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'3' << 24 | (long)'4' << 16,
  126. (long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'l' << 24,
  127. (long)'g' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24,
  128. (long)'g' << 56 | (long)'e' << 48,
  129. (long)'g' << 56 | (long)'t' << 48,
  130. (long)'h' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
  131. (long)'h' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
  132. (long)'h' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'t' << 24 | (long)'s' << 16,
  133. (long)'h' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'l' << 32 | (long)'i' << 24 | (long)'p' << 16,
  134. (long)'i' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  135. (long)'i' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  136. (long)'i' << 56 | (long)'e' << 48 | (long)'x' << 40 | (long)'c' << 32 | (long)'l' << 24,
  137. (long)'i' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  138. (long)'i' << 56 | (long)'m' << 48 | (long)'a' << 40 | (long)'g' << 32 | (long)'e' << 24,
  139. (long)'i' << 56 | (long)'n' << 48 | (long)'f' << 40 | (long)'i' << 32 | (long)'n' << 24,
  140. (long)'i' << 56 | (long)'n' << 48 | (long)'t' << 40,
  141. (long)'i' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32,
  142. (long)'i' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'e' << 32 | (long)'s' << 24 | (long)'t' << 16,
  143. (long)'i' << 56 | (long)'s' << 48 | (long)'i' << 40 | (long)'n' << 32,
  144. (long)'i' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  145. (long)'k' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24,
  146. (long)'l' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
  147. (long)'l' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16,
  148. (long)'l' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32,
  149. (long)'l' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  150. (long)'l' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
  151. (long)'l' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24,
  152. (long)'l' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  153. (long)'l' << 56 | (long)'e' << 48,
  154. (long)'l' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16,
  155. (long)'l' << 56 | (long)'o' << 48 | (long)'w' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'t' << 16,
  156. (long)'l' << 56 | (long)'o' << 48 | (long)'z' << 40,
  157. (long)'l' << 56 | (long)'r' << 48 | (long)'m' << 40,
  158. (long)'l' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16,
  159. (long)'l' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  160. (long)'l' << 56 | (long)'t' << 48,
  161. (long)'m' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'r' << 32,
  162. (long)'m' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24,
  163. (long)'m' << 56 | (long)'i' << 48 | (long)'c' << 40 | (long)'r' << 32 | (long)'o' << 24,
  164. (long)'m' << 56 | (long)'i' << 48 | (long)'d' << 40 | (long)'d' << 32 | (long)'o' << 24 | (long)'t' << 16,
  165. (long)'m' << 56 | (long)'i' << 48 | (long)'n' << 40 | (long)'u' << 32 | (long)'s' << 24,
  166. (long)'m' << 56 | (long)'u' << 48,
  167. (long)'n' << 56 | (long)'a' << 48 | (long)'b' << 40 | (long)'l' << 32 | (long)'a' << 24,
  168. (long)'n' << 56 | (long)'b' << 48 | (long)'s' << 40 | (long)'p' << 32,
  169. (long)'n' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24,
  170. (long)'n' << 56 | (long)'e' << 48,
  171. (long)'n' << 56 | (long)'i' << 48,
  172. (long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40,
  173. (long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'i' << 32 | (long)'n' << 24,
  174. (long)'n' << 56 | (long)'s' << 48 | (long)'u' << 40 | (long)'b' << 32,
  175. (long)'n' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
  176. (long)'n' << 56 | (long)'u' << 48,
  177. (long)'o' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  178. (long)'o' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  179. (long)'o' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
  180. (long)'o' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  181. (long)'o' << 56 | (long)'l' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'e' << 24,
  182. (long)'o' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24,
  183. (long)'o' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8,
  184. (long)'o' << 56 | (long)'p' << 48 | (long)'l' << 40 | (long)'u' << 32 | (long)'s' << 24,
  185. (long)'o' << 56 | (long)'r' << 48,
  186. (long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'f' << 32,
  187. (long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'m' << 32,
  188. (long)'o' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16,
  189. (long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16,
  190. (long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24 | (long)'s' << 16,
  191. (long)'o' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  192. (long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'a' << 32,
  193. (long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'t' << 32,
  194. (long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'m' << 32 | (long)'i' << 24 | (long)'l' << 16,
  195. (long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'p' << 32,
  196. (long)'p' << 56 | (long)'h' << 48 | (long)'i' << 40,
  197. (long)'p' << 56 | (long)'i' << 48,
  198. (long)'p' << 56 | (long)'i' << 48 | (long)'v' << 40,
  199. (long)'p' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'s' << 32 | (long)'m' << 24 | (long)'n' << 16,
  200. (long)'p' << 56 | (long)'o' << 48 | (long)'u' << 40 | (long)'n' << 32 | (long)'d' << 24,
  201. (long)'p' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24,
  202. (long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'d' << 32,
  203. (long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'p' << 32,
  204. (long)'p' << 56 | (long)'s' << 48 | (long)'i' << 40,
  205. (long)'q' << 56 | (long)'u' << 48 | (long)'o' << 40 | (long)'t' << 32,
  206. (long)'r' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
  207. (long)'r' << 56 | (long)'a' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'c' << 24,
  208. (long)'r' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32,
  209. (long)'r' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  210. (long)'r' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
  211. (long)'r' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24,
  212. (long)'r' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  213. (long)'r' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'l' << 32,
  214. (long)'r' << 56 | (long)'e' << 48 | (long)'g' << 40,
  215. (long)'r' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16,
  216. (long)'r' << 56 | (long)'h' << 48 | (long)'o' << 40,
  217. (long)'r' << 56 | (long)'l' << 48 | (long)'m' << 40,
  218. (long)'r' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16,
  219. (long)'r' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  220. (long)'s' << 56 | (long)'b' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24,
  221. (long)'s' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16,
  222. (long)'s' << 56 | (long)'d' << 48 | (long)'o' << 40 | (long)'t' << 32,
  223. (long)'s' << 56 | (long)'e' << 48 | (long)'c' << 40 | (long)'t' << 32,
  224. (long)'s' << 56 | (long)'h' << 48 | (long)'y' << 40,
  225. (long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24,
  226. (long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24 | (long)'f' << 16,
  227. (long)'s' << 56 | (long)'i' << 48 | (long)'m' << 40,
  228. (long)'s' << 56 | (long)'p' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24 | (long)'s' << 16,
  229. (long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40,
  230. (long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40 | (long)'e' << 32,
  231. (long)'s' << 56 | (long)'u' << 48 | (long)'m' << 40,
  232. (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40,
  233. (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'1' << 32,
  234. (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'2' << 32,
  235. (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'3' << 32,
  236. (long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'e' << 32,
  237. (long)'s' << 56 | (long)'z' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24,
  238. (long)'t' << 56 | (long)'a' << 48 | (long)'u' << 40,
  239. (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'4' << 16,
  240. (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24,
  241. (long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24 | (long)'s' << 16 | (long)'y' << 8 | (long)'m' << 0,
  242. (long)'t' << 56 | (long)'h' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'s' << 24 | (long)'p' << 16,
  243. (long)'t' << 56 | (long)'h' << 48 | (long)'o' << 40 | (long)'r' << 32 | (long)'n' << 24,
  244. (long)'t' << 56 | (long)'i' << 48 | (long)'l' << 40 | (long)'d' << 32 | (long)'e' << 24,
  245. (long)'t' << 56 | (long)'i' << 48 | (long)'m' << 40 | (long)'e' << 32 | (long)'s' << 24,
  246. (long)'t' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24,
  247. (long)'u' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32,
  248. (long)'u' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  249. (long)'u' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32,
  250. (long)'u' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24,
  251. (long)'u' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16,
  252. (long)'u' << 56 | (long)'m' << 48 | (long)'l' << 40,
  253. (long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'h' << 24,
  254. (long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8,
  255. (long)'u' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  256. (long)'w' << 56 | (long)'e' << 48 | (long)'i' << 40 | (long)'e' << 32 | (long)'r' << 24 | (long)'p' << 16,
  257. (long)'x' << 56 | (long)'i' << 48,
  258. (long)'y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16,
  259. (long)'y' << 56 | (long)'e' << 48 | (long)'n' << 40,
  260. (long)'y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32,
  261. (long)'z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32,
  262. (long)'z' << 56 | (long)'w' << 48 | (long)'j' << 40,
  263. (long)'z' << 56 | (long)'w' << 48 | (long)'n' << 40 | (long)'j' << 32
  264. };
  265. static readonly char[] entities_values = new char[] {
  266. '\u00C6', '\u00C1', '\u00C2', '\u00C0', '\u0391', '\u00C5', '\u00C3', '\u00C4', '\u0392', '\u00C7', '\u03A7',
  267. '\u2021', '\u0394', '\u00D0', '\u00C9', '\u00CA', '\u00C8', '\u0395', '\u0397', '\u00CB', '\u0393', '\u00CD',
  268. '\u00CE', '\u00CC', '\u0399', '\u00CF', '\u039A', '\u039B', '\u039C', '\u00D1', '\u039D', '\u0152', '\u00D3',
  269. '\u00D4', '\u00D2', '\u03A9', '\u039F', '\u00D8', '\u00D5', '\u00D6', '\u03A6', '\u03A0', '\u2033', '\u03A8',
  270. '\u03A1', '\u0160', '\u03A3', '\u00DE', '\u03A4', '\u0398', '\u00DA', '\u00DB', '\u00D9', '\u03A5', '\u00DC',
  271. '\u039E', '\u00DD', '\u0178', '\u0396', '\u00E1', '\u00E2', '\u00B4', '\u00E6', '\u00E0', '\u2135', '\u03B1',
  272. '\u0026', '\u2227', '\u2220', '\u0027', '\u00E5', '\u2248', '\u00E3', '\u00E4', '\u201E', '\u03B2', '\u00A6',
  273. '\u2022', '\u2229', '\u00E7', '\u00B8', '\u00A2', '\u03C7', '\u02C6', '\u2663', '\u2245', '\u00A9', '\u21B5',
  274. '\u222A', '\u00A4', '\u21D3', '\u2020', '\u2193', '\u00B0', '\u03B4', '\u2666', '\u00F7', '\u00E9', '\u00EA',
  275. '\u00E8', '\u2205', '\u2003', '\u2002', '\u03B5', '\u2261', '\u03B7', '\u00F0', '\u00EB', '\u20AC', '\u2203',
  276. '\u0192', '\u2200', '\u00BD', '\u00BC', '\u00BE', '\u2044', '\u03B3', '\u2265', '\u003E', '\u21D4', '\u2194',
  277. '\u2665', '\u2026', '\u00ED', '\u00EE', '\u00A1', '\u00EC', '\u2111', '\u221E', '\u222B', '\u03B9', '\u00BF',
  278. '\u2208', '\u00EF', '\u03BA', '\u21D0', '\u03BB', '\u2329', '\u00AB', '\u2190', '\u2308', '\u201C', '\u2264',
  279. '\u230A', '\u2217', '\u25CA', '\u200E', '\u2039', '\u2018', '\u003C', '\u00AF', '\u2014', '\u00B5', '\u00B7',
  280. '\u2212', '\u03BC', '\u2207', '\u00A0', '\u2013', '\u2260', '\u220B', '\u00AC', '\u2209', '\u2284', '\u00F1',
  281. '\u03BD', '\u00F3', '\u00F4', '\u0153', '\u00F2', '\u203E', '\u03C9', '\u03BF', '\u2295', '\u2228', '\u00AA',
  282. '\u00BA', '\u00F8', '\u00F5', '\u2297', '\u00F6', '\u00B6', '\u2202', '\u2030', '\u22A5', '\u03C6', '\u03C0',
  283. '\u03D6', '\u00B1', '\u00A3', '\u2032', '\u220F', '\u221D', '\u03C8', '\u0022', '\u21D2', '\u221A', '\u232A',
  284. '\u00BB', '\u2192', '\u2309', '\u201D', '\u211C', '\u00AE', '\u230B', '\u03C1', '\u200F', '\u203A', '\u2019',
  285. '\u201A', '\u0161', '\u22C5', '\u00A7', '\u00AD', '\u03C3', '\u03C2', '\u223C', '\u2660', '\u2282', '\u2286',
  286. '\u2211', '\u2283', '\u00B9', '\u00B2', '\u00B3', '\u2287', '\u00DF', '\u03C4', '\u2234', '\u03B8', '\u03D1',
  287. '\u2009', '\u00FE', '\u02DC', '\u00D7', '\u2122', '\u21D1', '\u00FA', '\u2191', '\u00FB', '\u00F9', '\u00A8',
  288. '\u03D2', '\u03C5', '\u00FC', '\u2118', '\u03BE', '\u00FD', '\u00A5', '\u00FF', '\u03B6', '\u200D', '\u200C'
  289. };
  290. #region Methods
  291. static void WriteCharBytes(IList buf, char ch, Encoding e)
  292. {
  293. if (ch > 255)
  294. {
  295. foreach (byte b in e.GetBytes(new char[] { ch }))
  296. buf.Add(b);
  297. }
  298. else
  299. buf.Add((byte)ch);
  300. }
  301. public static string UrlDecode(string s, Encoding e)
  302. {
  303. if (null == s)
  304. return null;
  305. if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)
  306. return s;
  307. if (e == null)
  308. e = Encoding.UTF8;
  309. long len = s.Length;
  310. var bytes = new List<byte>();
  311. int xchar;
  312. char ch;
  313. for (int i = 0; i < len; i++)
  314. {
  315. ch = s[i];
  316. if (ch == '%' && i + 2 < len && s[i + 1] != '%')
  317. {
  318. if (s[i + 1] == 'u' && i + 5 < len)
  319. {
  320. // unicode hex sequence
  321. xchar = GetChar(s, i + 2, 4);
  322. if (xchar != -1)
  323. {
  324. WriteCharBytes(bytes, (char)xchar, e);
  325. i += 5;
  326. }
  327. else
  328. WriteCharBytes(bytes, '%', e);
  329. }
  330. else if ((xchar = GetChar(s, i + 1, 2)) != -1)
  331. {
  332. WriteCharBytes(bytes, (char)xchar, e);
  333. i += 2;
  334. }
  335. else
  336. {
  337. WriteCharBytes(bytes, '%', e);
  338. }
  339. continue;
  340. }
  341. if (ch == '+')
  342. WriteCharBytes(bytes, ' ', e);
  343. else
  344. WriteCharBytes(bytes, ch, e);
  345. }
  346. byte[] buf = bytes.ToArray();
  347. bytes = null;
  348. return e.GetString(buf, 0, buf.Length);
  349. }
  350. static int GetInt(byte b)
  351. {
  352. char c = (char)b;
  353. if (c >= '0' && c <= '9')
  354. return c - '0';
  355. if (c >= 'a' && c <= 'f')
  356. return c - 'a' + 10;
  357. if (c >= 'A' && c <= 'F')
  358. return c - 'A' + 10;
  359. return -1;
  360. }
  361. static int GetChar(string str, int offset, int length)
  362. {
  363. int val = 0;
  364. int end = length + offset;
  365. for (int i = offset; i < end; i++)
  366. {
  367. char c = str[i];
  368. if (c > 127)
  369. return -1;
  370. int current = GetInt((byte)c);
  371. if (current == -1)
  372. return -1;
  373. val = (val << 4) + current;
  374. }
  375. return val;
  376. }
  377. static bool TryConvertKeyToEntity(string key, out char value)
  378. {
  379. var token = CalculateKeyValue(key);
  380. if (token == 0)
  381. {
  382. value = '\0';
  383. return false;
  384. }
  385. var idx = Array.BinarySearch(entities, token);
  386. if (idx < 0)
  387. {
  388. value = '\0';
  389. return false;
  390. }
  391. value = entities_values[idx];
  392. return true;
  393. }
  394. static long CalculateKeyValue(string s)
  395. {
  396. if (s.Length > 8)
  397. return 0;
  398. long key = 0;
  399. for (int i = 0; i < s.Length; ++i)
  400. {
  401. long ch = s[i];
  402. if (ch > 'z' || ch < '0')
  403. return 0;
  404. key |= ch << ((7 - i) * 8);
  405. }
  406. return key;
  407. }
  408. /// <summary>
  409. /// Decodes an HTML-encoded string and returns the decoded string.
  410. /// </summary>
  411. /// <param name="s">The HTML string to decode. </param>
  412. /// <returns>The decoded text.</returns>
  413. public static string HtmlDecode(string s)
  414. {
  415. if (s == null)
  416. throw new ArgumentNullException(nameof(s));
  417. if (s.IndexOf('&') == -1)
  418. return s;
  419. var entity = new StringBuilder();
  420. var output = new StringBuilder();
  421. int len = s.Length;
  422. // 0 -> nothing,
  423. // 1 -> right after '&'
  424. // 2 -> between '&' and ';' but no '#'
  425. // 3 -> '#' found after '&' and getting numbers
  426. int state = 0;
  427. int number = 0;
  428. int digit_start = 0;
  429. bool hex_number = false;
  430. for (int i = 0; i < len; i++)
  431. {
  432. char c = s[i];
  433. if (state == 0)
  434. {
  435. if (c == '&')
  436. {
  437. entity.Append(c);
  438. state = 1;
  439. }
  440. else
  441. {
  442. output.Append(c);
  443. }
  444. continue;
  445. }
  446. if (c == '&')
  447. {
  448. state = 1;
  449. if (digit_start > 0)
  450. {
  451. entity.Append(s, digit_start, i - digit_start);
  452. digit_start = 0;
  453. }
  454. output.Append(entity.ToString());
  455. entity.Length = 0;
  456. entity.Append('&');
  457. continue;
  458. }
  459. switch (state)
  460. {
  461. case 1:
  462. if (c == ';')
  463. {
  464. state = 0;
  465. output.Append(entity.ToString());
  466. output.Append(c);
  467. entity.Length = 0;
  468. break;
  469. }
  470. number = 0;
  471. hex_number = false;
  472. if (c != '#')
  473. {
  474. state = 2;
  475. }
  476. else
  477. {
  478. state = 3;
  479. }
  480. entity.Append(c);
  481. break;
  482. case 2:
  483. entity.Append(c);
  484. if (c == ';')
  485. {
  486. string key = entity.ToString();
  487. state = 0;
  488. entity.Length = 0;
  489. if (key.Length > 1)
  490. {
  491. var skey = key.Substring(1, key.Length - 2);
  492. if (TryConvertKeyToEntity(skey, out c))
  493. {
  494. output.Append(c);
  495. break;
  496. }
  497. }
  498. output.Append(key);
  499. }
  500. break;
  501. case 3:
  502. if (c == ';')
  503. {
  504. if (number < 0x10000)
  505. {
  506. output.Append((char)number);
  507. }
  508. else
  509. {
  510. output.Append((char)(0xd800 + ((number - 0x10000) >> 10)));
  511. output.Append((char)(0xdc00 + ((number - 0x10000) & 0x3ff)));
  512. }
  513. state = 0;
  514. entity.Length = 0;
  515. digit_start = 0;
  516. break;
  517. }
  518. if (c == 'x' || c == 'X' && !hex_number)
  519. {
  520. digit_start = i;
  521. hex_number = true;
  522. break;
  523. }
  524. if (char.IsDigit(c))
  525. {
  526. if (digit_start == 0)
  527. digit_start = i;
  528. number = number * (hex_number ? 16 : 10) + ((int)c - '0');
  529. break;
  530. }
  531. if (hex_number)
  532. {
  533. if (c >= 'a' && c <= 'f')
  534. {
  535. number = number * 16 + 10 + ((int)c - 'a');
  536. break;
  537. }
  538. if (c >= 'A' && c <= 'F')
  539. {
  540. number = number * 16 + 10 + ((int)c - 'A');
  541. break;
  542. }
  543. }
  544. state = 2;
  545. if (digit_start > 0)
  546. {
  547. entity.Append(s, digit_start, i - digit_start);
  548. digit_start = 0;
  549. }
  550. entity.Append(c);
  551. break;
  552. }
  553. }
  554. if (entity.Length > 0)
  555. {
  556. output.Append(entity);
  557. }
  558. else if (digit_start > 0)
  559. {
  560. output.Append(s, digit_start, s.Length - digit_start);
  561. }
  562. return output.ToString();
  563. }
  564. public static QueryParamCollection ParseQueryString(string query)
  565. {
  566. return ParseQueryString(query, Encoding.UTF8);
  567. }
  568. public static QueryParamCollection ParseQueryString(string query, Encoding encoding)
  569. {
  570. if (query == null)
  571. throw new ArgumentNullException(nameof(query));
  572. if (encoding == null)
  573. throw new ArgumentNullException(nameof(encoding));
  574. if (query.Length == 0 || (query.Length == 1 && query[0] == '?'))
  575. return new QueryParamCollection();
  576. if (query[0] == '?')
  577. query = query.Substring(1);
  578. var result = new QueryParamCollection();
  579. ParseQueryString(query, encoding, result);
  580. return result;
  581. }
  582. internal static void ParseQueryString(string query, Encoding encoding, QueryParamCollection result)
  583. {
  584. if (query.Length == 0)
  585. return;
  586. string decoded = HtmlDecode(query);
  587. int decodedLength = decoded.Length;
  588. int namePos = 0;
  589. bool first = true;
  590. while (namePos <= decodedLength)
  591. {
  592. int valuePos = -1, valueEnd = -1;
  593. for (int q = namePos; q < decodedLength; q++)
  594. {
  595. if (valuePos == -1 && decoded[q] == '=')
  596. {
  597. valuePos = q + 1;
  598. }
  599. else if (decoded[q] == '&')
  600. {
  601. valueEnd = q;
  602. break;
  603. }
  604. }
  605. if (first)
  606. {
  607. first = false;
  608. if (decoded[namePos] == '?')
  609. namePos++;
  610. }
  611. string name, value;
  612. if (valuePos == -1)
  613. {
  614. name = null;
  615. valuePos = namePos;
  616. }
  617. else
  618. {
  619. name = UrlDecode(decoded.Substring(namePos, valuePos - namePos - 1), encoding);
  620. }
  621. if (valueEnd < 0)
  622. {
  623. namePos = -1;
  624. valueEnd = decoded.Length;
  625. }
  626. else
  627. {
  628. namePos = valueEnd + 1;
  629. }
  630. value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding);
  631. result.Add(name, value);
  632. if (namePos == -1)
  633. break;
  634. }
  635. }
  636. #endregion // Methods
  637. }
  638. }