From 9888db457fbf5f27144d286125683887e21ed3bc Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 22 Jan 2019 20:57:06 +0700 Subject: [PATCH] don't send a STOP_SENDING if the stream was already reset by the peer --- receive_stream.go | 5 +---- receive_stream_test.go | 45 ++++++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/receive_stream.go b/receive_stream.go index 4aa76b53..87f8f752 100644 --- a/receive_stream.go +++ b/receive_stream.go @@ -190,10 +190,7 @@ func (s *receiveStream) CancelRead(errorCode protocol.ApplicationErrorCode) erro s.mutex.Lock() defer s.mutex.Unlock() - if s.finRead { - return nil - } - if s.canceledRead { + if s.finRead || s.canceledRead || s.resetRemotely { return nil } s.canceledRead = true diff --git a/receive_stream_test.go b/receive_stream_test.go index 5b539a86..be933e6b 100644 --- a/receive_stream_test.go +++ b/receive_stream_test.go @@ -481,30 +481,37 @@ var _ = Describe("Receive Stream", func() { Expect(err).To(MatchError("Read on stream 1337 canceled with error code 1234")) }) - It("doesn't send a RESET_STREAM frame, if the FIN was already read", func() { - mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(6), true) - mockFC.EXPECT().AddBytesRead(protocol.ByteCount(6)) - // no calls to mockSender.queueControlFrame - err := str.handleStreamFrame(&wire.StreamFrame{ - StreamID: streamID, - Data: []byte("foobar"), - FinBit: true, - }) - Expect(err).ToNot(HaveOccurred()) - mockSender.EXPECT().onStreamCompleted(streamID) - _, err = strWithTimeout.Read(make([]byte, 100)) - Expect(err).To(MatchError(io.EOF)) - err = str.CancelRead(1234) - Expect(err).ToNot(HaveOccurred()) - }) - It("queues a STOP_SENDING frame", func() { mockSender.EXPECT().queueControlFrame(&wire.StopSendingFrame{ StreamID: streamID, ErrorCode: 1234, }) - err := str.CancelRead(1234) - Expect(err).ToNot(HaveOccurred()) + Expect(str.CancelRead(1234)).To(Succeed()) + }) + + It("doesn't send a STOP_SENDING frame, if the FIN was already read", func() { + mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(6), true) + mockFC.EXPECT().AddBytesRead(protocol.ByteCount(6)) + // no calls to mockSender.queueControlFrame + Expect(str.handleStreamFrame(&wire.StreamFrame{ + StreamID: streamID, + Data: []byte("foobar"), + FinBit: true, + })).To(Succeed()) + mockSender.EXPECT().onStreamCompleted(streamID) + _, err := strWithTimeout.Read(make([]byte, 100)) + Expect(err).To(MatchError(io.EOF)) + Expect(str.CancelRead(1234)).To(Succeed()) + }) + + It("doesn't send a STOP_SENDING frame, if the stream was already reset", func() { + mockFC.EXPECT().UpdateHighestReceived(protocol.ByteCount(42), true) + mockSender.EXPECT().onStreamCompleted(streamID) + Expect(str.handleResetStreamFrame(&wire.ResetStreamFrame{ + StreamID: streamID, + ByteOffset: 42, + })).To(Succeed()) + Expect(str.CancelRead(1234)).To(Succeed()) }) })