diff --git a/engine/engine.go b/engine/engine.go index a5d50075..283c6a7f 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -6,6 +6,7 @@ import ( "time" "github.com/labstack/gommon/log" + "net" ) type ( @@ -137,6 +138,7 @@ type ( // Config defines engine configuration. Config struct { Address string // TCP address to listen on. + Listener net.Listener // Custom net.Listener for the HTTP server. TLSCertfile string // TLS certificate file path. TLSKeyfile string // TLS key file path. ReadTimeout time.Duration // Maximum duration before timing out read of the request. diff --git a/engine/fasthttp/server.go b/engine/fasthttp/server.go index 551c805e..ddc69611 100644 --- a/engine/fasthttp/server.go +++ b/engine/fasthttp/server.go @@ -123,6 +123,15 @@ func (s *Server) Start() { addr := s.config.Address certfile := s.config.TLSCertfile keyfile := s.config.TLSKeyfile + + if nil == s.config.Listener { + s.startDefaultListener(addr, certfile, keyfile, handler) + } else { + s.startCustomListener(certfile, keyfile, handler) + } +} + +func (s *Server) startDefaultListener(addr, certfile, keyfile string, handler func(c *fasthttp.RequestCtx)) { if certfile != "" && keyfile != "" { s.logger.Fatal(fasthttp.ListenAndServeTLS(addr, certfile, keyfile, handler)) } else { @@ -130,6 +139,14 @@ func (s *Server) Start() { } } +func (s *Server) startCustomListener(certfile, keyfile string, handler func(c *fasthttp.RequestCtx)) { + if certfile != "" && keyfile != "" { + s.logger.Fatal(fasthttp.ServeTLS(s.config.Listener, certfile, keyfile, handler)) + } else { + s.logger.Fatal(fasthttp.Serve(s.config.Listener, handler)) + } +} + // WrapHandler wraps `fasthttp.RequestHandler` into `echo.HandlerFunc`. func WrapHandler(h fasthttp.RequestHandler) echo.HandlerFunc { return func(c echo.Context) error { diff --git a/engine/standard/server.go b/engine/standard/server.go index 27dcfbc8..e47d9f27 100644 --- a/engine/standard/server.go +++ b/engine/standard/server.go @@ -94,6 +94,15 @@ func (s *Server) SetLogger(l *log.Logger) { func (s *Server) Start() { certfile := s.config.TLSCertfile keyfile := s.config.TLSKeyfile + + if nil == s.config.Listener { + s.startDefaultListener(certfile, keyfile) + } else { + s.startCustomListener() + } +} + +func (s *Server) startDefaultListener(certfile, keyfile string) { if certfile != "" && keyfile != "" { s.logger.Fatal(s.ListenAndServeTLS(certfile, keyfile)) } else { @@ -101,6 +110,10 @@ func (s *Server) Start() { } } +func (s *Server) startCustomListener() { + s.logger.Fatal(s.Serve(s.config.Listener)) +} + // ServeHTTP implements `http.Handler` interface. func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { // Request