HttpEncoder.cs 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. // MIRROR CHANGE: drop in Codice.Utils HttpUtility subset to not depend on Unity's plastic scm package
  2. // SOURCE: Unity Plastic SCM package
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Globalization;
  6. using System.IO;
  7. using System.Text;
  8. namespace Edgegap.Codice.Utils // MIRROR CHANGE: namespace Edgegap.* to not collide if anyone has Plastic SCM installed already
  9. {
  10. public class HttpEncoder
  11. {
  12. private static char[] hexChars = "0123456789abcdef".ToCharArray();
  13. private static object entitiesLock = new object();
  14. private static SortedDictionary<string, char> entities;
  15. private static HttpEncoder defaultEncoder = new HttpEncoder();
  16. private static HttpEncoder currentEncoder = HttpEncoder.defaultEncoder;
  17. private static IDictionary<string, char> Entities
  18. {
  19. get
  20. {
  21. lock (HttpEncoder.entitiesLock)
  22. {
  23. if (HttpEncoder.entities == null)
  24. HttpEncoder.InitEntities();
  25. return (IDictionary<string, char>) HttpEncoder.entities;
  26. }
  27. }
  28. }
  29. public static HttpEncoder Current
  30. {
  31. get => HttpEncoder.currentEncoder;
  32. set => HttpEncoder.currentEncoder = value != null ? value : throw new ArgumentNullException(nameof (value));
  33. }
  34. public static HttpEncoder Default => HttpEncoder.defaultEncoder;
  35. protected internal virtual void HeaderNameValueEncode(
  36. string headerName,
  37. string headerValue,
  38. out string encodedHeaderName,
  39. out string encodedHeaderValue)
  40. {
  41. encodedHeaderName = !string.IsNullOrEmpty(headerName) ? HttpEncoder.EncodeHeaderString(headerName) : headerName;
  42. if (string.IsNullOrEmpty(headerValue))
  43. encodedHeaderValue = headerValue;
  44. else
  45. encodedHeaderValue = HttpEncoder.EncodeHeaderString(headerValue);
  46. }
  47. private static void StringBuilderAppend(string s, ref StringBuilder sb)
  48. {
  49. if (sb == null)
  50. sb = new StringBuilder(s);
  51. else
  52. sb.Append(s);
  53. }
  54. private static string EncodeHeaderString(string input)
  55. {
  56. StringBuilder sb = (StringBuilder) null;
  57. for (int index = 0; index < input.Length; ++index)
  58. {
  59. char ch = input[index];
  60. if (ch < ' ' && ch != '\t' || ch == '\u007F')
  61. HttpEncoder.StringBuilderAppend(string.Format("%{0:x2}", (object) (int) ch), ref sb);
  62. }
  63. return sb != null ? sb.ToString() : input;
  64. }
  65. protected internal virtual void HtmlAttributeEncode(string value, TextWriter output)
  66. {
  67. if (output == null)
  68. throw new ArgumentNullException(nameof (output));
  69. if (string.IsNullOrEmpty(value))
  70. return;
  71. output.Write(HttpEncoder.HtmlAttributeEncode(value));
  72. }
  73. protected internal virtual void HtmlDecode(string value, TextWriter output)
  74. {
  75. if (output == null)
  76. throw new ArgumentNullException(nameof (output));
  77. output.Write(HttpEncoder.HtmlDecode(value));
  78. }
  79. protected internal virtual void HtmlEncode(string value, TextWriter output)
  80. {
  81. if (output == null)
  82. throw new ArgumentNullException(nameof (output));
  83. output.Write(HttpEncoder.HtmlEncode(value));
  84. }
  85. protected internal virtual byte[] UrlEncode(byte[] bytes, int offset, int count) => HttpEncoder.UrlEncodeToBytes(bytes, offset, count);
  86. protected internal virtual string UrlPathEncode(string value)
  87. {
  88. if (string.IsNullOrEmpty(value))
  89. return value;
  90. MemoryStream result = new MemoryStream();
  91. int length = value.Length;
  92. for (int index = 0; index < length; ++index)
  93. HttpEncoder.UrlPathEncodeChar(value[index], (Stream) result);
  94. return Encoding.ASCII.GetString(result.ToArray());
  95. }
  96. internal static byte[] UrlEncodeToBytes(byte[] bytes, int offset, int count)
  97. {
  98. int num1 = bytes != null ? bytes.Length : throw new ArgumentNullException(nameof (bytes));
  99. if (num1 == 0)
  100. return new byte[0];
  101. if (offset < 0 || offset >= num1)
  102. throw new ArgumentOutOfRangeException(nameof (offset));
  103. if (count < 0 || count > num1 - offset)
  104. throw new ArgumentOutOfRangeException(nameof (count));
  105. MemoryStream result = new MemoryStream(count);
  106. int num2 = offset + count;
  107. for (int index = offset; index < num2; ++index)
  108. HttpEncoder.UrlEncodeChar((char) bytes[index], (Stream) result, false);
  109. return result.ToArray();
  110. }
  111. internal static string HtmlEncode(string s)
  112. {
  113. switch (s)
  114. {
  115. case "":
  116. return string.Empty;
  117. case null:
  118. return (string) null;
  119. default:
  120. bool flag = false;
  121. for (int index = 0; index < s.Length; ++index)
  122. {
  123. char ch = s[index];
  124. if (ch == '&' || ch == '"' || ch == '<' || ch == '>' || ch > '\u009F' || ch == '\'')
  125. {
  126. flag = true;
  127. break;
  128. }
  129. }
  130. if (!flag)
  131. return s;
  132. StringBuilder stringBuilder = new StringBuilder();
  133. int length = s.Length;
  134. for (int index = 0; index < length; ++index)
  135. {
  136. char ch = s[index];
  137. switch (ch)
  138. {
  139. case '"':
  140. stringBuilder.Append("&quot;");
  141. break;
  142. case '&':
  143. stringBuilder.Append("&amp;");
  144. break;
  145. case '\'':
  146. stringBuilder.Append("&#39;");
  147. break;
  148. case '<':
  149. stringBuilder.Append("&lt;");
  150. break;
  151. case '>':
  152. stringBuilder.Append("&gt;");
  153. break;
  154. case '<':
  155. stringBuilder.Append("&#65308;");
  156. break;
  157. case '>':
  158. stringBuilder.Append("&#65310;");
  159. break;
  160. default:
  161. if (ch > '\u009F' && ch < 'Ā')
  162. {
  163. stringBuilder.Append("&#");
  164. stringBuilder.Append(((int) ch).ToString((IFormatProvider) CultureInfo.InvariantCulture));
  165. stringBuilder.Append(";");
  166. break;
  167. }
  168. stringBuilder.Append(ch);
  169. break;
  170. }
  171. }
  172. return stringBuilder.ToString();
  173. }
  174. }
  175. internal static string HtmlAttributeEncode(string s)
  176. {
  177. if (string.IsNullOrEmpty(s))
  178. return string.Empty;
  179. bool flag = false;
  180. for (int index = 0; index < s.Length; ++index)
  181. {
  182. char ch = s[index];
  183. int num;
  184. switch (ch)
  185. {
  186. case '"':
  187. case '&':
  188. case '<':
  189. num = 0;
  190. break;
  191. default:
  192. num = ch != '\'' ? 1 : 0;
  193. break;
  194. }
  195. if (num == 0)
  196. {
  197. flag = true;
  198. break;
  199. }
  200. }
  201. if (!flag)
  202. return s;
  203. StringBuilder stringBuilder = new StringBuilder();
  204. int length = s.Length;
  205. for (int index = 0; index < length; ++index)
  206. {
  207. char ch = s[index];
  208. switch (ch)
  209. {
  210. case '"':
  211. stringBuilder.Append("&quot;");
  212. break;
  213. case '&':
  214. stringBuilder.Append("&amp;");
  215. break;
  216. case '\'':
  217. stringBuilder.Append("&#39;");
  218. break;
  219. case '<':
  220. stringBuilder.Append("&lt;");
  221. break;
  222. default:
  223. stringBuilder.Append(ch);
  224. break;
  225. }
  226. }
  227. return stringBuilder.ToString();
  228. }
  229. internal static string HtmlDecode(string s)
  230. {
  231. switch (s)
  232. {
  233. case "":
  234. return string.Empty;
  235. case null:
  236. return (string) null;
  237. default:
  238. if (s.IndexOf('&') == -1)
  239. return s;
  240. StringBuilder stringBuilder1 = new StringBuilder();
  241. StringBuilder stringBuilder2 = new StringBuilder();
  242. StringBuilder stringBuilder3 = new StringBuilder();
  243. int length = s.Length;
  244. int num1 = 0;
  245. int num2 = 0;
  246. bool flag1 = false;
  247. bool flag2 = false;
  248. for (int index = 0; index < length; ++index)
  249. {
  250. char ch = s[index];
  251. if (num1 == 0)
  252. {
  253. if (ch == '&')
  254. {
  255. stringBuilder2.Append(ch);
  256. stringBuilder1.Append(ch);
  257. num1 = 1;
  258. }
  259. else
  260. stringBuilder3.Append(ch);
  261. }
  262. else if (ch == '&')
  263. {
  264. num1 = 1;
  265. if (flag2)
  266. {
  267. stringBuilder2.Append(num2.ToString((IFormatProvider) CultureInfo.InvariantCulture));
  268. flag2 = false;
  269. }
  270. stringBuilder3.Append(stringBuilder2.ToString());
  271. stringBuilder2.Length = 0;
  272. stringBuilder2.Append('&');
  273. }
  274. else
  275. {
  276. switch (num1)
  277. {
  278. case 1:
  279. if (ch == ';')
  280. {
  281. num1 = 0;
  282. stringBuilder3.Append(stringBuilder2.ToString());
  283. stringBuilder3.Append(ch);
  284. stringBuilder2.Length = 0;
  285. break;
  286. }
  287. num2 = 0;
  288. flag1 = false;
  289. num1 = ch == '#' ? 3 : 2;
  290. stringBuilder2.Append(ch);
  291. stringBuilder1.Append(ch);
  292. break;
  293. case 2:
  294. stringBuilder2.Append(ch);
  295. if (ch == ';')
  296. {
  297. string str = stringBuilder2.ToString();
  298. if (str.Length > 1 && HttpEncoder.Entities.ContainsKey(str.Substring(1, str.Length - 2)))
  299. str = HttpEncoder.Entities[str.Substring(1, str.Length - 2)].ToString();
  300. stringBuilder3.Append(str);
  301. num1 = 0;
  302. stringBuilder2.Length = 0;
  303. stringBuilder1.Length = 0;
  304. break;
  305. }
  306. break;
  307. case 3:
  308. if (ch == ';')
  309. {
  310. if (num2 == 0)
  311. stringBuilder3.Append(stringBuilder1.ToString() + ";");
  312. else if (num2 > (int) ushort.MaxValue)
  313. {
  314. stringBuilder3.Append("&#");
  315. stringBuilder3.Append(num2.ToString((IFormatProvider) CultureInfo.InvariantCulture));
  316. stringBuilder3.Append(";");
  317. }
  318. else
  319. stringBuilder3.Append((char) num2);
  320. num1 = 0;
  321. stringBuilder2.Length = 0;
  322. stringBuilder1.Length = 0;
  323. flag2 = false;
  324. }
  325. else if (flag1 && Uri.IsHexDigit(ch))
  326. {
  327. num2 = num2 * 16 + Uri.FromHex(ch);
  328. flag2 = true;
  329. stringBuilder1.Append(ch);
  330. }
  331. else if (char.IsDigit(ch))
  332. {
  333. num2 = num2 * 10 + ((int) ch - 48);
  334. flag2 = true;
  335. stringBuilder1.Append(ch);
  336. }
  337. else if (num2 == 0 && (ch == 'x' || ch == 'X'))
  338. {
  339. flag1 = true;
  340. stringBuilder1.Append(ch);
  341. }
  342. else
  343. {
  344. num1 = 2;
  345. if (flag2)
  346. {
  347. stringBuilder2.Append(num2.ToString((IFormatProvider) CultureInfo.InvariantCulture));
  348. flag2 = false;
  349. }
  350. stringBuilder2.Append(ch);
  351. }
  352. break;
  353. }
  354. }
  355. }
  356. if (stringBuilder2.Length > 0)
  357. stringBuilder3.Append(stringBuilder2.ToString());
  358. else if (flag2)
  359. stringBuilder3.Append(num2.ToString((IFormatProvider) CultureInfo.InvariantCulture));
  360. return stringBuilder3.ToString();
  361. }
  362. }
  363. internal static bool NotEncoded(char c) => c == '!' || c == '(' || c == ')' || c == '*' || c == '-' || c == '.' || c == '_';
  364. internal static void UrlEncodeChar(char c, Stream result, bool isUnicode)
  365. {
  366. if (c > 'ÿ')
  367. {
  368. int num = (int) c;
  369. result.WriteByte((byte) 37);
  370. result.WriteByte((byte) 117);
  371. int index1 = num >> 12;
  372. result.WriteByte((byte) HttpEncoder.hexChars[index1]);
  373. int index2 = num >> 8 & 15;
  374. result.WriteByte((byte) HttpEncoder.hexChars[index2]);
  375. int index3 = num >> 4 & 15;
  376. result.WriteByte((byte) HttpEncoder.hexChars[index3]);
  377. int index4 = num & 15;
  378. result.WriteByte((byte) HttpEncoder.hexChars[index4]);
  379. }
  380. else if (c > ' ' && HttpEncoder.NotEncoded(c))
  381. result.WriteByte((byte) c);
  382. else if (c == ' ')
  383. result.WriteByte((byte) 43);
  384. else if (c < '0' || c < 'A' && c > '9' || c > 'Z' && c < 'a' || c > 'z')
  385. {
  386. if (isUnicode && c > '\u007F')
  387. {
  388. result.WriteByte((byte) 37);
  389. result.WriteByte((byte) 117);
  390. result.WriteByte((byte) 48);
  391. result.WriteByte((byte) 48);
  392. }
  393. else
  394. result.WriteByte((byte) 37);
  395. int index5 = (int) c >> 4;
  396. result.WriteByte((byte) HttpEncoder.hexChars[index5]);
  397. int index6 = (int) c & 15;
  398. result.WriteByte((byte) HttpEncoder.hexChars[index6]);
  399. }
  400. else
  401. result.WriteByte((byte) c);
  402. }
  403. internal static void UrlPathEncodeChar(char c, Stream result)
  404. {
  405. if (c < '!' || c > '~')
  406. {
  407. byte[] bytes = Encoding.UTF8.GetBytes(c.ToString());
  408. for (int index1 = 0; index1 < bytes.Length; ++index1)
  409. {
  410. result.WriteByte((byte) 37);
  411. int index2 = (int) bytes[index1] >> 4;
  412. result.WriteByte((byte) HttpEncoder.hexChars[index2]);
  413. int index3 = (int) bytes[index1] & 15;
  414. result.WriteByte((byte) HttpEncoder.hexChars[index3]);
  415. }
  416. }
  417. else if (c == ' ')
  418. {
  419. result.WriteByte((byte) 37);
  420. result.WriteByte((byte) 50);
  421. result.WriteByte((byte) 48);
  422. }
  423. else
  424. result.WriteByte((byte) c);
  425. }
  426. private static void InitEntities()
  427. {
  428. HttpEncoder.entities = new SortedDictionary<string, char>((IComparer<string>) StringComparer.Ordinal);
  429. HttpEncoder.entities.Add("nbsp", ' ');
  430. HttpEncoder.entities.Add("iexcl", '¡');
  431. HttpEncoder.entities.Add("cent", '¢');
  432. HttpEncoder.entities.Add("pound", '£');
  433. HttpEncoder.entities.Add("curren", '¤');
  434. HttpEncoder.entities.Add("yen", '¥');
  435. HttpEncoder.entities.Add("brvbar", '¦');
  436. HttpEncoder.entities.Add("sect", '§');
  437. HttpEncoder.entities.Add("uml", '¨');
  438. HttpEncoder.entities.Add("copy", '©');
  439. HttpEncoder.entities.Add("ordf", 'ª');
  440. HttpEncoder.entities.Add("laquo", '«');
  441. HttpEncoder.entities.Add("not", '¬');
  442. HttpEncoder.entities.Add("shy", '\u00AD');
  443. HttpEncoder.entities.Add("reg", '®');
  444. HttpEncoder.entities.Add("macr", '¯');
  445. HttpEncoder.entities.Add("deg", '°');
  446. HttpEncoder.entities.Add("plusmn", '±');
  447. HttpEncoder.entities.Add("sup2", '\u00B2');
  448. HttpEncoder.entities.Add("sup3", '\u00B3');
  449. HttpEncoder.entities.Add("acute", '´');
  450. HttpEncoder.entities.Add("micro", 'µ');
  451. HttpEncoder.entities.Add("para", '¶');
  452. HttpEncoder.entities.Add("middot", '·');
  453. HttpEncoder.entities.Add("cedil", '¸');
  454. HttpEncoder.entities.Add("sup1", '\u00B9');
  455. HttpEncoder.entities.Add("ordm", 'º');
  456. HttpEncoder.entities.Add("raquo", '»');
  457. HttpEncoder.entities.Add("frac14", '\u00BC');
  458. HttpEncoder.entities.Add("frac12", '\u00BD');
  459. HttpEncoder.entities.Add("frac34", '\u00BE');
  460. HttpEncoder.entities.Add("iquest", '¿');
  461. HttpEncoder.entities.Add("Agrave", 'À');
  462. HttpEncoder.entities.Add("Aacute", 'Á');
  463. HttpEncoder.entities.Add("Acirc", 'Â');
  464. HttpEncoder.entities.Add("Atilde", 'Ã');
  465. HttpEncoder.entities.Add("Auml", 'Ä');
  466. HttpEncoder.entities.Add("Aring", 'Å');
  467. HttpEncoder.entities.Add("AElig", 'Æ');
  468. HttpEncoder.entities.Add("Ccedil", 'Ç');
  469. HttpEncoder.entities.Add("Egrave", 'È');
  470. HttpEncoder.entities.Add("Eacute", 'É');
  471. HttpEncoder.entities.Add("Ecirc", 'Ê');
  472. HttpEncoder.entities.Add("Euml", 'Ë');
  473. HttpEncoder.entities.Add("Igrave", 'Ì');
  474. HttpEncoder.entities.Add("Iacute", 'Í');
  475. HttpEncoder.entities.Add("Icirc", 'Î');
  476. HttpEncoder.entities.Add("Iuml", 'Ï');
  477. HttpEncoder.entities.Add("ETH", 'Ð');
  478. HttpEncoder.entities.Add("Ntilde", 'Ñ');
  479. HttpEncoder.entities.Add("Ograve", 'Ò');
  480. HttpEncoder.entities.Add("Oacute", 'Ó');
  481. HttpEncoder.entities.Add("Ocirc", 'Ô');
  482. HttpEncoder.entities.Add("Otilde", 'Õ');
  483. HttpEncoder.entities.Add("Ouml", 'Ö');
  484. HttpEncoder.entities.Add("times", '×');
  485. HttpEncoder.entities.Add("Oslash", 'Ø');
  486. HttpEncoder.entities.Add("Ugrave", 'Ù');
  487. HttpEncoder.entities.Add("Uacute", 'Ú');
  488. HttpEncoder.entities.Add("Ucirc", 'Û');
  489. HttpEncoder.entities.Add("Uuml", 'Ü');
  490. HttpEncoder.entities.Add("Yacute", 'Ý');
  491. HttpEncoder.entities.Add("THORN", 'Þ');
  492. HttpEncoder.entities.Add("szlig", 'ß');
  493. HttpEncoder.entities.Add("agrave", 'à');
  494. HttpEncoder.entities.Add("aacute", 'á');
  495. HttpEncoder.entities.Add("acirc", 'â');
  496. HttpEncoder.entities.Add("atilde", 'ã');
  497. HttpEncoder.entities.Add("auml", 'ä');
  498. HttpEncoder.entities.Add("aring", 'å');
  499. HttpEncoder.entities.Add("aelig", 'æ');
  500. HttpEncoder.entities.Add("ccedil", 'ç');
  501. HttpEncoder.entities.Add("egrave", 'è');
  502. HttpEncoder.entities.Add("eacute", 'é');
  503. HttpEncoder.entities.Add("ecirc", 'ê');
  504. HttpEncoder.entities.Add("euml", 'ë');
  505. HttpEncoder.entities.Add("igrave", 'ì');
  506. HttpEncoder.entities.Add("iacute", 'í');
  507. HttpEncoder.entities.Add("icirc", 'î');
  508. HttpEncoder.entities.Add("iuml", 'ï');
  509. HttpEncoder.entities.Add("eth", 'ð');
  510. HttpEncoder.entities.Add("ntilde", 'ñ');
  511. HttpEncoder.entities.Add("ograve", 'ò');
  512. HttpEncoder.entities.Add("oacute", 'ó');
  513. HttpEncoder.entities.Add("ocirc", 'ô');
  514. HttpEncoder.entities.Add("otilde", 'õ');
  515. HttpEncoder.entities.Add("ouml", 'ö');
  516. HttpEncoder.entities.Add("divide", '÷');
  517. HttpEncoder.entities.Add("oslash", 'ø');
  518. HttpEncoder.entities.Add("ugrave", 'ù');
  519. HttpEncoder.entities.Add("uacute", 'ú');
  520. HttpEncoder.entities.Add("ucirc", 'û');
  521. HttpEncoder.entities.Add("uuml", 'ü');
  522. HttpEncoder.entities.Add("yacute", 'ý');
  523. HttpEncoder.entities.Add("thorn", 'þ');
  524. HttpEncoder.entities.Add("yuml", 'ÿ');
  525. HttpEncoder.entities.Add("fnof", 'ƒ');
  526. HttpEncoder.entities.Add("Alpha", 'Α');
  527. HttpEncoder.entities.Add("Beta", 'Β');
  528. HttpEncoder.entities.Add("Gamma", 'Γ');
  529. HttpEncoder.entities.Add("Delta", 'Δ');
  530. HttpEncoder.entities.Add("Epsilon", 'Ε');
  531. HttpEncoder.entities.Add("Zeta", 'Ζ');
  532. HttpEncoder.entities.Add("Eta", 'Η');
  533. HttpEncoder.entities.Add("Theta", 'Θ');
  534. HttpEncoder.entities.Add("Iota", 'Ι');
  535. HttpEncoder.entities.Add("Kappa", 'Κ');
  536. HttpEncoder.entities.Add("Lambda", 'Λ');
  537. HttpEncoder.entities.Add("Mu", 'Μ');
  538. HttpEncoder.entities.Add("Nu", 'Ν');
  539. HttpEncoder.entities.Add("Xi", 'Ξ');
  540. HttpEncoder.entities.Add("Omicron", 'Ο');
  541. HttpEncoder.entities.Add("Pi", 'Π');
  542. HttpEncoder.entities.Add("Rho", 'Ρ');
  543. HttpEncoder.entities.Add("Sigma", 'Σ');
  544. HttpEncoder.entities.Add("Tau", 'Τ');
  545. HttpEncoder.entities.Add("Upsilon", 'Υ');
  546. HttpEncoder.entities.Add("Phi", 'Φ');
  547. HttpEncoder.entities.Add("Chi", 'Χ');
  548. HttpEncoder.entities.Add("Psi", 'Ψ');
  549. HttpEncoder.entities.Add("Omega", 'Ω');
  550. HttpEncoder.entities.Add("alpha", 'α');
  551. HttpEncoder.entities.Add("beta", 'β');
  552. HttpEncoder.entities.Add("gamma", 'γ');
  553. HttpEncoder.entities.Add("delta", 'δ');
  554. HttpEncoder.entities.Add("epsilon", 'ε');
  555. HttpEncoder.entities.Add("zeta", 'ζ');
  556. HttpEncoder.entities.Add("eta", 'η');
  557. HttpEncoder.entities.Add("theta", 'θ');
  558. HttpEncoder.entities.Add("iota", 'ι');
  559. HttpEncoder.entities.Add("kappa", 'κ');
  560. HttpEncoder.entities.Add("lambda", 'λ');
  561. HttpEncoder.entities.Add("mu", 'μ');
  562. HttpEncoder.entities.Add("nu", 'ν');
  563. HttpEncoder.entities.Add("xi", 'ξ');
  564. HttpEncoder.entities.Add("omicron", 'ο');
  565. HttpEncoder.entities.Add("pi", 'π');
  566. HttpEncoder.entities.Add("rho", 'ρ');
  567. HttpEncoder.entities.Add("sigmaf", 'ς');
  568. HttpEncoder.entities.Add("sigma", 'σ');
  569. HttpEncoder.entities.Add("tau", 'τ');
  570. HttpEncoder.entities.Add("upsilon", 'υ');
  571. HttpEncoder.entities.Add("phi", 'φ');
  572. HttpEncoder.entities.Add("chi", 'χ');
  573. HttpEncoder.entities.Add("psi", 'ψ');
  574. HttpEncoder.entities.Add("omega", 'ω');
  575. HttpEncoder.entities.Add("thetasym", 'ϑ');
  576. HttpEncoder.entities.Add("upsih", 'ϒ');
  577. HttpEncoder.entities.Add("piv", 'ϖ');
  578. HttpEncoder.entities.Add("bull", '•');
  579. HttpEncoder.entities.Add("hellip", '…');
  580. HttpEncoder.entities.Add("prime", '′');
  581. HttpEncoder.entities.Add("Prime", '″');
  582. HttpEncoder.entities.Add("oline", '‾');
  583. HttpEncoder.entities.Add("frasl", '⁄');
  584. HttpEncoder.entities.Add("weierp", '℘');
  585. HttpEncoder.entities.Add("image", 'ℑ');
  586. HttpEncoder.entities.Add("real", 'ℜ');
  587. HttpEncoder.entities.Add("trade", '™');
  588. HttpEncoder.entities.Add("alefsym", 'ℵ');
  589. HttpEncoder.entities.Add("larr", '←');
  590. HttpEncoder.entities.Add("uarr", '↑');
  591. HttpEncoder.entities.Add("rarr", '→');
  592. HttpEncoder.entities.Add("darr", '↓');
  593. HttpEncoder.entities.Add("harr", '↔');
  594. HttpEncoder.entities.Add("crarr", '↵');
  595. HttpEncoder.entities.Add("lArr", '⇐');
  596. HttpEncoder.entities.Add("uArr", '⇑');
  597. HttpEncoder.entities.Add("rArr", '⇒');
  598. HttpEncoder.entities.Add("dArr", '⇓');
  599. HttpEncoder.entities.Add("hArr", '⇔');
  600. HttpEncoder.entities.Add("forall", '∀');
  601. HttpEncoder.entities.Add("part", '∂');
  602. HttpEncoder.entities.Add("exist", '∃');
  603. HttpEncoder.entities.Add("empty", '∅');
  604. HttpEncoder.entities.Add("nabla", '∇');
  605. HttpEncoder.entities.Add("isin", '∈');
  606. HttpEncoder.entities.Add("notin", '∉');
  607. HttpEncoder.entities.Add("ni", '∋');
  608. HttpEncoder.entities.Add("prod", '∏');
  609. HttpEncoder.entities.Add("sum", '∑');
  610. HttpEncoder.entities.Add("minus", '−');
  611. HttpEncoder.entities.Add("lowast", '∗');
  612. HttpEncoder.entities.Add("radic", '√');
  613. HttpEncoder.entities.Add("prop", '∝');
  614. HttpEncoder.entities.Add("infin", '∞');
  615. HttpEncoder.entities.Add("ang", '∠');
  616. HttpEncoder.entities.Add("and", '∧');
  617. HttpEncoder.entities.Add("or", '∨');
  618. HttpEncoder.entities.Add("cap", '∩');
  619. HttpEncoder.entities.Add("cup", '∪');
  620. HttpEncoder.entities.Add("int", '∫');
  621. HttpEncoder.entities.Add("there4", '∴');
  622. HttpEncoder.entities.Add("sim", '∼');
  623. HttpEncoder.entities.Add("cong", '≅');
  624. HttpEncoder.entities.Add("asymp", '≈');
  625. HttpEncoder.entities.Add("ne", '≠');
  626. HttpEncoder.entities.Add("equiv", '≡');
  627. HttpEncoder.entities.Add("le", '≤');
  628. HttpEncoder.entities.Add("ge", '≥');
  629. HttpEncoder.entities.Add("sub", '⊂');
  630. HttpEncoder.entities.Add("sup", '⊃');
  631. HttpEncoder.entities.Add("nsub", '⊄');
  632. HttpEncoder.entities.Add("sube", '⊆');
  633. HttpEncoder.entities.Add("supe", '⊇');
  634. HttpEncoder.entities.Add("oplus", '⊕');
  635. HttpEncoder.entities.Add("otimes", '⊗');
  636. HttpEncoder.entities.Add("perp", '⊥');
  637. HttpEncoder.entities.Add("sdot", '⋅');
  638. HttpEncoder.entities.Add("lceil", '⌈');
  639. HttpEncoder.entities.Add("rceil", '⌉');
  640. HttpEncoder.entities.Add("lfloor", '⌊');
  641. HttpEncoder.entities.Add("rfloor", '⌋');
  642. HttpEncoder.entities.Add("lang", '〈');
  643. HttpEncoder.entities.Add("rang", '〉');
  644. HttpEncoder.entities.Add("loz", '◊');
  645. HttpEncoder.entities.Add("spades", '♠');
  646. HttpEncoder.entities.Add("clubs", '♣');
  647. HttpEncoder.entities.Add("hearts", '♥');
  648. HttpEncoder.entities.Add("diams", '♦');
  649. HttpEncoder.entities.Add("quot", '"');
  650. HttpEncoder.entities.Add("amp", '&');
  651. HttpEncoder.entities.Add("lt", '<');
  652. HttpEncoder.entities.Add("gt", '>');
  653. HttpEncoder.entities.Add("OElig", 'Œ');
  654. HttpEncoder.entities.Add("oelig", 'œ');
  655. HttpEncoder.entities.Add("Scaron", 'Š');
  656. HttpEncoder.entities.Add("scaron", 'š');
  657. HttpEncoder.entities.Add("Yuml", 'Ÿ');
  658. HttpEncoder.entities.Add("circ", 'ˆ');
  659. HttpEncoder.entities.Add("tilde", '˜');
  660. HttpEncoder.entities.Add("ensp", ' ');
  661. HttpEncoder.entities.Add("emsp", ' ');
  662. HttpEncoder.entities.Add("thinsp", ' ');
  663. HttpEncoder.entities.Add("zwnj", '\u200C');
  664. HttpEncoder.entities.Add("zwj", '\u200D');
  665. HttpEncoder.entities.Add("lrm", '\u200E');
  666. HttpEncoder.entities.Add("rlm", '\u200F');
  667. HttpEncoder.entities.Add("ndash", '–');
  668. HttpEncoder.entities.Add("mdash", '—');
  669. HttpEncoder.entities.Add("lsquo", '‘');
  670. HttpEncoder.entities.Add("rsquo", '’');
  671. HttpEncoder.entities.Add("sbquo", '‚');
  672. HttpEncoder.entities.Add("ldquo", '“');
  673. HttpEncoder.entities.Add("rdquo", '”');
  674. HttpEncoder.entities.Add("bdquo", '„');
  675. HttpEncoder.entities.Add("dagger", '†');
  676. HttpEncoder.entities.Add("Dagger", '‡');
  677. HttpEncoder.entities.Add("permil", '‰');
  678. HttpEncoder.entities.Add("lsaquo", '‹');
  679. HttpEncoder.entities.Add("rsaquo", '›');
  680. HttpEncoder.entities.Add("euro", '€');
  681. }
  682. }
  683. }