HttpUtility.cs 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  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',
  267. '\u00C1',
  268. '\u00C2',
  269. '\u00C0',
  270. '\u0391',
  271. '\u00C5',
  272. '\u00C3',
  273. '\u00C4',
  274. '\u0392',
  275. '\u00C7',
  276. '\u03A7',
  277. '\u2021',
  278. '\u0394',
  279. '\u00D0',
  280. '\u00C9',
  281. '\u00CA',
  282. '\u00C8',
  283. '\u0395',
  284. '\u0397',
  285. '\u00CB',
  286. '\u0393',
  287. '\u00CD',
  288. '\u00CE',
  289. '\u00CC',
  290. '\u0399',
  291. '\u00CF',
  292. '\u039A',
  293. '\u039B',
  294. '\u039C',
  295. '\u00D1',
  296. '\u039D',
  297. '\u0152',
  298. '\u00D3',
  299. '\u00D4',
  300. '\u00D2',
  301. '\u03A9',
  302. '\u039F',
  303. '\u00D8',
  304. '\u00D5',
  305. '\u00D6',
  306. '\u03A6',
  307. '\u03A0',
  308. '\u2033',
  309. '\u03A8',
  310. '\u03A1',
  311. '\u0160',
  312. '\u03A3',
  313. '\u00DE',
  314. '\u03A4',
  315. '\u0398',
  316. '\u00DA',
  317. '\u00DB',
  318. '\u00D9',
  319. '\u03A5',
  320. '\u00DC',
  321. '\u039E',
  322. '\u00DD',
  323. '\u0178',
  324. '\u0396',
  325. '\u00E1',
  326. '\u00E2',
  327. '\u00B4',
  328. '\u00E6',
  329. '\u00E0',
  330. '\u2135',
  331. '\u03B1',
  332. '\u0026',
  333. '\u2227',
  334. '\u2220',
  335. '\u0027',
  336. '\u00E5',
  337. '\u2248',
  338. '\u00E3',
  339. '\u00E4',
  340. '\u201E',
  341. '\u03B2',
  342. '\u00A6',
  343. '\u2022',
  344. '\u2229',
  345. '\u00E7',
  346. '\u00B8',
  347. '\u00A2',
  348. '\u03C7',
  349. '\u02C6',
  350. '\u2663',
  351. '\u2245',
  352. '\u00A9',
  353. '\u21B5',
  354. '\u222A',
  355. '\u00A4',
  356. '\u21D3',
  357. '\u2020',
  358. '\u2193',
  359. '\u00B0',
  360. '\u03B4',
  361. '\u2666',
  362. '\u00F7',
  363. '\u00E9',
  364. '\u00EA',
  365. '\u00E8',
  366. '\u2205',
  367. '\u2003',
  368. '\u2002',
  369. '\u03B5',
  370. '\u2261',
  371. '\u03B7',
  372. '\u00F0',
  373. '\u00EB',
  374. '\u20AC',
  375. '\u2203',
  376. '\u0192',
  377. '\u2200',
  378. '\u00BD',
  379. '\u00BC',
  380. '\u00BE',
  381. '\u2044',
  382. '\u03B3',
  383. '\u2265',
  384. '\u003E',
  385. '\u21D4',
  386. '\u2194',
  387. '\u2665',
  388. '\u2026',
  389. '\u00ED',
  390. '\u00EE',
  391. '\u00A1',
  392. '\u00EC',
  393. '\u2111',
  394. '\u221E',
  395. '\u222B',
  396. '\u03B9',
  397. '\u00BF',
  398. '\u2208',
  399. '\u00EF',
  400. '\u03BA',
  401. '\u21D0',
  402. '\u03BB',
  403. '\u2329',
  404. '\u00AB',
  405. '\u2190',
  406. '\u2308',
  407. '\u201C',
  408. '\u2264',
  409. '\u230A',
  410. '\u2217',
  411. '\u25CA',
  412. '\u200E',
  413. '\u2039',
  414. '\u2018',
  415. '\u003C',
  416. '\u00AF',
  417. '\u2014',
  418. '\u00B5',
  419. '\u00B7',
  420. '\u2212',
  421. '\u03BC',
  422. '\u2207',
  423. '\u00A0',
  424. '\u2013',
  425. '\u2260',
  426. '\u220B',
  427. '\u00AC',
  428. '\u2209',
  429. '\u2284',
  430. '\u00F1',
  431. '\u03BD',
  432. '\u00F3',
  433. '\u00F4',
  434. '\u0153',
  435. '\u00F2',
  436. '\u203E',
  437. '\u03C9',
  438. '\u03BF',
  439. '\u2295',
  440. '\u2228',
  441. '\u00AA',
  442. '\u00BA',
  443. '\u00F8',
  444. '\u00F5',
  445. '\u2297',
  446. '\u00F6',
  447. '\u00B6',
  448. '\u2202',
  449. '\u2030',
  450. '\u22A5',
  451. '\u03C6',
  452. '\u03C0',
  453. '\u03D6',
  454. '\u00B1',
  455. '\u00A3',
  456. '\u2032',
  457. '\u220F',
  458. '\u221D',
  459. '\u03C8',
  460. '\u0022',
  461. '\u21D2',
  462. '\u221A',
  463. '\u232A',
  464. '\u00BB',
  465. '\u2192',
  466. '\u2309',
  467. '\u201D',
  468. '\u211C',
  469. '\u00AE',
  470. '\u230B',
  471. '\u03C1',
  472. '\u200F',
  473. '\u203A',
  474. '\u2019',
  475. '\u201A',
  476. '\u0161',
  477. '\u22C5',
  478. '\u00A7',
  479. '\u00AD',
  480. '\u03C3',
  481. '\u03C2',
  482. '\u223C',
  483. '\u2660',
  484. '\u2282',
  485. '\u2286',
  486. '\u2211',
  487. '\u2283',
  488. '\u00B9',
  489. '\u00B2',
  490. '\u00B3',
  491. '\u2287',
  492. '\u00DF',
  493. '\u03C4',
  494. '\u2234',
  495. '\u03B8',
  496. '\u03D1',
  497. '\u2009',
  498. '\u00FE',
  499. '\u02DC',
  500. '\u00D7',
  501. '\u2122',
  502. '\u21D1',
  503. '\u00FA',
  504. '\u2191',
  505. '\u00FB',
  506. '\u00F9',
  507. '\u00A8',
  508. '\u03D2',
  509. '\u03C5',
  510. '\u00FC',
  511. '\u2118',
  512. '\u03BE',
  513. '\u00FD',
  514. '\u00A5',
  515. '\u00FF',
  516. '\u03B6',
  517. '\u200D',
  518. '\u200C'
  519. };
  520. #region Methods
  521. static void WriteCharBytes(IList buf, char ch, Encoding e)
  522. {
  523. if (ch > 255)
  524. {
  525. foreach (byte b in e.GetBytes(new char[] { ch }))
  526. buf.Add(b);
  527. }
  528. else
  529. buf.Add((byte)ch);
  530. }
  531. public static string UrlDecode(string s, Encoding e)
  532. {
  533. if (null == s)
  534. return null;
  535. if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)
  536. return s;
  537. if (e == null)
  538. e = Encoding.UTF8;
  539. long len = s.Length;
  540. var bytes = new List<byte>();
  541. int xchar;
  542. char ch;
  543. for (int i = 0; i < len; i++)
  544. {
  545. ch = s[i];
  546. if (ch == '%' && i + 2 < len && s[i + 1] != '%')
  547. {
  548. if (s[i + 1] == 'u' && i + 5 < len)
  549. {
  550. // unicode hex sequence
  551. xchar = GetChar(s, i + 2, 4);
  552. if (xchar != -1)
  553. {
  554. WriteCharBytes(bytes, (char)xchar, e);
  555. i += 5;
  556. }
  557. else
  558. WriteCharBytes(bytes, '%', e);
  559. }
  560. else if ((xchar = GetChar(s, i + 1, 2)) != -1)
  561. {
  562. WriteCharBytes(bytes, (char)xchar, e);
  563. i += 2;
  564. }
  565. else
  566. {
  567. WriteCharBytes(bytes, '%', e);
  568. }
  569. continue;
  570. }
  571. if (ch == '+')
  572. WriteCharBytes(bytes, ' ', e);
  573. else
  574. WriteCharBytes(bytes, ch, e);
  575. }
  576. byte[] buf = bytes.ToArray();
  577. bytes = null;
  578. return e.GetString(buf, 0, buf.Length);
  579. }
  580. static int GetInt(byte b)
  581. {
  582. char c = (char)b;
  583. if (c >= '0' && c <= '9')
  584. return c - '0';
  585. if (c >= 'a' && c <= 'f')
  586. return c - 'a' + 10;
  587. if (c >= 'A' && c <= 'F')
  588. return c - 'A' + 10;
  589. return -1;
  590. }
  591. static int GetChar(string str, int offset, int length)
  592. {
  593. int val = 0;
  594. int end = length + offset;
  595. for (int i = offset; i < end; i++)
  596. {
  597. char c = str[i];
  598. if (c > 127)
  599. return -1;
  600. int current = GetInt((byte)c);
  601. if (current == -1)
  602. return -1;
  603. val = (val << 4) + current;
  604. }
  605. return val;
  606. }
  607. static bool TryConvertKeyToEntity(string key, out char value)
  608. {
  609. var token = CalculateKeyValue(key);
  610. if (token == 0)
  611. {
  612. value = '\0';
  613. return false;
  614. }
  615. var idx = Array.BinarySearch(entities, token);
  616. if (idx < 0)
  617. {
  618. value = '\0';
  619. return false;
  620. }
  621. value = entities_values[idx];
  622. return true;
  623. }
  624. static long CalculateKeyValue(string s)
  625. {
  626. if (s.Length > 8)
  627. return 0;
  628. long key = 0;
  629. for (int i = 0; i < s.Length; ++i)
  630. {
  631. long ch = s[i];
  632. if (ch > 'z' || ch < '0')
  633. return 0;
  634. key |= ch << ((7 - i) * 8);
  635. }
  636. return key;
  637. }
  638. /// <summary>
  639. /// Decodes an HTML-encoded string and returns the decoded string.
  640. /// </summary>
  641. /// <param name="s">The HTML string to decode. </param>
  642. /// <returns>The decoded text.</returns>
  643. public static string HtmlDecode(string s)
  644. {
  645. if (s == null)
  646. throw new ArgumentNullException("s");
  647. if (s.IndexOf('&') == -1)
  648. return s;
  649. StringBuilder entity = new StringBuilder();
  650. StringBuilder output = new StringBuilder();
  651. int len = s.Length;
  652. // 0 -> nothing,
  653. // 1 -> right after '&'
  654. // 2 -> between '&' and ';' but no '#'
  655. // 3 -> '#' found after '&' and getting numbers
  656. int state = 0;
  657. int number = 0;
  658. int digit_start = 0;
  659. bool hex_number = false;
  660. for (int i = 0; i < len; i++)
  661. {
  662. char c = s[i];
  663. if (state == 0)
  664. {
  665. if (c == '&')
  666. {
  667. entity.Append(c);
  668. state = 1;
  669. }
  670. else
  671. {
  672. output.Append(c);
  673. }
  674. continue;
  675. }
  676. if (c == '&')
  677. {
  678. state = 1;
  679. if (digit_start > 0)
  680. {
  681. entity.Append(s, digit_start, i - digit_start);
  682. digit_start = 0;
  683. }
  684. output.Append(entity.ToString());
  685. entity.Length = 0;
  686. entity.Append('&');
  687. continue;
  688. }
  689. switch (state)
  690. {
  691. case 1:
  692. if (c == ';')
  693. {
  694. state = 0;
  695. output.Append(entity.ToString());
  696. output.Append(c);
  697. entity.Length = 0;
  698. break;
  699. }
  700. number = 0;
  701. hex_number = false;
  702. if (c != '#')
  703. {
  704. state = 2;
  705. }
  706. else
  707. {
  708. state = 3;
  709. }
  710. entity.Append(c);
  711. break;
  712. case 2:
  713. entity.Append(c);
  714. if (c == ';')
  715. {
  716. string key = entity.ToString();
  717. state = 0;
  718. entity.Length = 0;
  719. if (key.Length > 1)
  720. {
  721. var skey = key.Substring(1, key.Length - 2);
  722. if (TryConvertKeyToEntity(skey, out c))
  723. {
  724. output.Append(c);
  725. break;
  726. }
  727. }
  728. output.Append(key);
  729. }
  730. break;
  731. case 3:
  732. if (c == ';')
  733. {
  734. if (number < 0x10000)
  735. {
  736. output.Append((char)number);
  737. }
  738. else
  739. {
  740. output.Append((char)(0xd800 + ((number - 0x10000) >> 10)));
  741. output.Append((char)(0xdc00 + ((number - 0x10000) & 0x3ff)));
  742. }
  743. state = 0;
  744. entity.Length = 0;
  745. digit_start = 0;
  746. break;
  747. }
  748. if (c == 'x' || c == 'X' && !hex_number)
  749. {
  750. digit_start = i;
  751. hex_number = true;
  752. break;
  753. }
  754. if (Char.IsDigit(c))
  755. {
  756. if (digit_start == 0)
  757. digit_start = i;
  758. number = number * (hex_number ? 16 : 10) + ((int)c - '0');
  759. break;
  760. }
  761. if (hex_number)
  762. {
  763. if (c >= 'a' && c <= 'f')
  764. {
  765. number = number * 16 + 10 + ((int)c - 'a');
  766. break;
  767. }
  768. if (c >= 'A' && c <= 'F')
  769. {
  770. number = number * 16 + 10 + ((int)c - 'A');
  771. break;
  772. }
  773. }
  774. state = 2;
  775. if (digit_start > 0)
  776. {
  777. entity.Append(s, digit_start, i - digit_start);
  778. digit_start = 0;
  779. }
  780. entity.Append(c);
  781. break;
  782. }
  783. }
  784. if (entity.Length > 0)
  785. {
  786. output.Append(entity);
  787. }
  788. else if (digit_start > 0)
  789. {
  790. output.Append(s, digit_start, s.Length - digit_start);
  791. }
  792. return output.ToString();
  793. }
  794. public static QueryParamCollection ParseQueryString(string query)
  795. {
  796. return ParseQueryString(query, Encoding.UTF8);
  797. }
  798. public static QueryParamCollection ParseQueryString(string query, Encoding encoding)
  799. {
  800. if (query == null)
  801. throw new ArgumentNullException("query");
  802. if (encoding == null)
  803. throw new ArgumentNullException("encoding");
  804. if (query.Length == 0 || (query.Length == 1 && query[0] == '?'))
  805. return new QueryParamCollection();
  806. if (query[0] == '?')
  807. query = query.Substring(1);
  808. QueryParamCollection result = new QueryParamCollection();
  809. ParseQueryString(query, encoding, result);
  810. return result;
  811. }
  812. internal static void ParseQueryString(string query, Encoding encoding, QueryParamCollection result)
  813. {
  814. if (query.Length == 0)
  815. return;
  816. string decoded = HtmlDecode(query);
  817. int decodedLength = decoded.Length;
  818. int namePos = 0;
  819. bool first = true;
  820. while (namePos <= decodedLength)
  821. {
  822. int valuePos = -1, valueEnd = -1;
  823. for (int q = namePos; q < decodedLength; q++)
  824. {
  825. if (valuePos == -1 && decoded[q] == '=')
  826. {
  827. valuePos = q + 1;
  828. }
  829. else if (decoded[q] == '&')
  830. {
  831. valueEnd = q;
  832. break;
  833. }
  834. }
  835. if (first)
  836. {
  837. first = false;
  838. if (decoded[namePos] == '?')
  839. namePos++;
  840. }
  841. string name, value;
  842. if (valuePos == -1)
  843. {
  844. name = null;
  845. valuePos = namePos;
  846. }
  847. else
  848. {
  849. name = UrlDecode(decoded.Substring(namePos, valuePos - namePos - 1), encoding);
  850. }
  851. if (valueEnd < 0)
  852. {
  853. namePos = -1;
  854. valueEnd = decoded.Length;
  855. }
  856. else
  857. {
  858. namePos = valueEnd + 1;
  859. }
  860. value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding);
  861. result.Add(name, value);
  862. if (namePos == -1)
  863. break;
  864. }
  865. }
  866. #endregion // Methods
  867. }
  868. }