public static async Task AssertWindowUpdate(
            this IReadableByteStream stream,
            uint expectedStreamId,
            int increment)
        {
            var header = await stream.ReadFrameHeaderWithTimeout();

            Assert.Equal(FrameType.WindowUpdate, header.Type);
            Assert.Equal(WindowUpdateData.Size, header.Length);
            Assert.Equal(0, header.Flags);
            Assert.Equal(expectedStreamId, header.StreamId);
            var buf = new byte[WindowUpdateData.Size];
            await stream.ReadAllWithTimeout(new ArraySegment <byte>(buf));

            var wu = WindowUpdateData.DecodeFrom(new ArraySegment <byte>(buf));

            Assert.Equal(increment, wu.WindowSizeIncrement);
        }
Exemple #2
0
        private async ValueTask <Http2Error?> HandleWindowUpdateFrame(FrameHeader fh)
        {
            if (fh.Length != WindowUpdateData.Size)
            {
                return(new Http2Error
                {
                    StreamId = 0,
                    Code = ErrorCode.FrameSizeError,
                    Message = "收到无效的窗口更新帧头",
                });
            }

            await inputStream.ReadAll(
                new ArraySegment <byte>(receiveBuffer, 0, WindowUpdateData.Size));

            var windowUpdateData = WindowUpdateData.DecodeFrom(
                new ArraySegment <byte>(receiveBuffer, 0, WindowUpdateData.Size));

            bool isIdleStream = false;

            lock (shared.Mutex)
            {
                isIdleStream = IsIdleStreamId(
                    fh.StreamId, shared.LastOutgoingStreamId, shared.LastIncomingStreamId);
            }

            if (isIdleStream)
            {
                return(new Http2Error
                {
                    StreamId = 0u,
                    Code = ErrorCode.ProtocolError,
                    Message = "接收到空闲流的窗口更新",
                });
            }

            return(writer.UpdateFlowControlWindow(
                       fh.StreamId, windowUpdateData.WindowSizeIncrement));
        }