Skip to content
File

Blob: util/acceptor/http3_acceptor.go

go59 lines
1package acceptor
2 
3import (
4 "context"
5 "net"
6 
7 "go.miragespace.co/specter/spec/transport/q"
8 
9 "github.com/quic-go/quic-go"
10 "go.uber.org/atomic"
11)
12 
13type HTTP3Acceptor struct {
14 parent q.Listener
15 conn chan *quic.Conn
16 closeCh chan struct{}
17 closed atomic.Bool
18}
19 
20var _ q.Listener = (*HTTP3Acceptor)(nil)
21 
22func NewH3Acceptor(parent q.Listener) *HTTP3Acceptor {
23 return &HTTP3Acceptor{
24 parent: parent,
25 conn: make(chan *quic.Conn, 128),
26 closeCh: make(chan struct{}),
27 }
28}
29 
30func (h *HTTP3Acceptor) Handle(c *quic.Conn) {
31 h.conn <- c
32}
33 
34func (h *HTTP3Acceptor) Accept(ctx context.Context) (*quic.Conn, error) {
35 select {
36 case <-ctx.Done():
37 return nil, net.ErrClosed
38 case <-h.closeCh:
39 return nil, net.ErrClosed
40 case c := <-h.conn:
41 return c, nil
42 }
43}
44 
45func (h *HTTP3Acceptor) Close() error {
46 if !h.closed.CompareAndSwap(false, true) {
47 return nil
48 }
49 close(h.closeCh)
50 return nil
51}
52 
53func (h *HTTP3Acceptor) Addr() net.Addr {
54 if h.parent == nil {
55 return emptyAddr
56 }
57 return h.parent.Addr()
58}