PageRenderTime 27ms CodeModel.GetById 0ms RepoModel.GetById 0ms app.codeStats 0ms

/test/System.Net.Http.Formatting.Test.Integration/FormUrlEncodedFromContentTests.cs

https://bitbucket.org/mdavid/aspnetwebstack
C# | 527 lines | 478 code | 24 blank | 25 comment | 1 complexity | 2e351870eea1a50ebd4445d815f86581 MD5 | raw file
  1. using System.Collections.Generic;
  2. using System.Json;
  3. using System.Net.Http.Formatting.Parsers;
  4. using System.Net.Http.Internal;
  5. using System.Text;
  6. using Newtonsoft.Json.Linq;
  7. using Xunit;
  8. using Xunit.Extensions;
  9. using Assert = Microsoft.TestCommon.AssertEx;
  10. namespace System.Net.Http.Formatting
  11. {
  12. public class FormUrlEncodedJsonFromContentTests
  13. {
  14. #region Tests
  15. [Theory,
  16. InlineData("abc", "{\"abc\":\"\"}"),
  17. InlineData("%2eabc%2e", "{\".abc.\":\"\"}"),
  18. InlineData("", "{}"),
  19. InlineData("a=1", "{\"a\":\"1\"}")]
  20. public void SimpleStringsTest(string encoded, string expectedResult)
  21. {
  22. ValidateFormUrlEncoded(encoded, expectedResult);
  23. }
  24. [Theory,
  25. InlineData("a=2", "{\"a\":\"2\"}"),
  26. InlineData("b=true", "{\"b\":\"true\"}"),
  27. InlineData("c=hello", "{\"c\":\"hello\"}"),
  28. InlineData("d=", "{\"d\":\"\"}"),
  29. InlineData("e=null", "{\"e\":\"null\"}")]
  30. public void SimpleObjectsTest(string encoded, string expectedResult)
  31. {
  32. ValidateFormUrlEncoded(encoded, expectedResult);
  33. }
  34. [Fact]
  35. public void LegacyArraysTest()
  36. {
  37. ValidateFormUrlEncoded("a=1&a=hello&a=333", "{\"a\":[\"1\",\"hello\",\"333\"]}");
  38. // Only valid in shallow serialization
  39. ParseInvalidFormUrlEncoded("a[z]=2&a[z]=3");
  40. }
  41. [Theory,
  42. InlineData("a[]=1&a[]=hello&a[]=333", "{\"a\":[\"1\",\"hello\",\"333\"]}"),
  43. InlineData("a[b][]=1&a[b][]=hello&a[b][]=333", "{\"a\":{\"b\":[\"1\",\"hello\",\"333\"]}}"),
  44. InlineData("a[]=", "{\"a\":[\"\"]}"),
  45. InlineData("a%5B%5D=2", @"{""a"":[""2""]}"),
  46. InlineData("a[x][0]=1&a[x][]=2", @"{""a"":{""x"":[""1"",""2""]}}")]
  47. public void ArraysTest(string encoded, string expectedResult)
  48. {
  49. ValidateFormUrlEncoded(encoded, expectedResult);
  50. }
  51. [Theory,
  52. InlineData("a[0][]=1&a[0][]=hello&a[1][]=333", "{\"a\":[[\"1\",\"hello\"],[\"333\"]]}"),
  53. InlineData("a[b][0][]=1&a[b][1][]=hello&a[b][1][]=333", "{\"a\":{\"b\":[[\"1\"],[\"hello\",\"333\"]]}}"),
  54. InlineData("a[0][0][0][]=1", "{\"a\":[[[[\"1\"]]]]}")]
  55. public void MultidimensionalArraysTest(string encoded, string expectedResult)
  56. {
  57. ValidateFormUrlEncoded(encoded, expectedResult);
  58. }
  59. [Theory,
  60. InlineData("a[0][]=hello&a[2][]=333", "{\"a\":{\"0\":[\"hello\"],\"2\":[\"333\"]}}"),
  61. InlineData("a[0]=hello", "{\"a\":[\"hello\"]}"),
  62. InlineData("a[1][]=hello", "{\"a\":{\"1\":[\"hello\"]}}"),
  63. InlineData("a[1][0]=hello", "{\"a\":{\"1\":[\"hello\"]}}")]
  64. public void SparseArraysTest(string encoded, string expectedResult)
  65. {
  66. ValidateFormUrlEncoded(encoded, expectedResult);
  67. }
  68. [Theory,
  69. InlineData("b[]=2&b[1][c]=d", "{\"b\":[\"2\",{\"c\":\"d\"}]}")]
  70. public void ArraysWithMixedMembers(string encoded, string expectedResult)
  71. {
  72. ValidateFormUrlEncoded(encoded, expectedResult);
  73. }
  74. [Theory,
  75. InlineData("=3", "{\"\":\"3\"}"),
  76. InlineData("a=1&=3", "{\"a\":\"1\",\"\":\"3\"}"),
  77. InlineData("=3&b=2", "{\"\":\"3\",\"b\":\"2\"}")]
  78. public void EmptyKeyTest(string encoded, string expectedResult)
  79. {
  80. ValidateFormUrlEncoded(encoded, expectedResult);
  81. }
  82. [Theory,
  83. InlineData("a[b]=1&a=2"),
  84. InlineData("a[b]=1&a[b][]=2"),
  85. InlineData("a[x][]=1&a[x][0]=2"),
  86. InlineData("a=2&a[b]=1"),
  87. InlineData("[]=1"),
  88. InlineData("a[][]=0"),
  89. InlineData("a[][x]=0"),
  90. InlineData("a&a[b]=1")]
  91. public void InvalidObjectGraphsTest(string encoded)
  92. {
  93. ParseInvalidFormUrlEncoded(encoded);
  94. }
  95. [Theory,
  96. InlineData("a[b=2"),
  97. InlineData("a[[b]=2"),
  98. InlineData("a[b]]=2")]
  99. public void InvalidFormUrlEncodingTest(string encoded)
  100. {
  101. ParseInvalidFormUrlEncoded(encoded);
  102. }
  103. /// <summary>
  104. /// Tests for parsing form-urlencoded data originated from JS primitives.
  105. /// </summary>
  106. [Theory,
  107. InlineData("abc", @"{""abc"":""""}"),
  108. InlineData("123", @"{""123"":""""}"),
  109. InlineData("true", @"{""true"":""""}"),
  110. InlineData("", "{}"),
  111. InlineData("%2fabc%2f", @"{""/abc/"":""""}")]
  112. public void TestJValue(string encoded, string expectedResult)
  113. {
  114. ValidateFormUrlEncoded(encoded, expectedResult);
  115. }
  116. /// <summary>
  117. /// Negative tests for parsing form-urlencoded data originated from JS primitives.
  118. /// </summary>
  119. [Theory,
  120. InlineData("a[b]=1&a=2"),
  121. InlineData("a=2&a[b]=1"),
  122. InlineData("[]=1")]
  123. public void TestJValueNegative(string encoded)
  124. {
  125. ParseInvalidFormUrlEncoded(encoded);
  126. }
  127. /// <summary>
  128. /// Tests for parsing form-urlencoded data originated from JS objects.
  129. /// </summary>
  130. [Theory,
  131. InlineData("a=NaN", @"{""a"":""NaN""}"),
  132. InlineData("a=false", @"{""a"":""false""}"),
  133. InlineData("a=foo", @"{""a"":""foo""}"),
  134. InlineData("1=1", "{\"1\":\"1\"}")]
  135. public void TestObjects(string encoded, string expectedResult)
  136. {
  137. ValidateFormUrlEncoded(encoded, expectedResult);
  138. }
  139. /// <summary>
  140. /// Tests for parsing form-urlencoded data originated from JS arrays.
  141. /// </summary>
  142. [Theory,
  143. InlineData("a[]=2", @"{""a"":[""2""]}"),
  144. InlineData("a[]=", @"{""a"":[""""]}"),
  145. InlineData("a[0][0][]=1", @"{""a"":[[[""1""]]]}"),
  146. InlineData("z[]=9&z[]=true&z[]=undefined&z[]=", @"{""z"":[""9"",""true"",""undefined"",""""]}"),
  147. InlineData("z[]=9&z[]=true&z[]=undefined&z[]=null", @"{""z"":[""9"",""true"",""undefined"",""null""]}"),
  148. InlineData("z[0][]=9&z[0][]=true&z[1][]=undefined&z[1][]=null", @"{""z"":[[""9"",""true""],[""undefined"",""null""]]}"),
  149. InlineData("a[0][x]=2", @"{""a"":[{""x"":""2""}]}"),
  150. InlineData("a%5B%5D=2", @"{""a"":[""2""]}"),
  151. InlineData("a%5B%5D=", @"{""a"":[""""]}"),
  152. InlineData("z%5B%5D=9&z%5B%5D=true&z%5B%5D=undefined&z%5B%5D=", @"{""z"":[""9"",""true"",""undefined"",""""]}"),
  153. InlineData("z%5B%5D=9&z%5B%5D=true&z%5B%5D=undefined&z%5B%5D=null", @"{""z"":[""9"",""true"",""undefined"",""null""]}"),
  154. InlineData("z%5B0%5D%5B%5D=9&z%5B0%5D%5B%5D=true&z%5B1%5D%5B%5D=undefined&z%5B1%5D%5B%5D=null", @"{""z"":[[""9"",""true""],[""undefined"",""null""]]}")]
  155. public void TestArray(string encoded, string expectedResult)
  156. {
  157. ValidateFormUrlEncoded(encoded, expectedResult);
  158. }
  159. /// <summary>
  160. /// Tests for parsing form-urlencoded data originated from JS arrays, using the jQuery 1.3 format (no []'s).
  161. /// </summary>
  162. [Theory,
  163. InlineData("z=9&z=true&z=undefined&z=", @"{""z"":[""9"",""true"",""undefined"",""""]}"),
  164. InlineData("z=9&z=true&z=undefined&z=null", @"{""z"":[""9"",""true"",""undefined"",""null""]}"),
  165. InlineData("z=9&z=true&z=undefined&z=null&a=hello", @"{""z"":[""9"",""true"",""undefined"",""null""],""a"":""hello""}")]
  166. public void TestArrayCompat(string encoded, string expectedResult)
  167. {
  168. ValidateFormUrlEncoded(encoded, expectedResult);
  169. }
  170. /// <summary>
  171. /// Negative tests for parsing form-urlencoded data originated from JS arrays.
  172. /// </summary>
  173. [Theory,
  174. InlineData("a[z]=2&a[z]=3")]
  175. public void TestArrayCompatNegative(string encoded)
  176. {
  177. ParseInvalidFormUrlEncoded(encoded);
  178. }
  179. /// <summary>
  180. /// Tests for form-urlencoded data originated from sparse JS arrays.
  181. /// </summary>
  182. [Theory,
  183. InlineData("a[2]=hello", @"{""a"":{""2"":""hello""}}"),
  184. InlineData("a[x][0]=2", @"{""a"":{""x"":[""2""]}}"),
  185. InlineData("a[x][1]=2", @"{""a"":{""x"":{""1"":""2""}}}"),
  186. InlineData("a[x][0]=0&a[x][1]=1", @"{""a"":{""x"":[""0"",""1""]}}"),
  187. InlineData("a[0][0][0]=hello&a[1][0][0][0][]=hello", @"{""a"":[[[""hello""]],[[[[""hello""]]]]]}"),
  188. InlineData("a[0][0][0]=hello&a[1][0][0][0]=hello", @"{""a"":[[[""hello""]],[[[""hello""]]]]}"),
  189. InlineData("a[1][0][]=1", @"{""a"":{""1"":[[""1""]]}}"),
  190. InlineData("a[1][1][]=1", @"{""a"":{""1"":{""1"":[""1""]}}}"),
  191. InlineData("a[1][1][0]=1", @"{""a"":{""1"":{""1"":[""1""]}}}"),
  192. InlineData("a[0][]=2&a[0][]=3&a[2][]=1", "{\"a\":{\"0\":[\"2\",\"3\"],\"2\":[\"1\"]}}"),
  193. InlineData("a[x][]=1&a[x][1]=2", @"{""a"":{""x"":[""1"",""2""]}}"),
  194. InlineData("a[x][0]=1&a[x][]=2", @"{""a"":{""x"":[""1"",""2""]}}")]
  195. public void TestArraySparse(string encoded, string expectedResult)
  196. {
  197. ValidateFormUrlEncoded(encoded, expectedResult);
  198. }
  199. /// <summary>
  200. /// Negative tests for parsing form-urlencoded arrays.
  201. /// </summary>
  202. [Theory,
  203. InlineData("a[x]=2&a[x][]=3"),
  204. InlineData("a[]=1&a[0][]=2"),
  205. InlineData("a[]=1&a[0][0][]=2"),
  206. InlineData("a[x][]=1&a[x][0]=2"),
  207. InlineData("a[][]=0"),
  208. InlineData("a[][x]=0")]
  209. public void TestArrayIndexNegative(string encoded)
  210. {
  211. ParseInvalidFormUrlEncoded(encoded);
  212. }
  213. public static IEnumerable<object[]> TestObjectTestData
  214. {
  215. get
  216. {
  217. string encoded = "a[]=4&a[]=5&b[x][]=7&b[y]=8&b[z][]=9&b[z][]=true&b[z][]=undefined&b[z][]=&c=1&f=";
  218. string resultStr = @"{""a"":[""4"",""5""],""b"":{""x"":[""7""],""y"":""8"",""z"":[""9"",""true"",""undefined"",""""]},""c"":""1"",""f"":""""}";
  219. yield return new[] { encoded, resultStr };
  220. encoded = "customer[Name]=Pete&customer[Address]=Redmond&customer[Age][0][]=23&customer[Age][0][]=24&customer[Age][1][]=25&" +
  221. "customer[Age][1][]=26&customer[Phones][]=425+888+1111&customer[Phones][]=425+345+7777&customer[Phones][]=425+888+4564&" +
  222. "customer[EnrolmentDate]=%22%5C%2FDate(1276562539537)%5C%2F%22&role=NewRole&changeDate=3&count=15";
  223. resultStr = @"{""customer"":{""Name"":""Pete"",""Address"":""Redmond"",""Age"":[[""23"",""24""],[""25"",""26""]]," +
  224. @"""Phones"":[""425 888 1111"",""425 345 7777"",""425 888 4564""],""EnrolmentDate"":""\""\\/Date(1276562539537)\\/\""""},""role"":""NewRole"",""changeDate"":""3"",""count"":""15""}";
  225. yield return new[] { encoded, resultStr };
  226. encoded = "customers[0][Name]=Pete2&customers[0][Address]=Redmond2&customers[0][Age][0][]=23&customers[0][Age][0][]=24&" +
  227. "customers[0][Age][1][]=25&customers[0][Age][1][]=26&customers[0][Phones][]=425+888+1111&customers[0][Phones][]=425+345+7777&" +
  228. "customers[0][Phones][]=425+888+4564&customers[0][EnrolmentDate]=%22%5C%2FDate(1276634840700)%5C%2F%22&customers[1][Name]=Pete3&" +
  229. "customers[1][Address]=Redmond3&customers[1][Age][0][]=23&customers[1][Age][0][]=24&customers[1][Age][1][]=25&customers[1][Age][1][]=26&" +
  230. "customers[1][Phones][]=425+888+1111&customers[1][Phones][]=425+345+7777&customers[1][Phones][]=425+888+4564&customers[1][EnrolmentDate]=%22%5C%2FDate(1276634840700)%5C%2F%22";
  231. resultStr = @"{""customers"":[{""Name"":""Pete2"",""Address"":""Redmond2"",""Age"":[[""23"",""24""],[""25"",""26""]]," +
  232. @"""Phones"":[""425 888 1111"",""425 345 7777"",""425 888 4564""],""EnrolmentDate"":""\""\\/Date(1276634840700)\\/\""""}," +
  233. @"{""Name"":""Pete3"",""Address"":""Redmond3"",""Age"":[[""23"",""24""],[""25"",""26""]],""Phones"":[""425 888 1111"",""425 345 7777"",""425 888 4564""],""EnrolmentDate"":""\""\\/Date(1276634840700)\\/\""""}]}";
  234. yield return new[] { encoded, resultStr };
  235. encoded = "ab%5B%5D=hello";
  236. resultStr = @"{""ab"":[""hello""]}";
  237. yield return new[] { encoded, resultStr };
  238. encoded = "123=hello";
  239. resultStr = @"{""123"":""hello""}";
  240. yield return new[] { encoded, resultStr };
  241. encoded = "a%5B%5D=1&a";
  242. resultStr = @"{""a"":[""1"",""""]}";
  243. yield return new[] { encoded, resultStr };
  244. encoded = "a=1&a";
  245. resultStr = @"{""a"":[""1"",""""]}";
  246. yield return new[] { encoded, resultStr };
  247. }
  248. }
  249. /// <summary>
  250. /// Tests for parsing complex object graphs form-urlencoded.
  251. /// </summary>
  252. [Theory]
  253. [PropertyData("TestObjectTestData")]
  254. public void TestObject(string encoded, string expectedResult)
  255. {
  256. ValidateFormUrlEncoded(encoded, expectedResult);
  257. }
  258. public static IEnumerable<object[]> TestEncodedNameTestData
  259. {
  260. get
  261. {
  262. string encoded = "some+thing=10";
  263. string resultStr = @"{""some thing"":""10""}";
  264. yield return new[] { encoded, resultStr };
  265. encoded = "%E5%B8%A6%E4%B8%89%E4%B8%AA%E8%A1%A8=bar";
  266. resultStr = @"{""带三个表"":""bar""}";
  267. yield return new[] { encoded, resultStr };
  268. encoded = "some+thing=10&%E5%B8%A6%E4%B8%89%E4%B8%AA%E8%A1%A8=bar";
  269. resultStr = @"{""some thing"":""10"",""带三个表"":""bar""}";
  270. yield return new[] { encoded, resultStr };
  271. encoded = "a[0\r\n][b]=1";
  272. resultStr = "{\"a\":{\"0\\r\\n\":{\"b\":\"1\"}}}";
  273. yield return new[] { encoded, resultStr };
  274. yield return new[] { encoded.Replace("\r", "%0D").Replace("\n", "%0A"), resultStr };
  275. yield return new[] { "a[0\0]=1", "{\"a\":{\"0\\u0000\":\"1\"}}" };
  276. yield return new[] { "a[0%00]=1", "{\"a\":{\"0\\u0000\":\"1\"}}" };
  277. yield return new[] { "a[\00]=1", "{\"a\":{\"\\u00000\":\"1\"}}" };
  278. yield return new[] { "a[%000]=1", "{\"a\":{\"\\u00000\":\"1\"}}" };
  279. }
  280. }
  281. /// <summary>
  282. /// Tests for parsing form-urlencoded data with encoded names.
  283. /// </summary>
  284. [Theory]
  285. [PropertyData("TestEncodedNameTestData")]
  286. public void TestEncodedName(string encoded, string expectedResult)
  287. {
  288. ValidateFormUrlEncoded(encoded, expectedResult);
  289. }
  290. /// <summary>
  291. /// Tests for malformed form-urlencoded data.
  292. /// </summary>
  293. [Theory,
  294. InlineData("a[b=2"),
  295. InlineData("a[[b]=2"),
  296. InlineData("a[b]]=2")]
  297. public void TestNegative(string encoded)
  298. {
  299. ParseInvalidFormUrlEncoded(encoded);
  300. }
  301. /// <summary>
  302. /// Tests for parsing generated form-urlencoded data.
  303. /// </summary>
  304. [Fact]
  305. public void GeneratedJTokenTest()
  306. {
  307. Random rndGen = new Random(1);
  308. int oldMaxArray = CreatorSettings.MaxArrayLength;
  309. int oldMaxList = CreatorSettings.MaxListLength;
  310. int oldMaxStr = CreatorSettings.MaxStringLength;
  311. double oldNullProbability = CreatorSettings.NullValueProbability;
  312. bool oldCreateAscii = CreatorSettings.CreateOnlyAsciiChars;
  313. CreatorSettings.MaxArrayLength = 5;
  314. CreatorSettings.MaxListLength = 3;
  315. CreatorSettings.MaxStringLength = 3;
  316. CreatorSettings.NullValueProbability = 0;
  317. CreatorSettings.CreateOnlyAsciiChars = true;
  318. JTokenCreatorSurrogate jsonValueCreator = new JTokenCreatorSurrogate();
  319. try
  320. {
  321. for (int i = 0; i < 1000; i++)
  322. {
  323. JToken jv = (JToken)jsonValueCreator.CreateInstanceOf(typeof(JToken), rndGen);
  324. if (jv.Type == JTokenType.Array || jv.Type == JTokenType.Object)
  325. {
  326. string jaStr = FormUrlEncoding(jv);
  327. byte[] data = Encoding.UTF8.GetBytes(jaStr);
  328. for (var cnt = 1; cnt <= data.Length; cnt += 4)
  329. {
  330. ICollection<KeyValuePair<string, string>> collection;
  331. FormUrlEncodedParser parser = FormUrlEncodedParserTests.CreateParser(data.Length + 1, out collection);
  332. Assert.NotNull(parser);
  333. int totalBytesConsumed;
  334. ParserState state = FormUrlEncodedParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  335. Assert.Equal(ParserState.Done, state);
  336. Assert.Equal(data.Length, totalBytesConsumed);
  337. JObject deserJo = FormUrlEncodedJson.Parse(collection);
  338. Assert.NotNull(deserJo);
  339. bool compare = true;
  340. if (((IDictionary<string, JToken>)deserJo).ContainsKey("JV"))
  341. {
  342. compare = JTokenRoundTripComparer.Compare(jv, deserJo["JV"]);
  343. }
  344. else
  345. {
  346. compare = JTokenRoundTripComparer.Compare(jv, deserJo);
  347. }
  348. Assert.True(compare, "Comparison failed for test instance " + i);
  349. }
  350. }
  351. }
  352. }
  353. finally
  354. {
  355. CreatorSettings.MaxArrayLength = oldMaxArray;
  356. CreatorSettings.MaxListLength = oldMaxList;
  357. CreatorSettings.MaxStringLength = oldMaxStr;
  358. CreatorSettings.NullValueProbability = oldNullProbability;
  359. CreatorSettings.CreateOnlyAsciiChars = oldCreateAscii;
  360. }
  361. }
  362. #endregion
  363. #region Helpers
  364. private static string FormUrlEncoding(JToken jsonValue)
  365. {
  366. List<string> results = new List<string>();
  367. if (jsonValue is JValue)
  368. {
  369. return UriQueryUtility.UrlEncode(((JValue)jsonValue).Value.ToString());
  370. }
  371. BuildParams("JV", jsonValue, results);
  372. StringBuilder strResult = new StringBuilder();
  373. foreach (var result in results)
  374. {
  375. strResult.Append("&" + result);
  376. }
  377. if (strResult.Length > 0)
  378. {
  379. return strResult.Remove(0, 1).ToString();
  380. }
  381. return strResult.ToString();
  382. }
  383. private static void BuildParams(string prefix, JToken jsonValue, List<string> results)
  384. {
  385. if (jsonValue is JValue)
  386. {
  387. JValue jsonPrimitive = jsonValue as JValue;
  388. if (jsonPrimitive != null)
  389. {
  390. if (jsonPrimitive.Type == JTokenType.String && String.IsNullOrEmpty(jsonPrimitive.Value.ToString()))
  391. {
  392. results.Add(prefix + "=" + String.Empty);
  393. }
  394. else
  395. {
  396. if (jsonPrimitive.Value is DateTime || jsonPrimitive.Value is DateTimeOffset)
  397. {
  398. string dateStr = jsonPrimitive.ToString();
  399. if (!String.IsNullOrEmpty(dateStr) && dateStr.StartsWith("\""))
  400. {
  401. dateStr = dateStr.Substring(1, dateStr.Length - 2);
  402. }
  403. results.Add(prefix + "=" + UriQueryUtility.UrlEncode(dateStr));
  404. }
  405. else
  406. {
  407. results.Add(prefix + "=" + UriQueryUtility.UrlEncode(jsonPrimitive.Value.ToString()));
  408. }
  409. }
  410. }
  411. else
  412. {
  413. results.Add(prefix + "=" + String.Empty);
  414. }
  415. }
  416. else if (jsonValue is JArray)
  417. {
  418. for (int i = 0; i < ((JArray)jsonValue).Count; i++)
  419. {
  420. if (jsonValue[i] is JArray || jsonValue[i] is JObject)
  421. {
  422. BuildParams(prefix + "[" + i + "]", jsonValue[i], results);
  423. }
  424. else
  425. {
  426. BuildParams(prefix + "[]", jsonValue[i], results);
  427. }
  428. }
  429. }
  430. else //jsonValue is JObject
  431. {
  432. foreach (KeyValuePair<string, JToken> item in (JObject)jsonValue)
  433. {
  434. BuildParams(prefix + "[" + item.Key + "]", item.Value, results);
  435. }
  436. }
  437. }
  438. private static void ParseInvalidFormUrlEncoded(string encoded)
  439. {
  440. byte[] data = Encoding.UTF8.GetBytes(encoded);
  441. for (var cnt = 1; cnt <= data.Length; cnt++)
  442. {
  443. ICollection<KeyValuePair<string, string>> collection;
  444. FormUrlEncodedParser parser = FormUrlEncodedParserTests.CreateParser(data.Length + 1, out collection);
  445. Assert.NotNull(parser);
  446. int totalBytesConsumed;
  447. ParserState state = FormUrlEncodedParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  448. Assert.Equal(ParserState.Done, state);
  449. Assert.Equal(data.Length, totalBytesConsumed);
  450. Assert.ThrowsArgument(() => { FormUrlEncodedJson.Parse(collection); }, null);
  451. }
  452. }
  453. private static void ValidateFormUrlEncoded(string encoded, string expectedResult)
  454. {
  455. byte[] data = Encoding.UTF8.GetBytes(encoded);
  456. for (var cnt = 1; cnt <= data.Length; cnt++)
  457. {
  458. ICollection<KeyValuePair<string, string>> collection;
  459. FormUrlEncodedParser parser = FormUrlEncodedParserTests.CreateParser(data.Length + 1, out collection);
  460. Assert.NotNull(parser);
  461. int totalBytesConsumed;
  462. ParserState state = FormUrlEncodedParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed);
  463. Assert.Equal(ParserState.Done, state);
  464. Assert.Equal(data.Length, totalBytesConsumed);
  465. JObject result = FormUrlEncodedJson.Parse(collection);
  466. Assert.NotNull(result);
  467. Assert.Equal(expectedResult, result.ToString(Newtonsoft.Json.Formatting.None));
  468. }
  469. }
  470. #endregion
  471. }
  472. }