public void TestChunked() { string sampleContent = "<test><val>hello</val></test>"; int sampleContentLength = Encoding.UTF8.GetByteCount(sampleContent); string chunk1Content = "<test><val>"; string chunk2Content = "hello</val>"; string chunk3Content = "</test>"; int chunk1ContentLength = Encoding.UTF8.GetByteCount(chunk1Content); int chunk2ContentLength = Encoding.UTF8.GetByteCount(chunk2Content); int chunk3ContentLength = Encoding.UTF8.GetByteCount(chunk3Content); string chunk1Request = "POST / HTTP/1.0\r\nHost: localhost\r\nTransfer-Encoding: chunked\r\n\r\n" + string.Format("{0:X}", chunk1ContentLength) + "\r\n" + chunk1Content + "\r\n"; string chunk2Request = string.Format("{0:X}", chunk2ContentLength) + "\r\n" + chunk2Content + "\r\n"; string chunk3Request = string.Format("{0:X}", chunk3ContentLength) + "\r\n" + chunk3Content + "\r\n"; string chunk4Request = "0\r\n\r\n"; ChunkedBuffer buffer1 = new ChunkedBuffer(pool); buffer1.Write(Encoding.ASCII.GetBytes(chunk1Request), 0, Encoding.ASCII.GetByteCount(chunk1Request)); ChunkedBuffer buffer2 = new ChunkedBuffer(pool); buffer2.Write(Encoding.ASCII.GetBytes(chunk2Request), 0, Encoding.ASCII.GetByteCount(chunk2Request)); ChunkedBuffer buffer3 = new ChunkedBuffer(pool); buffer3.Write(Encoding.ASCII.GetBytes(chunk3Request), 0, Encoding.ASCII.GetByteCount(chunk3Request)); ChunkedBuffer buffer4 = new ChunkedBuffer(pool); buffer4.Write(Encoding.ASCII.GetBytes(chunk4Request), 0, Encoding.ASCII.GetByteCount(chunk4Request)); HttpRequest request = new HttpRequest(pool); Assert.IsFalse(request.IsChunked); Assert.IsFalse(request.Parse(buffer1.Stream, false)); Assert.IsTrue(request.IsChunked); Assert.IsFalse(request.Parse(buffer2.Stream, false)); Assert.IsTrue(request.IsChunked); Assert.IsFalse(request.Parse(buffer3.Stream, false)); Assert.IsTrue(request.IsChunked); Assert.IsTrue(request.Parse(buffer4.Stream, false)); Assert.IsTrue(request.IsChunked); Assert.AreEqual("POST", request.Action); Assert.AreEqual("/", request.Path); Assert.AreEqual("HTTP/1.0", request.Version); Assert.AreEqual("POST / HTTP/1.0", request.CommandLine); Assert.AreEqual("localhost", request.Header["Host"]); Assert.AreEqual(sampleContentLength, request.BodySize); Assert.AreEqual(sampleContentLength, request.Body.WritePosition); MemoryStream stream = new MemoryStream(); request.Write(stream, false); stream.Position = 0; using (StreamReader reader = new StreamReader(stream)) { Assert.AreEqual("POST / HTTP/1.0\r\nHost: localhost\r\nTransfer-Encoding: chunked\r\n\r\n" + sampleContent, reader.ReadToEnd()); } buffer1.Dispose(); buffer2.Dispose(); buffer3.Dispose(); buffer4.Dispose(); request.Dispose(); }
public void TestChunks() { ObjectPool<byte[]> pool = new ObjectPool<byte[]>(() => { return new byte[1024]; }); DummySockNetChannel channel = new DummySockNetChannel() { State = null, IsActive = true, BufferPool = pool }; channel.Pipe = new SockNetChannelPipe(channel); GdsSockNetChannelModule module = new GdsSockNetChannelModule(true); channel.AddModule(module); channel.Connect(); uint streamId = 1; ChunkedBuffer body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("This "), 0, Encoding.UTF8.GetByteCount("This ")); GdsFrame chunk1 = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { "test1", new byte[] { 1 } } , { "test", new byte[] { 1 } } , }, false, body, false); ChunkedBuffer buffer = ToBuffer(chunk1); object receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is ChunkedBuffer); body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("is "), 0, Encoding.UTF8.GetByteCount("is ")); GdsFrame chunk2 = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { "test2", new byte[] { 2 } } , { "test", new byte[] { 2 } } , }, false, body, false); buffer = ToBuffer(chunk2); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is ChunkedBuffer); body = new ChunkedBuffer(pool); body.OfferRaw(Encoding.UTF8.GetBytes("awesome!"), 0, Encoding.UTF8.GetByteCount("awesome!")); GdsFrame chunk3 = GdsFrame.NewContentFrame(streamId, new Dictionary<string, byte[]>() { { "test3", new byte[] { 3 } } , { "test", new byte[] { 3 } } , }, false, body, true); buffer = ToBuffer(chunk3); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is GdsFrame); Assert.AreEqual("This is awesome!", ((GdsFrame)receiveResponse).Body.ToString(Encoding.UTF8)); Assert.AreEqual(1, ((GdsFrame)receiveResponse).Headers["test1"][0]); Assert.AreEqual(2, ((GdsFrame)receiveResponse).Headers["test2"][0]); Assert.AreEqual(3, ((GdsFrame)receiveResponse).Headers["test3"][0]); Assert.AreEqual(3, ((GdsFrame)receiveResponse).Headers["test"][0]); body.Dispose(); chunk1.Dispose(); chunk2.Dispose(); chunk3.Dispose(); Console.WriteLine("Pool stats: " + pool.ObjectsInPool + "/" + pool.TotalNumberOfObjects); }