diff --git a/service/options.go b/service/options.go index 3dafb8f..e8da55a 100644 --- a/service/options.go +++ b/service/options.go @@ -127,6 +127,15 @@ func WithAddress(addr string) Option { } } +// WithListener specifies a listener for the service. +// It can be used to specify a custom listener. +// This will override the WithAddress and WithTLSConfig options +func WithListener(lis net.Listener) Option { + return func(o *options) { + o.lis = lis + } +} + func WithReflection(r bool) Option { return func(o *options) { o.reflection = r @@ -330,6 +339,7 @@ type options struct { name string version string address string + lis net.Listener reflection bool health bool diff --git a/service/service.go b/service/service.go index b7c5e43..fa57003 100644 --- a/service/service.go +++ b/service/service.go @@ -151,17 +151,21 @@ func (s *service) run() error { s.opts.address = strings.TrimPrefix(s.opts.address, "unix://") } - lis, err := net.Listen(network, s.opts.address) - if err != nil { - return err - } - if s.opts.tlsConfig != nil { - lis = tls.NewListener(lis, s.opts.tlsConfig) + if s.opts.lis == nil { + lis, err := net.Listen(network, s.opts.address) + if err != nil { + return err + } + if s.opts.tlsConfig != nil { + lis = tls.NewListener(lis, s.opts.tlsConfig) + } + s.opts.lis = lis + s.opts.address = lis.Addr().String() + } else { + s.opts.address = s.opts.lis.Addr().String() } - s.opts.address = lis.Addr().String() - - mux := cmux.New(lis) + mux := cmux.New(s.opts.lis) mux.SetReadTimeout(5 * time.Second) gLis := mux.MatchWithWriters(cmux.HTTP2MatchHeaderFieldSendSettings("content-type", "application/grpc"))