package network import ( "crypto/tls" "net" ) type listener struct { net.Listener config *Config } func (t *listener) Accept() (net.Conn, error) { tcpConn, err := t.Listener.Accept() if err != nil { return nil, err } conn := &TCPConn{ Conn: tcpConn, Config: t.config, } return conn, nil } func NewListener(ln net.Listener, config *Config) net.Listener { if config == nil { config = (&Config{}).Server() } return &listener{Listener: ln, config: config} } func ListenTCP(network, address string) (net.Listener, error) { tcpAddr, err := net.ResolveTCPAddr(network, address) if err != nil { return nil, err } ln, err := net.ListenTCP(network, tcpAddr) if err != nil { return nil, err } return NewListener(ln, nil), nil } func ListenTLS(network, address string, config *tls.Config) (net.Listener, error) { ln, err := ListenTCP(network, address) if err != nil { return nil, err } return tls.NewListener(ln, config), nil }