From 9e9f5f44c6ee86593e6524fa1d48d413c9c1536b Mon Sep 17 00:00:00 2001 From: lrobot Date: Sat, 12 Apr 2025 17:24:42 +0800 Subject: [PATCH] feat: reset engine can call rest.WithExternalListener to use external listener for start engine --- rest/engine.go | 10 ++++++++++ rest/internal/starter.go | 11 ++++++++++- rest/server.go | 8 ++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/rest/engine.go b/rest/engine.go index 436dda937ca2..779c160b9b9c 100644 --- a/rest/engine.go +++ b/rest/engine.go @@ -4,6 +4,7 @@ import ( "crypto/tls" "errors" "fmt" + "net" "net/http" "sort" "time" @@ -37,6 +38,7 @@ type engine struct { shedder load.Shedder priorityShedder load.Shedder tlsConfig *tls.Config + extListner net.Listener } func newEngine(c RestConf) *engine { @@ -283,6 +285,10 @@ func (ng *engine) setUnsignedCallback(callback handler.UnsignedCallback) { ng.unsignedCallback = callback } +func (ng *engine) setExternalListener(l net.Listener) { + ng.extListner = l +} + func (ng *engine) signatureVerifier(signature signatureSetting) (func(chain.Chain) chain.Chain, error) { if !signature.enabled { return func(chn chain.Chain) chain.Chain { @@ -328,6 +334,10 @@ func (ng *engine) start(router httpx.Router, opts ...StartOption) error { return err } + if ng.extListner != nil { + return internal.StartHttpWithListner(ng.extListner, router, ng.withTimeout()) + } + // make sure user defined options overwrite default options opts = append([]StartOption{ng.withTimeout()}, opts...) diff --git a/rest/internal/starter.go b/rest/internal/starter.go index 174303342b7e..fdbaeaa4b72f 100644 --- a/rest/internal/starter.go +++ b/rest/internal/starter.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "net" "net/http" "github.com/zeromicro/go-zero/core/logx" @@ -16,6 +17,12 @@ const probeNamePrefix = "rest" // StartOption defines the method to customize http.Server. type StartOption func(svr *http.Server) +func StartHttpWithListner(l net.Listener, handler http.Handler, opts ...StartOption) error { + return start("", 0, handler, func(svr *http.Server) error { + return svr.Serve(l) + }, opts...) +} + // StartHttp starts a http server. func StartHttp(host string, port int, handler http.Handler, opts ...StartOption) error { return start(host, port, handler, func(svr *http.Server) error { @@ -35,9 +42,11 @@ func StartHttps(host string, port int, certFile, keyFile string, handler http.Ha func start(host string, port int, handler http.Handler, run func(svr *http.Server) error, opts ...StartOption) (err error) { server := &http.Server{ - Addr: fmt.Sprintf("%s:%d", host, port), Handler: handler, } + if len(host) > 0 { + server.Addr = fmt.Sprintf("%s:%d", host, port) + } for _, opt := range opts { opt(server) } diff --git a/rest/server.go b/rest/server.go index b97ec5aa5ac3..ea243f97b8c6 100644 --- a/rest/server.go +++ b/rest/server.go @@ -3,6 +3,7 @@ package rest import ( "crypto/tls" "errors" + "net" "net/http" "path" "time" @@ -315,6 +316,13 @@ func WithUnsignedCallback(callback handler.UnsignedCallback) RunOption { } } +// WithUnsignedCallback returns a RunOption that with given unsigned callback set. +func WithExternalListener(listner net.Listener) RunOption { + return func(svr *Server) { + svr.ngin.setExternalListener(listner) + } +} + func handleError(err error) { // ErrServerClosed means the server is closed manually if err == nil || errors.Is(err, http.ErrServerClosed) {