diff --git a/server/run_option.go b/server/run_option.go index 2939d63..8e89a9f 100644 --- a/server/run_option.go +++ b/server/run_option.go @@ -2,11 +2,14 @@ package server import ( "context" + "net" ) // RunOptions holds a set of configurations for Server.Run(). type RunOptions struct { gracefullCtx context.Context + + listener net.Listener } // RunOption is an option of Server.Run(). @@ -19,3 +22,10 @@ func WithGracefullContext(ctx context.Context) RunOption { options.gracefullCtx = ctx } } + +// WithListener allows the caller to override the default listener +func WithListener(l net.Listener) RunOption { + return func(options *RunOptions) { + options.listener = l + } +} diff --git a/server/server.go b/server/server.go index 1de3b38..3c9f14f 100644 --- a/server/server.go +++ b/server/server.go @@ -117,9 +117,13 @@ func (server *Server) Run(ctx context.Context, options ...RunOption) error { log.Printf("Port number configured to `0`, choosing a random port") } hostPort := net.JoinHostPort(server.options.Address, server.options.Port) - listener, err := net.Listen("tcp", hostPort) - if err != nil { - return errors.Wrapf(err, "failed to listen at `%s`", hostPort) + + listener := opts.listener + if listener == nil { + listener, err = net.Listen("tcp", hostPort) + if err != nil { + return errors.Wrapf(err, "failed to listen at `%s`", hostPort) + } } scheme := "http"