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); }
public void TestLargeMessage() { 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); WebSocketClientSockNetChannelModule module = new WebSocketClientSockNetChannelModule("/test", "test", null); channel.AddModule(module); channel.Connect(); object sent = null; channel.outgoing.TryTake(out sent, 5000); Assert.IsTrue(sent is HttpRequest); HttpResponse handshakeResponse = null; using (HttpRequest request = (HttpRequest)sent) { handshakeResponse = new HttpResponse(null) { Code = "200", Reason = "OK", Version = "HTTP/1.1" }; handshakeResponse.Header[WebSocketUtil.WebSocketAcceptHeader] = WebSocketUtil.GenerateAccept(request.Header[WebSocketUtil.WebSocketKeyHeader]); } object receiveResponse = handshakeResponse; channel.Receive(ref receiveResponse); Random random = new Random(this.GetHashCode() ^ (int)DateTime.Now.Subtract(new DateTime(2000, 1, 1)).TotalMilliseconds); for (int n = 0; n < 100; n++) { byte[] data = new byte[random.Next(50000, 150000)]; random.NextBytes(data); WebSocketFrame frame = WebSocketFrame.CreateBinaryFrame(data, false); using (ChunkedBuffer buffer = ToBuffer(frame)) { receiveResponse = buffer; channel.Receive(ref receiveResponse); Assert.IsTrue(receiveResponse is WebSocketFrame); Assert.AreEqual(data.Length, ((WebSocketFrame)receiveResponse).Data.Length); for (int i = 0; i < data.Length; i++) { Assert.AreEqual(data[i], ((WebSocketFrame)receiveResponse).Data[i]); } buffer.Close(); } } Console.WriteLine("Pool stats: " + pool.ObjectsInPool + "/" + pool.TotalNumberOfObjects); }
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); }
public void TestContinuation() { 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); WebSocketClientSockNetChannelModule module = new WebSocketClientSockNetChannelModule("/test", "test", null); channel.AddModule(module); channel.Connect(); object sent = null; channel.outgoing.TryTake(out sent, 5000); Assert.IsTrue(sent is HttpRequest); HttpRequest request = (HttpRequest)sent; HttpResponse handshakeResponse = new HttpResponse(channel.BufferPool) { Code = "200", Reason = "OK", Version = "HTTP/1.1" }; handshakeResponse.Header[WebSocketUtil.WebSocketAcceptHeader] = WebSocketUtil.GenerateAccept(request.Header[WebSocketUtil.WebSocketKeyHeader]); object receiveResponse = handshakeResponse; channel.Receive(ref receiveResponse); WebSocketFrame continuation1 = WebSocketFrame.CreateTextFrame("This ", false, false, false); ChunkedBuffer buffer = ToBuffer(continuation1); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is ChunkedBuffer); WebSocketFrame continuation2 = WebSocketFrame.CreateTextFrame("is ", false, true, false); buffer = ToBuffer(continuation2); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is ChunkedBuffer); WebSocketFrame continuation3 = WebSocketFrame.CreateTextFrame("awesome!", false, true, true); buffer = ToBuffer(continuation3); receiveResponse = buffer; channel.Receive(ref receiveResponse); buffer.Close(); Assert.IsTrue(receiveResponse is WebSocketFrame); Assert.AreEqual("This is awesome!", ((WebSocketFrame)receiveResponse).DataAsString); Console.WriteLine("Pool stats: " + pool.ObjectsInPool + "/" + pool.TotalNumberOfObjects); }