forked from quic-go/quic-go
send OverlappingStreamData errors for overlapping StreamFrame data
fixes #115
This commit is contained in:
@@ -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))
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user