From 443fd530db12dce220d9727e5e393956b75b9242 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 1 Jun 2016 16:57:01 +0700 Subject: [PATCH] send OverlappingStreamData errors for overlapping StreamFrame data fixes #115 --- session_test.go | 5 +---- stream.go | 7 +++++-- stream_test.go | 19 ++++--------------- 3 files changed, 10 insertions(+), 21 deletions(-) diff --git a/session_test.go b/session_test.go index 3f35a9dd2..8a96fa9ec 100644 --- a/session_test.go +++ b/session_test.go @@ -214,12 +214,9 @@ var _ = Describe("Session", func() { It("closes empty streams with error", func() { testErr := errors.New("test") - session.handleStreamFrame(&frames.StreamFrame{ - StreamID: 5, - }) + session.newStreamImpl(5) Expect(session.streams).To(HaveLen(2)) Expect(session.streams[5]).ToNot(BeNil()) - Expect(streamCallbackCalled).To(BeTrue()) session.closeStreamsWithError(testErr) _, err := session.streams[5].Read([]byte{0}) Expect(err).To(MatchError(testErr)) diff --git a/stream.go b/stream.go index a0813b2ae..7cd0cd42b 100644 --- a/stream.go +++ b/stream.go @@ -254,8 +254,11 @@ func (s *stream) AddStreamFrame(frame *frames.StreamFrame) error { } s.mutex.Lock() - s.frameQueue.Push(frame) - s.mutex.Unlock() + defer s.mutex.Unlock() + err := s.frameQueue.Push(frame) + if err != nil && err != errDuplicateStreamData { + return err + } s.newFrameOrErrCond.Signal() return nil } diff --git a/stream_test.go b/stream_test.go index d1c3c2fa1..ad8458d7f 100644 --- a/stream_test.go +++ b/stream_test.go @@ -190,14 +190,14 @@ var _ = Describe("Stream", func() { Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF})) }) - It("handles duplicate StreamFrames", func() { + It("ignores duplicate StreamFrames", func() { frame1 := frames.StreamFrame{ Offset: 0, Data: []byte{0xDE, 0xAD}, } frame2 := frames.StreamFrame{ Offset: 0, - Data: []byte{0xDE, 0xAD}, + Data: []byte{0x13, 0x37}, } frame3 := frames.StreamFrame{ Offset: 2, @@ -216,7 +216,7 @@ var _ = Describe("Stream", func() { Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF})) }) - PIt("discards unneeded str frames", func() { + It("rejects a StreamFrames with an overlapping data range", func() { frame1 := frames.StreamFrame{ Offset: 0, Data: []byte("ab"), @@ -225,21 +225,10 @@ var _ = Describe("Stream", func() { Offset: 1, Data: []byte("xy"), } - frame3 := frames.StreamFrame{ - Offset: 2, - Data: []byte("cd"), - } err := str.AddStreamFrame(&frame1) Expect(err).ToNot(HaveOccurred()) err = str.AddStreamFrame(&frame2) - Expect(err).ToNot(HaveOccurred()) - err = str.AddStreamFrame(&frame3) - Expect(err).ToNot(HaveOccurred()) - b := make([]byte, 4) - n, err := str.Read(b) - Expect(err).ToNot(HaveOccurred()) - Expect(n).To(Equal(4)) - Expect(b).To(Equal([]byte("abyd"))) + Expect(err).To(MatchError(errOverlappingStreamData)) }) Context("flow control", func() {