forked from quic-go/quic-go
@@ -97,5 +97,9 @@ const MaxIdleTimeout = 1 * time.Minute
|
|||||||
// MaxTimeForCryptoHandshake is the default timeout for a connection until the crypto handshake succeeds.
|
// MaxTimeForCryptoHandshake is the default timeout for a connection until the crypto handshake succeeds.
|
||||||
const MaxTimeForCryptoHandshake = 10 * time.Second
|
const MaxTimeForCryptoHandshake = 10 * time.Second
|
||||||
|
|
||||||
|
// ClosedSessionDeleteTimeout the server ignores packets arriving on a connection that is already closed
|
||||||
|
// after this time all information about the old connection will be deleted
|
||||||
|
const ClosedSessionDeleteTimeout = time.Minute
|
||||||
|
|
||||||
// NumCachedCertificates is the number of cached compressed certificate chains, each taking ~1K space
|
// NumCachedCertificates is the number of cached compressed certificate chains, each taking ~1K space
|
||||||
const NumCachedCertificates = 128
|
const NumCachedCertificates = 128
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ type Server struct {
|
|||||||
|
|
||||||
sessions map[protocol.ConnectionID]packetHandler
|
sessions map[protocol.ConnectionID]packetHandler
|
||||||
sessionsMutex sync.RWMutex
|
sessionsMutex sync.RWMutex
|
||||||
|
deleteClosedSessionsAfter time.Duration
|
||||||
|
|
||||||
streamCallback StreamCallback
|
streamCallback StreamCallback
|
||||||
|
|
||||||
@@ -69,6 +70,7 @@ func NewServer(addr string, tlsConfig *tls.Config, cb StreamCallback) (*Server,
|
|||||||
streamCallback: cb,
|
streamCallback: cb,
|
||||||
sessions: map[protocol.ConnectionID]packetHandler{},
|
sessions: map[protocol.ConnectionID]packetHandler{},
|
||||||
newSession: newSession,
|
newSession: newSession,
|
||||||
|
deleteClosedSessionsAfter: protocol.ClosedSessionDeleteTimeout,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,6 +222,12 @@ func (s *Server) closeCallback(id protocol.ConnectionID) {
|
|||||||
s.sessionsMutex.Lock()
|
s.sessionsMutex.Lock()
|
||||||
s.sessions[id] = nil
|
s.sessions[id] = nil
|
||||||
s.sessionsMutex.Unlock()
|
s.sessionsMutex.Unlock()
|
||||||
|
|
||||||
|
time.AfterFunc(s.deleteClosedSessionsAfter, func() {
|
||||||
|
s.sessionsMutex.Lock()
|
||||||
|
delete(s.sessions, id)
|
||||||
|
s.sessionsMutex.Unlock()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func composeVersionNegotiation(connectionID protocol.ConnectionID) []byte {
|
func composeVersionNegotiation(connectionID protocol.ConnectionID) []byte {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package quic
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"net"
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/lucas-clemente/quic-go/crypto"
|
"github.com/lucas-clemente/quic-go/crypto"
|
||||||
"github.com/lucas-clemente/quic-go/handshake"
|
"github.com/lucas-clemente/quic-go/handshake"
|
||||||
@@ -82,12 +83,23 @@ var _ = Describe("Server", func() {
|
|||||||
err := server.handlePacket(nil, nil, append(firstPacket, (&crypto.NullAEAD{}).Seal(nil, nil, 0, firstPacket)...))
|
err := server.handlePacket(nil, nil, append(firstPacket, (&crypto.NullAEAD{}).Seal(nil, nil, 0, firstPacket)...))
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
Expect(server.sessions).To(HaveLen(1))
|
Expect(server.sessions).To(HaveLen(1))
|
||||||
|
Expect(server.sessions[0x4cfa9f9b668619f6]).ToNot(BeNil())
|
||||||
server.closeCallback(0x4cfa9f9b668619f6)
|
server.closeCallback(0x4cfa9f9b668619f6)
|
||||||
// The server should now have closed the session, leaving a nil value in the sessions map
|
// The server should now have closed the session, leaving a nil value in the sessions map
|
||||||
Expect(server.sessions).To(HaveLen(1))
|
Expect(server.sessions).To(HaveLen(1))
|
||||||
Expect(server.sessions[0x4cfa9f9b668619f6]).To(BeNil())
|
Expect(server.sessions[0x4cfa9f9b668619f6]).To(BeNil())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("deletes nil session entries after a wait time", func() {
|
||||||
|
server.deleteClosedSessionsAfter = 15 * time.Millisecond
|
||||||
|
err := server.handlePacket(nil, nil, append(firstPacket, (&crypto.NullAEAD{}).Seal(nil, nil, 0, firstPacket)...))
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(server.sessions).To(HaveLen(1))
|
||||||
|
server.closeCallback(0x4cfa9f9b668619f6)
|
||||||
|
Consistently(func() map[protocol.ConnectionID]packetHandler { return server.sessions }, 10*time.Millisecond, time.Millisecond).Should(HaveKey(protocol.ConnectionID(0x4cfa9f9b668619f6)))
|
||||||
|
Eventually(func() map[protocol.ConnectionID]packetHandler { return server.sessions }, 100*time.Millisecond).ShouldNot(HaveKey(protocol.ConnectionID(0x4cfa9f9b668619f6)))
|
||||||
|
})
|
||||||
|
|
||||||
It("closes sessions when Close is called", func() {
|
It("closes sessions when Close is called", func() {
|
||||||
session := &mockSession{}
|
session := &mockSession{}
|
||||||
server.sessions[1] = session
|
server.sessions[1] = session
|
||||||
@@ -159,6 +171,14 @@ var _ = Describe("Server", func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("setups with the right values", func() {
|
||||||
|
server, err := NewServer("", testdata.GetTLSConfig(), nil)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(server.deleteClosedSessionsAfter).To(Equal(protocol.ClosedSessionDeleteTimeout))
|
||||||
|
Expect(server.sessions).ToNot(BeNil())
|
||||||
|
Expect(server.scfg).ToNot(BeNil())
|
||||||
|
})
|
||||||
|
|
||||||
It("setups and responds with version negotiation", func(done Done) {
|
It("setups and responds with version negotiation", func(done Done) {
|
||||||
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
|
addr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|||||||
Reference in New Issue
Block a user