From 40728e26e640714aaa97734f246ae217c1133075 Mon Sep 17 00:00:00 2001 From: Vishal Rana Date: Fri, 18 Mar 2016 12:13:37 -0700 Subject: [PATCH] Fixed #419, Fixed #420. Signed-off-by: Vishal Rana --- engine/engine.go | 2 +- engine/fasthttp/server.go | 85 +++++++++++++++++++-------------------- engine/standard/server.go | 26 +++++------- 3 files changed, 54 insertions(+), 59 deletions(-) diff --git a/engine/engine.go b/engine/engine.go index 0f956fcf..35d5548c 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -20,7 +20,7 @@ type ( SetLogger(*log.Logger) // Start starts the HTTP server. - Start() + Start() error } // Request defines the interface for HTTP request. diff --git a/engine/fasthttp/server.go b/engine/fasthttp/server.go index 23fe660e..d6704e64 100644 --- a/engine/fasthttp/server.go +++ b/engine/fasthttp/server.go @@ -14,6 +14,7 @@ import ( type ( // Server implements `engine.Server`. Server struct { + *fasthttp.Server config engine.Config handler engine.Handler logger *log.Logger @@ -48,6 +49,7 @@ func NewFromTLS(addr, certfile, keyfile string) *Server { // NewFromConfig returns an instance of `standard.Server` from config. func NewFromConfig(c engine.Config) (s *Server) { s = &Server{ + Server: new(fasthttp.Server), config: c, pool: &pool{ request: sync.Pool{ @@ -77,10 +79,11 @@ func NewFromConfig(c engine.Config) (s *Server) { }, }, handler: engine.HandlerFunc(func(req engine.Request, res engine.Response) { - s.logger.Fatal("handler not set") + s.logger.Error("handler not set, use `SetHandler()` to set it.") }), logger: log.New("echo"), } + s.Handler = s.ServeHTTP return } @@ -95,56 +98,52 @@ func (s *Server) SetLogger(l *log.Logger) { } // Start implements `engine.Server#Start` method. -func (s *Server) Start() { - handler := func(c *fasthttp.RequestCtx) { - // Request - req := s.pool.request.Get().(*Request) - reqHdr := s.pool.requestHeader.Get().(*RequestHeader) - reqURL := s.pool.url.Get().(*URL) - reqHdr.reset(&c.Request.Header) - reqURL.reset(c.URI()) - req.reset(c, reqHdr, reqURL) - - // Response - res := s.pool.response.Get().(*Response) - resHdr := s.pool.responseHeader.Get().(*ResponseHeader) - resHdr.reset(&c.Response.Header) - res.reset(c, resHdr) - - s.handler.ServeHTTP(req, res) - - s.pool.request.Put(req) - s.pool.requestHeader.Put(reqHdr) - s.pool.url.Put(reqURL) - s.pool.response.Put(res) - s.pool.responseHeader.Put(resHdr) - } - - addr := s.config.Address - certfile := s.config.TLSCertfile - keyfile := s.config.TLSKeyfile - +func (s *Server) Start() error { if s.config.Listener == nil { - s.startDefaultListener(addr, certfile, keyfile, handler) - } else { - s.startCustomListener(certfile, keyfile, handler) + return s.startDefaultListener() } + return s.startCustomListener() + } -func (s *Server) startDefaultListener(addr, certfile, keyfile string, h fasthttp.RequestHandler) { - if certfile != "" && keyfile != "" { - s.logger.Fatal(fasthttp.ListenAndServeTLS(addr, certfile, keyfile, h)) - } else { - s.logger.Fatal(fasthttp.ListenAndServe(addr, h)) +func (s *Server) startDefaultListener() error { + c := s.config + if c.TLSCertfile != "" && c.TLSKeyfile != "" { + return s.ListenAndServeTLS(c.Address, c.TLSCertfile, c.TLSKeyfile) } + return s.ListenAndServe(c.Address) } -func (s *Server) startCustomListener(certfile, keyfile string, h fasthttp.RequestHandler) { - if certfile != "" && keyfile != "" { - s.logger.Fatal(fasthttp.ServeTLS(s.config.Listener, certfile, keyfile, h)) - } else { - s.logger.Fatal(fasthttp.Serve(s.config.Listener, h)) +func (s *Server) startCustomListener() error { + c := s.config + if c.TLSCertfile != "" && c.TLSKeyfile != "" { + return s.ServeTLS(c.Listener, c.TLSCertfile, c.TLSKeyfile) } + return s.Serve(c.Listener) +} + +func (s *Server) ServeHTTP(c *fasthttp.RequestCtx) { + // Request + req := s.pool.request.Get().(*Request) + reqHdr := s.pool.requestHeader.Get().(*RequestHeader) + reqURL := s.pool.url.Get().(*URL) + reqHdr.reset(&c.Request.Header) + reqURL.reset(c.URI()) + req.reset(c, reqHdr, reqURL) + + // Response + res := s.pool.response.Get().(*Response) + resHdr := s.pool.responseHeader.Get().(*ResponseHeader) + resHdr.reset(&c.Response.Header) + res.reset(c, resHdr) + + s.handler.ServeHTTP(req, res) + + s.pool.request.Put(req) + s.pool.requestHeader.Put(reqHdr) + s.pool.url.Put(reqURL) + s.pool.response.Put(res) + s.pool.responseHeader.Put(resHdr) } // WrapHandler wraps `fasthttp.RequestHandler` into `echo.HandlerFunc`. diff --git a/engine/standard/server.go b/engine/standard/server.go index 96accca7..b7a4f0a8 100644 --- a/engine/standard/server.go +++ b/engine/standard/server.go @@ -71,7 +71,7 @@ func NewFromConfig(c engine.Config) (s *Server) { }, }, handler: engine.HandlerFunc(func(req engine.Request, res engine.Response) { - s.logger.Fatal("handler not set") + s.logger.Error("handler not set, use `SetHandler()` to set it.") }), logger: log.New("echo"), } @@ -91,27 +91,23 @@ func (s *Server) SetLogger(l *log.Logger) { } // Start implements `engine.Server#Start` method. -func (s *Server) Start() { - certfile := s.config.TLSCertfile - keyfile := s.config.TLSKeyfile - +func (s *Server) Start() error { if s.config.Listener == nil { - s.startDefaultListener(certfile, keyfile) - } else { - s.startCustomListener() + return s.startDefaultListener() } + return s.startCustomListener() } -func (s *Server) startDefaultListener(certfile, keyfile string) { - if certfile != "" && keyfile != "" { - s.logger.Fatal(s.ListenAndServeTLS(certfile, keyfile)) - } else { - s.logger.Fatal(s.ListenAndServe()) +func (s *Server) startDefaultListener() error { + c := s.config + if c.TLSCertfile != "" && c.TLSKeyfile != "" { + return s.ListenAndServeTLS(c.TLSCertfile, c.TLSKeyfile) } + return s.ListenAndServe() } -func (s *Server) startCustomListener() { - s.logger.Fatal(s.Serve(s.config.Listener)) +func (s *Server) startCustomListener() error { + return s.Serve(s.config.Listener) } // ServeHTTP implements `http.Handler` interface.