@@ -40,6 +40,27 @@ func Listeners(unsetEnv bool) ([]net.Listener, error) {
4040 return listeners , nil
4141}
4242
43+ // ListenersWithNames maps a listener name to a set of net.Listener instances.
44+ func ListenersWithNames (unsetEnv bool ) (map [string ][]net.Listener , error ) {
45+ files := Files (unsetEnv )
46+ listeners := map [string ][]net.Listener {}
47+
48+ for _ , f := range files {
49+ if pc , err := net .FileListener (f ); err == nil {
50+ current , ok := listeners [f .Name ()]
51+ if ! ok {
52+ listeners [f .Name ()] = []net.Listener {pc }
53+ } else {
54+ listeners [f .Name ()] = append (current , pc )
55+ }
56+ if unsetEnv {
57+ f .Close ()
58+ }
59+ }
60+ }
61+ return listeners , nil
62+ }
63+
4364// TLSListeners returns a slice containing a net.listener for each matching TCP socket type
4465// passed to this process.
4566// It uses default Listeners func and forces TCP sockets handlers to use TLS based on tlsConfig.
@@ -61,3 +82,26 @@ func TLSListeners(unsetEnv bool, tlsConfig *tls.Config) ([]net.Listener, error)
6182
6283 return listeners , err
6384}
85+
86+ // TLSListenersWithNames maps a listener name to a net.Listener with
87+ // the associated TLS configuration.
88+ func TLSListenersWithNames (unsetEnv bool , tlsConfig * tls.Config ) (map [string ][]net.Listener , error ) {
89+ listeners , err := ListenersWithNames (unsetEnv )
90+
91+ if listeners == nil || err != nil {
92+ return nil , err
93+ }
94+
95+ if tlsConfig != nil && err == nil {
96+ for _ , ll := range listeners {
97+ // Activate TLS only for TCP sockets
98+ for i , l := range ll {
99+ if l .Addr ().Network () == "tcp" {
100+ ll [i ] = tls .NewListener (l , tlsConfig )
101+ }
102+ }
103+ }
104+ }
105+
106+ return listeners , err
107+ }
0 commit comments