github.com/igoogolx/clash@v1.19.8/listener/http/server.go (about) 1 package http 2 3 import ( 4 "net" 5 6 "github.com/igoogolx/clash/common/cache" 7 C "github.com/igoogolx/clash/constant" 8 ) 9 10 type Listener struct { 11 listener net.Listener 12 addr string 13 closed bool 14 } 15 16 // RawAddress implements C.Listener 17 func (l *Listener) RawAddress() string { 18 return l.addr 19 } 20 21 // Address implements C.Listener 22 func (l *Listener) Address() string { 23 return l.listener.Addr().String() 24 } 25 26 // Close implements C.Listener 27 func (l *Listener) Close() error { 28 l.closed = true 29 return l.listener.Close() 30 } 31 32 func New(addr string, in chan<- C.ConnContext) (C.Listener, error) { 33 return NewWithAuthenticate(addr, in, true) 34 } 35 36 func NewWithAuthenticate(addr string, in chan<- C.ConnContext, authenticate bool) (C.Listener, error) { 37 l, err := net.Listen("tcp", addr) 38 if err != nil { 39 return nil, err 40 } 41 42 var c *cache.LruCache 43 if authenticate { 44 c = cache.New(cache.WithAge(30)) 45 } 46 47 hl := &Listener{ 48 listener: l, 49 addr: addr, 50 } 51 go func() { 52 for { 53 conn, err := hl.listener.Accept() 54 if err != nil { 55 if hl.closed { 56 break 57 } 58 continue 59 } 60 go HandleConn(conn, in, c) 61 } 62 }() 63 64 return hl, nil 65 }