Ejemplo n.º 1
0
        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);
        }