forked from quic-go/quic-go
12
session.go
12
session.go
@@ -24,6 +24,7 @@ type receivedPacket struct {
|
||||
|
||||
var (
|
||||
errInvalidStreamID = errors.New("STREAM_FRAME with invalid StreamID received")
|
||||
errReopeningStreamsNotAllowed = errors.New("Reopening Streams not allowed")
|
||||
errRstStreamOnInvalidStream = errors.New("RST_STREAM received for unknown stream")
|
||||
errWindowUpdateOnInvalidStream = errors.New("WINDOW_UPDATE received for unknown stream")
|
||||
)
|
||||
@@ -190,6 +191,7 @@ func (s *Session) handlePacket(remoteAddr interface{}, publicHeader *PublicHeade
|
||||
case *frames.StreamFrame:
|
||||
utils.Debugf("\t<- &frames.StreamFrame{StreamID: %d, FinBit: %t, Offset: %d}", frame.StreamID, frame.FinBit, frame.Offset)
|
||||
err = s.handleStreamFrame(frame)
|
||||
// TODO: send RstStreamFrame
|
||||
case *frames.AckFrame:
|
||||
err = s.handleAckFrame(frame)
|
||||
case *frames.ConnectionCloseFrame:
|
||||
@@ -226,20 +228,20 @@ func (s *Session) HandlePacket(remoteAddr interface{}, publicHeader *PublicHeade
|
||||
|
||||
// TODO: Ignore data for closed streams
|
||||
func (s *Session) handleStreamFrame(frame *frames.StreamFrame) error {
|
||||
if !s.isValidStreamID(frame.StreamID) {
|
||||
return errInvalidStreamID
|
||||
}
|
||||
|
||||
s.streamsMutex.RLock()
|
||||
str, streamExists := s.streams[frame.StreamID]
|
||||
s.streamsMutex.RUnlock()
|
||||
|
||||
if !streamExists {
|
||||
if !s.isValidStreamID(frame.StreamID) {
|
||||
return errInvalidStreamID
|
||||
}
|
||||
|
||||
ss, _ := s.NewStream(frame.StreamID)
|
||||
str = ss.(*stream)
|
||||
}
|
||||
if str == nil {
|
||||
return errors.New("Session: reopening streams is not allowed")
|
||||
return errReopeningStreamsNotAllowed
|
||||
}
|
||||
err := str.AddStreamFrame(frame)
|
||||
if err != nil {
|
||||
|
||||
@@ -122,6 +122,16 @@ var _ = Describe("Session", func() {
|
||||
Expect(err).To(Equal(errInvalidStreamID))
|
||||
})
|
||||
|
||||
It("does not reject existing streams with even StreamIDs", func() {
|
||||
_, err := session.NewStream(4)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
err = session.handleStreamFrame(&frames.StreamFrame{
|
||||
StreamID: 4,
|
||||
Data: []byte{0xde, 0xca, 0xfb, 0xad},
|
||||
})
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
})
|
||||
|
||||
It("handles existing streams", func() {
|
||||
session.handleStreamFrame(&frames.StreamFrame{
|
||||
StreamID: 5,
|
||||
@@ -208,7 +218,8 @@ var _ = Describe("Session", func() {
|
||||
StreamID: 5,
|
||||
Data: []byte{},
|
||||
})
|
||||
Expect(err).To(MatchError("Session: reopening streams is not allowed"))
|
||||
Expect(err).To(HaveOccurred())
|
||||
Expect(err).To(Equal(errReopeningStreamsNotAllowed))
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user