private async ValueTask <Http2Error?> HandleResetFrame(FrameHeader fh) { if (fh.StreamId == 0 || fh.Length != ResetFrameData.Size) { var errc = ErrorCode.ProtocolError; if (fh.Length != ResetFrameData.Size) { errc = ErrorCode.FrameSizeError; } return(new Http2Error { StreamId = 0, Code = errc, Message = "接收到无效的RST_STREAM帧头", }); } await inputStream.ReadAll( new ArraySegment <byte>(receiveBuffer, 0, ResetFrameData.Size)); var resetData = ResetFrameData.DecodeFrom( new ArraySegment <byte>(receiveBuffer, 0, ResetFrameData.Size)); StreamImpl stream = null; uint lastOutgoingStream = 0u; uint lastIncomingStream = 0u; lock (shared.Mutex) { lastIncomingStream = shared.LastIncomingStreamId; lastOutgoingStream = shared.LastOutgoingStreamId; shared.streamMap.TryGetValue(fh.StreamId, out stream); if (stream != null) { shared.streamMap.Remove(fh.StreamId); } } if (stream != null) { await stream.Reset(resetData.ErrorCode, true); } else { if (IsIdleStreamId(fh.StreamId, lastOutgoingStream, lastIncomingStream)) { return(new Http2Error { StreamId = 0u, Code = ErrorCode.ProtocolError, Message = "接收到空闲流的RST_STREAM", }); } } return(null); }
public static async Task AssertResetStreamReception( this IReadableByteStream stream, uint expectedStreamId, ErrorCode expectedErrorCode) { var hdr = await stream.ReadFrameHeaderWithTimeout(); Assert.Equal(FrameType.ResetStream, hdr.Type); Assert.Equal(expectedStreamId, hdr.StreamId); Assert.Equal(0, hdr.Flags); Assert.Equal(ResetFrameData.Size, hdr.Length); var resetBytes = new byte[hdr.Length]; await stream.ReadAllWithTimeout(new ArraySegment <byte>(resetBytes)); var resetData = ResetFrameData.DecodeFrom(new ArraySegment <byte>(resetBytes)); Assert.Equal(expectedErrorCode, resetData.ErrorCode); }