HttpUtility.cs 38 KB

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