Skip to content
File

Blob: util/acceptor/http2_acceptor.go

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