send OverlappingStreamData errors for overlapping StreamFrame data

fixes #115
This commit is contained in:
Marten Seemann
2016-06-01 16:57:01 +07:00
parent d10766906c
commit 443fd530db
3 changed files with 10 additions and 21 deletions

View File

@@ -214,12 +214,9 @@ var _ = Describe("Session", func() {
It("closes empty streams with error", func() { It("closes empty streams with error", func() {
testErr := errors.New("test") testErr := errors.New("test")
session.handleStreamFrame(&frames.StreamFrame{ session.newStreamImpl(5)
StreamID: 5,
})
Expect(session.streams).To(HaveLen(2)) Expect(session.streams).To(HaveLen(2))
Expect(session.streams[5]).ToNot(BeNil()) Expect(session.streams[5]).ToNot(BeNil())
Expect(streamCallbackCalled).To(BeTrue())
session.closeStreamsWithError(testErr) session.closeStreamsWithError(testErr)
_, err := session.streams[5].Read([]byte{0}) _, err := session.streams[5].Read([]byte{0})
Expect(err).To(MatchError(testErr)) Expect(err).To(MatchError(testErr))

View File

@@ -254,8 +254,11 @@ func (s *stream) AddStreamFrame(frame *frames.StreamFrame) error {
} }
s.mutex.Lock() s.mutex.Lock()
s.frameQueue.Push(frame) defer s.mutex.Unlock()
s.mutex.Unlock() err := s.frameQueue.Push(frame)
if err != nil && err != errDuplicateStreamData {
return err
}
s.newFrameOrErrCond.Signal() s.newFrameOrErrCond.Signal()
return nil return nil
} }

View File

@@ -190,14 +190,14 @@ var _ = Describe("Stream", func() {
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF})) Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF}))
}) })
It("handles duplicate StreamFrames", func() { It("ignores duplicate StreamFrames", func() {
frame1 := frames.StreamFrame{ frame1 := frames.StreamFrame{
Offset: 0, Offset: 0,
Data: []byte{0xDE, 0xAD}, Data: []byte{0xDE, 0xAD},
} }
frame2 := frames.StreamFrame{ frame2 := frames.StreamFrame{
Offset: 0, Offset: 0,
Data: []byte{0xDE, 0xAD}, Data: []byte{0x13, 0x37},
} }
frame3 := frames.StreamFrame{ frame3 := frames.StreamFrame{
Offset: 2, Offset: 2,
@@ -216,7 +216,7 @@ var _ = Describe("Stream", func() {
Expect(b).To(Equal([]byte{0xDE, 0xAD, 0xBE, 0xEF})) 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{ frame1 := frames.StreamFrame{
Offset: 0, Offset: 0,
Data: []byte("ab"), Data: []byte("ab"),
@@ -225,21 +225,10 @@ var _ = Describe("Stream", func() {
Offset: 1, Offset: 1,
Data: []byte("xy"), Data: []byte("xy"),
} }
frame3 := frames.StreamFrame{
Offset: 2,
Data: []byte("cd"),
}
err := str.AddStreamFrame(&frame1) err := str.AddStreamFrame(&frame1)
Expect(err).ToNot(HaveOccurred()) Expect(err).ToNot(HaveOccurred())
err = str.AddStreamFrame(&frame2) err = str.AddStreamFrame(&frame2)
Expect(err).ToNot(HaveOccurred()) Expect(err).To(MatchError(errOverlappingStreamData))
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")))
}) })
Context("flow control", func() { Context("flow control", func() {