forked from quic-go/quic-go
@@ -22,7 +22,7 @@ const (
|
||||
QUIC_PEER_GOING_AWAY = protocol.ErrorCode(16)
|
||||
QUIC_INVALID_STREAM_ID = protocol.ErrorCode(17)
|
||||
QUIC_TOO_MANY_OPEN_STREAMS = protocol.ErrorCode(18)
|
||||
// QUIC_CONNECTION_TIMED_OUT= We hit our pre-negotiated (or default) timeout
|
||||
QUIC_NETWORK_IDLE_TIMEOUT = protocol.ErrorCode(25)
|
||||
QUIC_CRYPTO_TAGS_OUT_OF_ORDER = protocol.ErrorCode(29)
|
||||
QUIC_CRYPTO_TOO_MANY_ENTRIES = protocol.ErrorCode(30)
|
||||
QUIC_CRYPTO_INVALID_VALUE_LENGTH = protocol.ErrorCode(31)
|
||||
|
||||
@@ -79,14 +79,13 @@ func (h *ConnectionParametersManager) GetStreamFlowControlWindow() (protocol.Byt
|
||||
}
|
||||
|
||||
// GetIdleConnectionStateLifetime gets the idle timeout
|
||||
func (h *ConnectionParametersManager) GetIdleConnectionStateLifetime() (time.Duration, error) {
|
||||
func (h *ConnectionParametersManager) GetIdleConnectionStateLifetime() time.Duration {
|
||||
rawValue, err := h.GetRawValue(TagICSL)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
panic("ConnectionParameters: Could not find ICSL")
|
||||
}
|
||||
|
||||
if len(rawValue) != 4 {
|
||||
return 0, errors.New("expected uint32 for ICSL")
|
||||
panic("ConnectionParameters: ICSL has invalid value")
|
||||
}
|
||||
return time.Duration(binary.LittleEndian.Uint32(rawValue)) * time.Second, nil
|
||||
return time.Duration(binary.LittleEndian.Uint32(rawValue)) * time.Second
|
||||
}
|
||||
|
||||
@@ -62,8 +62,7 @@ var _ = Describe("ConnectionsParameterManager", func() {
|
||||
|
||||
It("gets idle connection state lifetime", func() {
|
||||
cpm.params[TagICSL] = []byte{0xad, 0xfb, 0xca, 0xde}
|
||||
val, err := cpm.GetIdleConnectionStateLifetime()
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
val := cpm.GetIdleConnectionStateLifetime()
|
||||
Expect(val).To(Equal(0xdecafbad * time.Second))
|
||||
})
|
||||
})
|
||||
|
||||
@@ -119,6 +119,8 @@ func (s *Session) Run() {
|
||||
s.scheduleSending()
|
||||
case <-s.sendingScheduled:
|
||||
err = s.sendPacket()
|
||||
case <-time.After(s.connectionParametersManager.GetIdleConnectionStateLifetime()):
|
||||
s.Close(protocol.NewQuicError(errorcodes.QUIC_NETWORK_IDLE_TIMEOUT, "No recent network activity."), true)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
||||
@@ -45,6 +45,9 @@ var _ = Describe("Session", func() {
|
||||
streams: make(map[protocol.StreamID]*stream),
|
||||
streamCallback: func(*Session, utils.Stream) { callbackCalled = true },
|
||||
connectionParametersManager: handshake.NewConnectionParamatersManager(),
|
||||
closeChan: make(chan struct{}, 1),
|
||||
closeCallback: func(*Session) {},
|
||||
packer: &packetPacker{aead: &crypto.NullAEAD{}},
|
||||
}
|
||||
})
|
||||
|
||||
@@ -344,4 +347,13 @@ var _ = Describe("Session", func() {
|
||||
Expect(conn.written).To(HaveLen(1))
|
||||
Expect(conn.written[0]).To(ContainSubstring(string([]byte("PRST"))))
|
||||
})
|
||||
|
||||
It("times out", func(done Done) {
|
||||
session.connectionParametersManager.SetFromMap(map[handshake.Tag][]byte{
|
||||
handshake.TagICSL: {0, 0, 0, 0},
|
||||
})
|
||||
session.Run() // Would normally not return
|
||||
Expect(conn.written[0]).To(ContainSubstring("No recent network activity."))
|
||||
close(done)
|
||||
}, 0.5)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user