private static void ValidateFormUrlEncoded(string encoded, string expectedResult) { byte[] data = Encoding.UTF8.GetBytes(encoded); for (var cnt = 1; cnt <= data.Length; cnt++) { ICollection <KeyValuePair <string, string> > collection; FormUrlEncodedParser parser = FormUrlEncodedParserTests.CreateParser( data.Length + 1, out collection ); Assert.NotNull(parser); int totalBytesConsumed; ParserState state = FormUrlEncodedParserTests.ParseBufferInSteps( parser, data, cnt, out totalBytesConsumed ); Assert.Equal(ParserState.Done, state); Assert.Equal(data.Length, totalBytesConsumed); JObject result = FormUrlEncodedJson.Parse(collection); Assert.NotNull(result); Assert.Equal(expectedResult, result.ToString(Newtonsoft.Json.Formatting.None)); } }
private static void ParseInvalidFormUrlEncoded(string encoded) { byte[] data = Encoding.UTF8.GetBytes(encoded); for (var cnt = 1; cnt <= data.Length; cnt++) { ICollection <KeyValuePair <string, string> > collection; FormUrlEncodedParser parser = FormUrlEncodedParserTests.CreateParser( data.Length + 1, out collection ); Assert.NotNull(parser); int totalBytesConsumed; ParserState state = FormUrlEncodedParserTests.ParseBufferInSteps( parser, data, cnt, out totalBytesConsumed ); Assert.Equal(ParserState.Done, state); Assert.Equal(data.Length, totalBytesConsumed); Assert.ThrowsArgument( () => { FormUrlEncodedJson.Parse(collection); }, null ); } }
// Helper to invoke parser around a query string private static IEnumerable <KeyValuePair <string, string> > ParseQueryString(string query) { List <KeyValuePair <string, string> > result = new List <KeyValuePair <string, string> >(); if (String.IsNullOrWhiteSpace(query)) { return(result); } if (query.Length > 0 && query[0] == '?') { query = query.Substring(1); } byte[] bytes = System.Text.Encoding.UTF8.GetBytes(query); FormUrlEncodedParser parser = new FormUrlEncodedParser(result, Int64.MaxValue); int bytesConsumed = 0; ParserState state = parser.ParseBuffer(bytes, bytes.Length, ref bytesConsumed, isFinal: true); if (state != ParserState.Done) { throw new InvalidOperationException(RS.Format(Properties.Resources.FormUrlEncodedParseError, bytesConsumed)); } return(result); }
/// <summary> /// Reads all name-value pairs encoded as HTML Form URL encoded data and add them to /// a collection as UNescaped URI strings. /// </summary> /// <param name="input">Stream to read from.</param> /// <param name="bufferSize">Size of the buffer used to read the contents.</param> /// <returns>Collection of name-value pairs.</returns> private static IEnumerable <KeyValuePair <string, string> > ReadFormUrlEncoded( Stream input, int bufferSize ) { Contract.Assert(input != null, "input stream cannot be null"); Contract.Assert( bufferSize >= MinBufferSize, "buffer size cannot be less than MinBufferSize" ); byte[] data = new byte[bufferSize]; int bytesRead; bool isFinal = false; List <KeyValuePair <string, string> > result = new List <KeyValuePair <string, string> >(); FormUrlEncodedParser parser = new FormUrlEncodedParser(result, Int64.MaxValue); ParserState state; while (true) { try { bytesRead = input.Read(data, 0, data.Length); if (bytesRead == 0) { isFinal = true; } } catch (Exception e) { throw Error.InvalidOperation( e, Properties.Resources.ErrorReadingFormUrlEncodedStream ); } int bytesConsumed = 0; state = parser.ParseBuffer(data, bytesRead, ref bytesConsumed, isFinal); if (state != ParserState.NeedMoreData && state != ParserState.Done) { throw Error.InvalidOperation( Properties.Resources.FormUrlEncodedParseError, bytesConsumed ); } if (isFinal) { return(result); } } }
// Helper to invoke parser around a query string private static IEnumerable <KeyValuePair <string, string> > ParseQueryString(string query) { List <KeyValuePair <string, string> > result = new List <KeyValuePair <string, string> >(); if (String.IsNullOrWhiteSpace(query)) { return(result); } byte[] bytes = Encoding.UTF8.GetBytes(query); FormUrlEncodedParser parser = new FormUrlEncodedParser(result, Int64.MaxValue); int bytesConsumed = 0; ParserState state = parser.ParseBuffer(bytes, bytes.Length, ref bytesConsumed, isFinal: true); if (state != ParserState.Done) { throw Error.InvalidOperation(Resources.FormUrlEncodedParseError, bytesConsumed); } return(result); }
public void GeneratedJTokenTest() { Random rndGen = new Random(1); int oldMaxArray = CreatorSettings.MaxArrayLength; int oldMaxList = CreatorSettings.MaxListLength; int oldMaxStr = CreatorSettings.MaxStringLength; double oldNullProbability = CreatorSettings.NullValueProbability; bool oldCreateAscii = CreatorSettings.CreateOnlyAsciiChars; CreatorSettings.MaxArrayLength = 5; CreatorSettings.MaxListLength = 3; CreatorSettings.MaxStringLength = 3; CreatorSettings.NullValueProbability = 0; CreatorSettings.CreateOnlyAsciiChars = true; JTokenCreatorSurrogate jsonValueCreator = new JTokenCreatorSurrogate(); try { for (int i = 0; i < 1000; i++) { JToken jv = (JToken)jsonValueCreator.CreateInstanceOf(typeof(JToken), rndGen); if (jv.Type == JTokenType.Array || jv.Type == JTokenType.Object) { string jaStr = FormUrlEncoding(jv); byte[] data = Encoding.UTF8.GetBytes(jaStr); for (var cnt = 1; cnt <= data.Length; cnt += 4) { ICollection <KeyValuePair <string, string> > collection; FormUrlEncodedParser parser = FormUrlEncodedParserTests.CreateParser(data.Length + 1, out collection); Assert.NotNull(parser); int totalBytesConsumed; ParserState state = FormUrlEncodedParserTests.ParseBufferInSteps(parser, data, cnt, out totalBytesConsumed); Assert.Equal(ParserState.Done, state); Assert.Equal(data.Length, totalBytesConsumed); JObject deserJo = FormUrlEncodedJson.Parse(collection); Assert.NotNull(deserJo); bool compare = true; if (((IDictionary <string, JToken>)deserJo).ContainsKey("JV")) { compare = JTokenRoundTripComparer.Compare(jv, deserJo["JV"]); } else { compare = JTokenRoundTripComparer.Compare(jv, deserJo); } Assert.True(compare, "Comparison failed for test instance " + i); } } } } finally { CreatorSettings.MaxArrayLength = oldMaxArray; CreatorSettings.MaxListLength = oldMaxList; CreatorSettings.MaxStringLength = oldMaxStr; CreatorSettings.NullValueProbability = oldNullProbability; CreatorSettings.CreateOnlyAsciiChars = oldCreateAscii; } }