Skip to content

Commit

Permalink
net: extract HTTPProxy.listen() to MultiListener
Browse files Browse the repository at this point in the history
  • Loading branch information
mmatczuk committed Nov 8, 2024
1 parent 02db5ad commit 7b52ef9
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 20 deletions.
37 changes: 17 additions & 20 deletions http_proxy.go
Original file line number Diff line number Diff line change
Expand Up @@ -566,38 +566,35 @@ func (hp *HTTPProxy) run(ctx context.Context) error {
return g.Wait()
}

func (hp *HTTPProxy) listen() (_ []net.Listener, ferr error) {
func (hp *HTTPProxy) listen() ([]net.Listener, error) {
switch hp.config.Protocol {
case HTTPScheme, HTTPSScheme, HTTP2Scheme:
default:
return nil, fmt.Errorf("invalid protocol %q", hp.config.Protocol)
}

prototype := Listener{
TLSConfig: hp.tlsConfig,
metrics: newListenerMetrics(hp.config.PromRegistry, hp.config.PromNamespace),
}

listeners := make([]net.Listener, 0, len(hp.config.ExtraListeners)+1)
defer func() {
if ferr != nil {
for _, l := range listeners {
l.Close()
}
if len(hp.config.ExtraListeners) == 0 {
l := &Listener{
ListenerConfig: hp.config.ListenerConfig,
TLSConfig: hp.tlsConfig,
PromConfig: PromConfig{
PromNamespace: hp.config.PromNamespace,
PromRegistry: hp.config.PromRegistry,
},
}
}()

for _, lc := range append([]NamedListenerConfig{{ListenerConfig: hp.config.ListenerConfig}}, hp.config.ExtraListeners...) {
l := new(Listener)
*l = prototype
l.ListenerConfig = lc.ListenerConfig
if err := l.Listen(); err != nil {
return nil, err
}
listeners = append(listeners, l)
return []net.Listener{l}, nil
}

return listeners, nil
return MultiListener{
ListenerConfigs: append([]NamedListenerConfig{{ListenerConfig: hp.config.ListenerConfig}}, hp.config.ExtraListeners...),
TLSConfig: func(lc NamedListenerConfig) *tls.Config {
return hp.tlsConfig
},
PromConfig: hp.config.PromConfig,
}.Listen()
}

// Addr returns the address the server is listening on.
Expand Down
37 changes: 37 additions & 0 deletions net.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,43 @@ type NamedListenerConfig struct {
ListenerConfig
}

// MultiListener is a builder for multiple listeners sharing the same prometheus configuration.
type MultiListener struct {
ListenerConfigs []NamedListenerConfig
TLSConfig func(NamedListenerConfig) *tls.Config
PromConfig
}

func (ml MultiListener) Listen() (_ []net.Listener, ferr error) {
prototype := Listener{
metrics: newListenerMetrics(ml.PromRegistry, ml.PromNamespace),
}

listeners := make([]net.Listener, 0, len(ml.ListenerConfigs))
defer func() {
if ferr != nil {
for _, l := range listeners {
l.Close()
}
}
}()

for _, lc := range ml.ListenerConfigs {
l := new(Listener)
*l = prototype
l.ListenerConfig = lc.ListenerConfig
if ml.TLSConfig != nil {
l.TLSConfig = ml.TLSConfig(lc)
}
if err := l.Listen(); err != nil {
return nil, err
}
listeners = append(listeners, l)
}

return listeners, nil
}

type Listener struct {
ListenerConfig
TLSConfig *tls.Config
Expand Down

0 comments on commit 7b52ef9

Please sign in to comment.