public void RequestsWithDigits() { foreach (var request in TestRequest.Requests.Where(r => r.Name.StartsWith("digits in "))) { var handler = new Handler(); var parser = new HttpParser(handler); Console.WriteLine("----- Testing request: '" + request.Name + "' -----"); var parsed = parser.Execute(new ArraySegment<byte>(request.Raw)); if (parsed != request.Raw.Length) Assert.Fail("Error while parsing."); AssertRequest(new TestRequest[] { request }, handler.Requests.ToArray(), parser); } }
public void SingleChunk() { // read each request as a single block and parse foreach (var request in TestRequest.Requests) { var handler = new Handler(); var parser = new HttpParser(handler); Console.WriteLine("----- Testing request: '" + request.Name + "' -----"); var parsed = parser.Execute(new ArraySegment<byte>(request.Raw)); if (parsed != request.Raw.Length) Assert.Fail("Error while parsing."); parser.Execute(default(ArraySegment<byte>)); AssertRequest(new TestRequest[] { request }, handler.Requests.ToArray(), parser); } }
static void ThreeChunkScan(IEnumerable<TestRequest> requests) { // read each sequence of requests as three blocks, with the breaks in every possible combination. // one buffer to rule them all var raw = new byte[requests.Aggregate(0, (s, b) => s + b.Raw.Length)]; int where = 0; foreach (var r in requests) { Buffer.BlockCopy(r.Raw, 0, raw, where, r.Raw.Length); where += r.Raw.Length; } int totalOperations = (raw.Length - 1) * (raw.Length - 2) / 2; int operationsCompleted = 0; byte[] buffer1 = new byte[80 * 1024]; byte[] buffer2 = new byte[80 * 1024]; byte[] buffer3 = new byte[80 * 1024]; int buffer1Length = 0, buffer2Length = 0, buffer3Length = 0; Console.WriteLine("----- Testing requests: " + requests.Aggregate("", (s, r) => s + "; " + r.Name).TrimStart(';', ' ') + " (" + totalOperations + " ops) -----"); int lastI = 0; int lastJ = 0; try { for (int j = 2; j < raw.Length; j++) for (int i = 1; i < j; i++) { lastI = i; lastJ = j; //Console.WriteLine(); if (operationsCompleted % 1000 == 0) Console.WriteLine(" " + (100.0 * ((float)operationsCompleted / (float)totalOperations))); operationsCompleted++; //Console.WriteLine(operationsCompleted + " / " + totalOperations); var handler = new Handler(); var parser = new HttpParser(handler); buffer1Length = i; Buffer.BlockCopy(raw, 0, buffer1, 0, buffer1Length); buffer2Length = j - i; Buffer.BlockCopy(raw, i, buffer2, 0, buffer2Length); buffer3Length = raw.Length - j; Buffer.BlockCopy(raw, j, buffer3, 0, buffer3Length); //Console.WriteLine("Parsing buffer 1."); Assert.AreEqual(buffer1Length, parser.Execute(new ArraySegment<byte>(buffer1, 0, buffer1Length)), "Error parsing buffer 1."); //Console.WriteLine("Parsing buffer 2."); Assert.AreEqual(buffer2Length, parser.Execute(new ArraySegment<byte>(buffer2, 0, buffer2Length)), "Error parsing buffer 2."); //Console.WriteLine("Parsing buffer 3."); Assert.AreEqual(buffer3Length, parser.Execute(new ArraySegment<byte>(buffer3, 0, buffer3Length)), "Error parsing buffer 3."); //Console.WriteLine("Parsing EOF"); Assert.AreEqual(parser.Execute(default(ArraySegment<byte>)), 0, "Error parsing EOF chunk."); AssertRequest(requests.ToArray(), handler.Requests.ToArray(), parser); } } catch { Console.WriteLine("Problem while parsing chunks:"); Console.WriteLine("---"); Console.WriteLine(Encoding.UTF8.GetString(buffer1, 0, buffer1Length)); Console.WriteLine("---"); Console.WriteLine(Encoding.UTF8.GetString(buffer2, 0, buffer2Length)); Console.WriteLine("---"); Console.WriteLine(Encoding.UTF8.GetString(buffer3, 0, buffer3Length)); Console.WriteLine("---"); Console.WriteLine("Failed on i = " + lastI + " j = " + lastJ); throw; } }