forked from quic-go/quic-go
27
session.go
27
session.go
@@ -165,18 +165,8 @@ func (s *Session) run() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
switch err {
|
|
||||||
case ackhandler.ErrDuplicateOrOutOfOrderAck:
|
|
||||||
// Can happen e.g. when packets thought missing arrive late
|
|
||||||
case errRstStreamOnInvalidStream:
|
|
||||||
// Can happen when RST_STREAMs arrive early or late (?)
|
|
||||||
utils.Errorf("Ignoring error in session: %s", err.Error())
|
|
||||||
case errWindowUpdateOnClosedStream:
|
|
||||||
// Can happen when we already sent the last StreamFrame with the FinBit, but the client already sent a WindowUpdate for this Stream
|
|
||||||
default:
|
|
||||||
s.Close(err)
|
s.Close(err)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if err := s.maybeSendPacket(); err != nil {
|
if err := s.maybeSendPacket(); err != nil {
|
||||||
s.Close(err)
|
s.Close(err)
|
||||||
@@ -240,7 +230,11 @@ func (s *Session) handlePacketImpl(remoteAddr interface{}, hdr *publicHeader, da
|
|||||||
|
|
||||||
s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, packet.entropyBit)
|
s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, packet.entropyBit)
|
||||||
|
|
||||||
for _, ff := range packet.frames {
|
return s.handleFrames(packet.frames)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Session) handleFrames(fs []frames.Frame) error {
|
||||||
|
for _, ff := range fs {
|
||||||
var err error
|
var err error
|
||||||
frames.LogFrame(ff, false)
|
frames.LogFrame(ff, false)
|
||||||
switch frame := ff.(type) {
|
switch frame := ff.(type) {
|
||||||
@@ -264,10 +258,21 @@ func (s *Session) handlePacketImpl(remoteAddr interface{}, hdr *publicHeader, da
|
|||||||
default:
|
default:
|
||||||
return errors.New("Session BUG: unexpected frame type")
|
return errors.New("Session BUG: unexpected frame type")
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
switch err {
|
||||||
|
case ackhandler.ErrDuplicateOrOutOfOrderAck:
|
||||||
|
// Can happen e.g. when packets thought missing arrive late
|
||||||
|
case errRstStreamOnInvalidStream:
|
||||||
|
// Can happen when RST_STREAMs arrive early or late (?)
|
||||||
|
utils.Errorf("Ignoring error in session: %s", err.Error())
|
||||||
|
case errWindowUpdateOnClosedStream:
|
||||||
|
// Can happen when we already sent the last StreamFrame with the FinBit, but the client already sent a WindowUpdate for this Stream
|
||||||
|
default:
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -705,4 +705,21 @@ var _ = Describe("Session", func() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Context("ignoring errors", func() {
|
||||||
|
It("ignores duplicate acks", func() {
|
||||||
|
session.sentPacketHandler.SentPacket(&ackhandler.Packet{
|
||||||
|
PacketNumber: 1,
|
||||||
|
Length: 1,
|
||||||
|
})
|
||||||
|
err := session.handleFrames([]frames.Frame{&frames.AckFrame{
|
||||||
|
LargestObserved: 1,
|
||||||
|
}})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
err = session.handleFrames([]frames.Frame{&frames.AckFrame{
|
||||||
|
LargestObserved: 1,
|
||||||
|
}})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user