public async Task ClientUpgradeRequestShouldYieldStream1() { var inPipe = new BufferedPipe(1024); var outPipe = new BufferedPipe(1024); var upgrade = new ClientUpgradeRequestBuilder().Build(); var config = new ConnectionConfigurationBuilder(false) .Build(); var conn = new Connection( config, inPipe, outPipe, new Connection.Options { Logger = loggerProvider.CreateLogger("http2Con"), ClientUpgradeRequest = upgrade, }); await conn.PerformHandshakes(inPipe, outPipe); var stream = await upgrade.UpgradeRequestStream; Assert.Equal(1u, stream.Id); Assert.Equal(1, conn.ActiveStreamCount); Assert.Equal(StreamState.HalfClosedLocal, stream.State); var readHeadersTask = stream.ReadHeadersAsync(); Assert.False(readHeadersTask.IsCompleted); var hEncoder = new Http2.Hpack.Encoder(); await inPipe.WriteHeaders(hEncoder, 1u, false, DefaultStatusHeaders); Assert.True( await Task.WhenAny( readHeadersTask, Task.Delay(ReadableStreamTestExtensions.ReadTimeout)) == readHeadersTask, "Expected to read headers, got timeout"); var headers = await readHeadersTask; Assert.True(headers.SequenceEqual(DefaultStatusHeaders)); Assert.Equal(StreamState.HalfClosedLocal, stream.State); await inPipe.WriteData(1u, 100, 5, true); var data = await stream.ReadAllToArrayWithTimeout(); Assert.True(data.Length == 100); Assert.Equal(StreamState.Closed, stream.State); Assert.Equal(0, conn.ActiveStreamCount); }
public void TestHPack() { Http2.Hpack.Decoder decoder = new Http2.Hpack.Decoder(); Http2.Hpack.Encoder encoder = new Http2.Hpack.Encoder(); byte[] buffer = new byte[10]; List <HeaderField> headers = new List <HeaderField>() { new HeaderField { Name = ":status", Value = "307", Sensitive = false }, new HeaderField { Name = "cache-control", Value = "private", Sensitive = false }, new HeaderField { Name = "date", Value = "Mon, 21 Oct 2013 20:13:21 GMT", Sensitive = false }, new HeaderField { Name = "location", Value = "https://www.example.com", Sensitive = false }, }; byte[] outBuf = new byte[100]; // Encode a header block fragment into the output buffer var headerBlockFragment = new ArraySegment <byte>(outBuf); // komprimering Http2.Hpack.Encoder.Result encodeResult = encoder.EncodeInto(headerBlockFragment, headers); uint maxHeaderFieldsSize = 100; Http2.Hpack.DecoderExtensions.DecodeFragmentResult decodeResult = decoder.DecodeHeaderBlockFragment(new ArraySegment <byte>(buffer, 0, buffer.Length), maxHeaderFieldsSize, headers); foreach (var item in headers) { Console.WriteLine(item.Name + " " + item.Value); } }
public async Task TheNextOutgoingStreamAfterUpgradeShouldUseId3() { var inPipe = new BufferedPipe(1024); var outPipe = new BufferedPipe(1024); var upgrade = new ClientUpgradeRequestBuilder().Build(); var config = new ConnectionConfigurationBuilder(false) .Build(); var conn = new Connection( config, inPipe, outPipe, new Connection.Options { Logger = loggerProvider.CreateLogger("http2Con"), ClientUpgradeRequest = upgrade, }); await conn.PerformHandshakes(inPipe, outPipe); var stream = await upgrade.UpgradeRequestStream; Assert.Equal(1u, stream.Id); var readHeadersTask = stream.ReadHeadersAsync(); Assert.False(readHeadersTask.IsCompleted); var nextStream = await conn.CreateStreamAsync(DefaultGetHeaders); await outPipe.ReadAndDiscardHeaders(3u, false); Assert.Equal(3u, nextStream.Id); Assert.True(stream != nextStream); Assert.Equal(StreamState.HalfClosedLocal, stream.State); Assert.Equal(StreamState.Open, nextStream.State); var hEncoder = new Http2.Hpack.Encoder(); await inPipe.WriteHeaders(hEncoder, 3u, true, DefaultStatusHeaders); var nextStreamHeaders = await nextStream.ReadHeadersAsync(); Assert.True(nextStreamHeaders.SequenceEqual(DefaultStatusHeaders)); Assert.False(readHeadersTask.IsCompleted); Assert.Equal(StreamState.HalfClosedRemote, nextStream.State); Assert.Equal(StreamState.HalfClosedLocal, stream.State); Assert.Equal(2, conn.ActiveStreamCount); await nextStream.WriteAsync(new ArraySegment <byte>(new byte[0]), true); await outPipe.ReadAndDiscardData(3u, true, 0); Assert.Equal(StreamState.Closed, nextStream.State); Assert.Equal(1, conn.ActiveStreamCount); var headers2 = DefaultStatusHeaders.Append( new HeaderField() { Name = "hh", Value = "vv" }); await inPipe.WriteHeaders(hEncoder, 1u, false, headers2); var streamHeaders = await readHeadersTask; Assert.True(streamHeaders.SequenceEqual(headers2)); await inPipe.WriteData(1u, 10, 0, true); var data = await stream.ReadAllToArrayWithTimeout(); Assert.True(data.Length == 10); Assert.Equal(StreamState.Closed, stream.State); Assert.Equal(0, conn.ActiveStreamCount); }