/// <summary> /// Updates the given chunked frame with a new frame. /// </summary> /// <param name="frame"></param> private static void UpdateChunk(ref GdsFrame chunkedFrame, GdsFrame frame, ISockNetChannel channel) { if (chunkedFrame == null) { chunkedFrame = frame; // set initial frame } else { if (frame.Type == GdsFrame.GdsFrameType.Ping || frame.Type == GdsFrame.GdsFrameType.Pong || frame.Type == GdsFrame.GdsFrameType.Close) { chunkedFrame = frame; } GdsFrame.GdsFrameType type = chunkedFrame.Type; ChunkedBuffer body = null; if (frame.Type == GdsFrame.GdsFrameType.BodyOnly || frame.Type == GdsFrame.GdsFrameType.Full) { if (type == GdsFrame.GdsFrameType.HeadersOnly) { type = GdsFrame.GdsFrameType.Full; } body = new ChunkedBuffer(channel.BufferPool); chunkedFrame.Body.DrainToStreamSync(body.Stream).Close(); frame.Body.DrainToStreamSync(body.Stream).Close(); } Dictionary <string, byte[]> headers = null; if (frame.Type == GdsFrame.GdsFrameType.HeadersOnly || frame.Type == GdsFrame.GdsFrameType.Full) { if (type == GdsFrame.GdsFrameType.BodyOnly) { type = GdsFrame.GdsFrameType.Full; } headers = new Dictionary <string, byte[]>(StringComparer.OrdinalIgnoreCase); foreach (KeyValuePair <string, byte[]> kvp in chunkedFrame.Headers) { headers[kvp.Key] = kvp.Value; } foreach (KeyValuePair <string, byte[]> kvp in frame.Headers) { headers[kvp.Key] = kvp.Value; } } chunkedFrame.Dispose(); frame.Dispose(); chunkedFrame = GdsFrame.NewContentFrame(frame.StreamId, headers, false, body, frame.IsComplete); } }
public void TestHeaderOnlyNotCompressed() { ObjectPool <byte[]> pool = new ObjectPool <byte[]>(() => { return(new byte[1024]); }); Random rand = new Random(this.GetHashCode() ^ DateTime.Now.Millisecond); uint streamId = (uint)rand.Next(0, (int)(Math.Pow(2, 24) - 1)); string header1Key = "the first key"; byte[] header1Value = new byte[rand.Next(32, 1024 * 64)]; rand.NextBytes(header1Value); string header2Key = "the second key"; byte[] header2Value = new byte[rand.Next(32, 1024 * 64)]; rand.NextBytes(header2Value); GdsFrame frame = GdsFrame.NewContentFrame(streamId, new Dictionary <string, byte[]>() { { header1Key, header1Value }, { header2Key, header2Value } }, false, null, true); Assert.AreEqual(true, frame.IsComplete); Assert.AreEqual(GdsFrame.GdsFrameType.HeadersOnly, frame.Type); Assert.AreEqual(streamId, frame.StreamId); Assert.AreEqual(2, frame.Headers.Count); MemoryStream stream = new MemoryStream(); frame.Write(stream); Assert.AreEqual( 4 // frame definition + 2 // header definition + (4 * 2) // header sizes for two headers + header1Key.Length + header1Value.Length + header2Key.Length + header2Value.Length , stream.Position); stream.Position = 0; GdsFrame readFrame = GdsFrame.ParseFrame(stream, pool); Assert.AreEqual(true, readFrame.IsComplete); Assert.AreEqual(GdsFrame.GdsFrameType.HeadersOnly, readFrame.Type); Assert.AreEqual(streamId, readFrame.StreamId); Assert.AreEqual(2, readFrame.Headers.Count); AssertEquals(header1Value, readFrame.Headers[header1Key]); AssertEquals(header2Value, readFrame.Headers[header2Key]); }