mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-04 20:57:36 +03:00
make Listener a struct, not an interface
This commit is contained in:
parent
2a03c6cd79
commit
1b64b13750
16 changed files with 53 additions and 37 deletions
|
@ -20,7 +20,7 @@ var _ = Describe("Stream Cancellations", func() {
|
||||||
const numStreams = 80
|
const numStreams = 80
|
||||||
|
|
||||||
Context("canceling the read side", func() {
|
Context("canceling the read side", func() {
|
||||||
var server quic.Listener
|
var server *quic.Listener
|
||||||
|
|
||||||
// The server accepts a single connection, and then opens numStreams unidirectional streams.
|
// The server accepts a single connection, and then opens numStreams unidirectional streams.
|
||||||
// On each of these streams, it (tries to) write PRData.
|
// On each of these streams, it (tries to) write PRData.
|
||||||
|
@ -222,7 +222,7 @@ var _ = Describe("Stream Cancellations", func() {
|
||||||
})
|
})
|
||||||
|
|
||||||
Context("canceling the write side", func() {
|
Context("canceling the write side", func() {
|
||||||
runClient := func(server quic.Listener) int32 /* number of canceled streams */ {
|
runClient := func(server *quic.Listener) int32 /* number of canceled streams */ {
|
||||||
conn, err := quic.DialAddr(
|
conn, err := quic.DialAddr(
|
||||||
context.Background(),
|
context.Background(),
|
||||||
fmt.Sprintf("localhost:%d", server.Addr().(*net.UDPAddr).Port),
|
fmt.Sprintf("localhost:%d", server.Addr().(*net.UDPAddr).Port),
|
||||||
|
|
|
@ -34,7 +34,7 @@ func (c *connIDGenerator) ConnectionIDLen() int {
|
||||||
var _ = Describe("Connection ID lengths tests", func() {
|
var _ = Describe("Connection ID lengths tests", func() {
|
||||||
randomConnIDLen := func() int { return 4 + int(mrand.Int31n(15)) }
|
randomConnIDLen := func() int { return 4 + int(mrand.Int31n(15)) }
|
||||||
|
|
||||||
runServer := func(conf *quic.Config) quic.Listener {
|
runServer := func(conf *quic.Config) *quic.Listener {
|
||||||
GinkgoWriter.Write([]byte(fmt.Sprintf("Using %d byte connection ID for the server\n", conf.ConnectionIDLength)))
|
GinkgoWriter.Write([]byte(fmt.Sprintf("Using %d byte connection ID for the server\n", conf.ConnectionIDLength)))
|
||||||
ln, err := quic.ListenAddr("localhost:0", getTLSConfig(), conf)
|
ln, err := quic.ListenAddr("localhost:0", getTLSConfig(), conf)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = Describe("Stream deadline tests", func() {
|
var _ = Describe("Stream deadline tests", func() {
|
||||||
setup := func() (quic.Listener, quic.Stream, quic.Stream) {
|
setup := func() (*quic.Listener, quic.Stream, quic.Stream) {
|
||||||
server, err := quic.ListenAddr("localhost:0", getTLSConfig(), getQuicConfig(nil))
|
server, err := quic.ListenAddr("localhost:0", getTLSConfig(), getQuicConfig(nil))
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
strChan := make(chan quic.SendStream)
|
strChan := make(chan quic.SendStream)
|
||||||
|
|
|
@ -22,7 +22,7 @@ func randomDuration(min, max time.Duration) time.Duration {
|
||||||
var _ = Describe("Drop Tests", func() {
|
var _ = Describe("Drop Tests", func() {
|
||||||
var (
|
var (
|
||||||
proxy *quicproxy.QuicProxy
|
proxy *quicproxy.QuicProxy
|
||||||
ln quic.Listener
|
ln *quic.Listener
|
||||||
)
|
)
|
||||||
|
|
||||||
startListenerAndProxy := func(dropCallback quicproxy.DropCallback) {
|
startListenerAndProxy := func(dropCallback quicproxy.DropCallback) {
|
||||||
|
|
|
@ -32,7 +32,7 @@ type applicationProtocol struct {
|
||||||
var _ = Describe("Handshake drop tests", func() {
|
var _ = Describe("Handshake drop tests", func() {
|
||||||
var (
|
var (
|
||||||
proxy *quicproxy.QuicProxy
|
proxy *quicproxy.QuicProxy
|
||||||
ln quic.Listener
|
ln *quic.Listener
|
||||||
)
|
)
|
||||||
|
|
||||||
data := GeneratePRData(5000)
|
data := GeneratePRData(5000)
|
||||||
|
|
|
@ -46,7 +46,7 @@ func (c *tokenStore) Pop(key string) *quic.ClientToken {
|
||||||
|
|
||||||
var _ = Describe("Handshake tests", func() {
|
var _ = Describe("Handshake tests", func() {
|
||||||
var (
|
var (
|
||||||
server quic.Listener
|
server *quic.Listener
|
||||||
serverConfig *quic.Config
|
serverConfig *quic.Config
|
||||||
acceptStopped chan struct{}
|
acceptStopped chan struct{}
|
||||||
)
|
)
|
||||||
|
@ -221,7 +221,7 @@ var _ = Describe("Handshake tests", func() {
|
||||||
|
|
||||||
Context("rate limiting", func() {
|
Context("rate limiting", func() {
|
||||||
var (
|
var (
|
||||||
server quic.Listener
|
server *quic.Listener
|
||||||
pconn net.PacketConn
|
pconn net.PacketConn
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = Describe("Multiplexing", func() {
|
var _ = Describe("Multiplexing", func() {
|
||||||
runServer := func(ln quic.Listener) {
|
runServer := func(ln *quic.Listener) {
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
for {
|
for {
|
||||||
|
@ -52,7 +52,7 @@ var _ = Describe("Multiplexing", func() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Context("multiplexing clients on the same conn", func() {
|
Context("multiplexing clients on the same conn", func() {
|
||||||
getListener := func() quic.Listener {
|
getListener := func() *quic.Listener {
|
||||||
ln, err := quic.ListenAddr(
|
ln, err := quic.ListenAddr(
|
||||||
"localhost:0",
|
"localhost:0",
|
||||||
getTLSConfig(),
|
getTLSConfig(),
|
||||||
|
|
|
@ -15,7 +15,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = Describe("non-zero RTT", func() {
|
var _ = Describe("non-zero RTT", func() {
|
||||||
runServer := func() quic.Listener {
|
runServer := func() *quic.Listener {
|
||||||
ln, err := quic.ListenAddr(
|
ln, err := quic.ListenAddr(
|
||||||
"localhost:0",
|
"localhost:0",
|
||||||
getTLSConfig(),
|
getTLSConfig(),
|
||||||
|
|
|
@ -16,7 +16,7 @@ var _ = Describe("Bidirectional streams", func() {
|
||||||
const numStreams = 300
|
const numStreams = 300
|
||||||
|
|
||||||
var (
|
var (
|
||||||
server quic.Listener
|
server *quic.Listener
|
||||||
serverAddr string
|
serverAddr string
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -377,7 +377,7 @@ var _ = Describe("Timeout tests", func() {
|
||||||
Context("faulty packet conns", func() {
|
Context("faulty packet conns", func() {
|
||||||
const handshakeTimeout = time.Second / 2
|
const handshakeTimeout = time.Second / 2
|
||||||
|
|
||||||
runServer := func(ln quic.Listener) error {
|
runServer := func(ln *quic.Listener) error {
|
||||||
conn, err := ln.Accept(context.Background())
|
conn, err := ln.Accept(context.Background())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -61,7 +61,7 @@ var _ = Describe("Handshake tests", func() {
|
||||||
quicClientConf := addTracers(protocol.PerspectiveClient, getQuicConfig(nil))
|
quicClientConf := addTracers(protocol.PerspectiveClient, getQuicConfig(nil))
|
||||||
quicServerConf := addTracers(protocol.PerspectiveServer, getQuicConfig(nil))
|
quicServerConf := addTracers(protocol.PerspectiveServer, getQuicConfig(nil))
|
||||||
|
|
||||||
serverChan := make(chan quic.Listener)
|
serverChan := make(chan *quic.Listener)
|
||||||
go func() {
|
go func() {
|
||||||
defer GinkgoRecover()
|
defer GinkgoRecover()
|
||||||
ln, err := quic.ListenAddr("localhost:0", getTLSConfig(), quicServerConf)
|
ln, err := quic.ListenAddr("localhost:0", getTLSConfig(), quicServerConf)
|
||||||
|
|
|
@ -18,7 +18,7 @@ var _ = Describe("Unidirectional Streams", func() {
|
||||||
const numStreams = 500
|
const numStreams = 500
|
||||||
|
|
||||||
var (
|
var (
|
||||||
server quic.Listener
|
server *quic.Listener
|
||||||
serverAddr string
|
serverAddr string
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ func (t *versionNegotiationTracer) ReceivedVersionNegotiationPacket(dest, src lo
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ = Describe("Handshake tests", func() {
|
var _ = Describe("Handshake tests", func() {
|
||||||
startServer := func(tlsConf *tls.Config, conf *quic.Config) (quic.Listener, func()) {
|
startServer := func(tlsConf *tls.Config, conf *quic.Config) (*quic.Listener, func()) {
|
||||||
server, err := quic.ListenAddr("localhost:0", tlsConf, conf)
|
server, err := quic.ListenAddr("localhost:0", tlsConf, conf)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|
||||||
|
|
10
interface.go
10
interface.go
|
@ -346,16 +346,6 @@ type ConnectionState struct {
|
||||||
Version VersionNumber
|
Version VersionNumber
|
||||||
}
|
}
|
||||||
|
|
||||||
// A Listener for incoming QUIC connections
|
|
||||||
type Listener interface {
|
|
||||||
// Close the server. All active connections will be closed.
|
|
||||||
Close() error
|
|
||||||
// Addr returns the local network addr that the server is listening on.
|
|
||||||
Addr() net.Addr
|
|
||||||
// Accept returns new connections. It should be called in a loop.
|
|
||||||
Accept(context.Context) (Connection, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// An EarlyListener listens for incoming QUIC connections,
|
// An EarlyListener listens for incoming QUIC connections,
|
||||||
// and returns them before the handshake completes.
|
// and returns them before the handshake completes.
|
||||||
type EarlyListener interface {
|
type EarlyListener interface {
|
||||||
|
|
42
server.go
42
server.go
|
@ -114,10 +114,28 @@ type baseServer struct {
|
||||||
logger utils.Logger
|
logger utils.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var _ unknownPacketHandler = &baseServer{}
|
||||||
_ Listener = &baseServer{}
|
|
||||||
_ unknownPacketHandler = &baseServer{}
|
// A Listener listens for incoming QUIC connections.
|
||||||
)
|
// It returns connections once the handshake has completed.
|
||||||
|
type Listener struct {
|
||||||
|
baseServer *baseServer
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accept returns new connections. It should be called in a loop.
|
||||||
|
func (l *Listener) Accept(ctx context.Context) (Connection, error) {
|
||||||
|
return l.baseServer.Accept(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close the server. All active connections will be closed.
|
||||||
|
func (l *Listener) Close() error {
|
||||||
|
return l.baseServer.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Addr returns the local network address that the server is listening on.
|
||||||
|
func (l *Listener) Addr() net.Addr {
|
||||||
|
return l.baseServer.Addr()
|
||||||
|
}
|
||||||
|
|
||||||
type earlyServer struct{ *baseServer }
|
type earlyServer struct{ *baseServer }
|
||||||
|
|
||||||
|
@ -130,8 +148,12 @@ func (s *earlyServer) Accept(ctx context.Context) (EarlyConnection, error) {
|
||||||
// ListenAddr creates a QUIC server listening on a given address.
|
// ListenAddr creates a QUIC server listening on a given address.
|
||||||
// The tls.Config must not be nil and must contain a certificate configuration.
|
// The tls.Config must not be nil and must contain a certificate configuration.
|
||||||
// The quic.Config may be nil, in that case the default values will be used.
|
// The quic.Config may be nil, in that case the default values will be used.
|
||||||
func ListenAddr(addr string, tlsConf *tls.Config, config *Config) (Listener, error) {
|
func ListenAddr(addr string, tlsConf *tls.Config, config *Config) (*Listener, error) {
|
||||||
return listenAddr(addr, tlsConf, config, false)
|
s, err := listenAddr(addr, tlsConf, config, false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Listener{baseServer: s}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenAddrEarly works like ListenAddr, but it returns connections before the handshake completes.
|
// ListenAddrEarly works like ListenAddr, but it returns connections before the handshake completes.
|
||||||
|
@ -170,8 +192,12 @@ func listenAddr(addr string, tlsConf *tls.Config, config *Config, acceptEarly bo
|
||||||
// The tls.Config must not be nil and must contain a certificate configuration.
|
// The tls.Config must not be nil and must contain a certificate configuration.
|
||||||
// Furthermore, it must define an application control (using NextProtos).
|
// Furthermore, it must define an application control (using NextProtos).
|
||||||
// The quic.Config may be nil, in that case the default values will be used.
|
// The quic.Config may be nil, in that case the default values will be used.
|
||||||
func Listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (Listener, error) {
|
func Listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (*Listener, error) {
|
||||||
return listen(conn, tlsConf, config, false)
|
s, err := listen(conn, tlsConf, config, false)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &Listener{baseServer: s}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ListenEarly works like Listen, but it returns connections before the handshake completes.
|
// ListenEarly works like Listen, but it returns connections before the handshake completes.
|
||||||
|
|
|
@ -120,7 +120,7 @@ var _ = Describe("Server", func() {
|
||||||
It("fills in default values if options are not set in the Config", func() {
|
It("fills in default values if options are not set in the Config", func() {
|
||||||
ln, err := Listen(conn, tlsConf, &Config{})
|
ln, err := Listen(conn, tlsConf, &Config{})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
server := ln.(*baseServer)
|
server := ln.baseServer
|
||||||
Expect(server.config.Versions).To(Equal(protocol.SupportedVersions))
|
Expect(server.config.Versions).To(Equal(protocol.SupportedVersions))
|
||||||
Expect(server.config.HandshakeIdleTimeout).To(Equal(protocol.DefaultHandshakeIdleTimeout))
|
Expect(server.config.HandshakeIdleTimeout).To(Equal(protocol.DefaultHandshakeIdleTimeout))
|
||||||
Expect(server.config.MaxIdleTimeout).To(Equal(protocol.DefaultIdleTimeout))
|
Expect(server.config.MaxIdleTimeout).To(Equal(protocol.DefaultIdleTimeout))
|
||||||
|
@ -143,7 +143,7 @@ var _ = Describe("Server", func() {
|
||||||
}
|
}
|
||||||
ln, err := Listen(conn, tlsConf, &config)
|
ln, err := Listen(conn, tlsConf, &config)
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
server := ln.(*baseServer)
|
server := ln.baseServer
|
||||||
Expect(server.connHandler).ToNot(BeNil())
|
Expect(server.connHandler).ToNot(BeNil())
|
||||||
Expect(server.config.Versions).To(Equal(supportedVersions))
|
Expect(server.config.Versions).To(Equal(supportedVersions))
|
||||||
Expect(server.config.HandshakeIdleTimeout).To(Equal(1337 * time.Hour))
|
Expect(server.config.HandshakeIdleTimeout).To(Equal(1337 * time.Hour))
|
||||||
|
@ -187,7 +187,7 @@ var _ = Describe("Server", func() {
|
||||||
tracer = mocklogging.NewMockTracer(mockCtrl)
|
tracer = mocklogging.NewMockTracer(mockCtrl)
|
||||||
ln, err := Listen(conn, tlsConf, &Config{Tracer: tracer})
|
ln, err := Listen(conn, tlsConf, &Config{Tracer: tracer})
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
serv = ln.(*baseServer)
|
serv = ln.baseServer
|
||||||
phm = NewMockPacketHandlerManager(mockCtrl)
|
phm = NewMockPacketHandlerManager(mockCtrl)
|
||||||
serv.connHandler = phm
|
serv.connHandler = phm
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue