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); }
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)); }