mirror of
https://github.com/labstack/echo.git
synced 2025-11-06 08:59:21 +02:00
@@ -300,6 +300,7 @@ func (c *context) Error(err error) {
|
|||||||
c.echo.httpErrorHandler(err, c)
|
c.echo.httpErrorHandler(err, c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Echo returns the `Echo` instance.
|
||||||
func (c *context) Echo() *Echo {
|
func (c *context) Echo() *Echo {
|
||||||
return c.echo
|
return c.echo
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,10 @@ func (h *RequestHeader) Object() interface{} {
|
|||||||
return h.header
|
return h.header
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *RequestHeader) reset(hdr fasthttp.RequestHeader) {
|
||||||
|
h.header = hdr
|
||||||
|
}
|
||||||
|
|
||||||
func (h *ResponseHeader) Add(key, val string) {
|
func (h *ResponseHeader) Add(key, val string) {
|
||||||
// h.header.Add(key, val)
|
// h.header.Add(key, val)
|
||||||
}
|
}
|
||||||
@@ -53,3 +57,7 @@ func (h *ResponseHeader) Set(key, val string) {
|
|||||||
func (h *ResponseHeader) Object() interface{} {
|
func (h *ResponseHeader) Object() interface{} {
|
||||||
return h.header
|
return h.header
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *ResponseHeader) reset(hdr fasthttp.ResponseHeader) {
|
||||||
|
h.header = hdr
|
||||||
|
}
|
||||||
|
|||||||
@@ -64,3 +64,9 @@ func (r *Request) FormValue(name string) string {
|
|||||||
func (r *Request) Object() interface{} {
|
func (r *Request) Object() interface{} {
|
||||||
return r.context
|
return r.context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Request) reset(c *fasthttp.RequestCtx, h engine.Header, u engine.URL) {
|
||||||
|
r.context = c
|
||||||
|
r.header = h
|
||||||
|
r.url = u
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package fasthttp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"io"
|
"io"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
"github.com/labstack/echo/engine"
|
"github.com/labstack/echo/engine"
|
||||||
"github.com/labstack/echo/logger"
|
"github.com/labstack/echo/logger"
|
||||||
@@ -73,3 +74,12 @@ func (r *Response) SetWriter(w io.Writer) {
|
|||||||
func (r *Response) Writer() io.Writer {
|
func (r *Response) Writer() io.Writer {
|
||||||
return r.writer
|
return r.writer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (r *Response) reset(c *fasthttp.RequestCtx, h engine.Header) {
|
||||||
|
r.context = c
|
||||||
|
r.header = h
|
||||||
|
r.status = http.StatusOK
|
||||||
|
r.size = 0
|
||||||
|
r.committed = false
|
||||||
|
r.writer = c
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ package fasthttp
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"github.com/labstack/echo/engine"
|
"github.com/labstack/echo/engine"
|
||||||
"github.com/labstack/echo/logger"
|
"github.com/labstack/echo/logger"
|
||||||
@@ -16,8 +17,17 @@ type (
|
|||||||
*http.Server
|
*http.Server
|
||||||
config *engine.Config
|
config *engine.Config
|
||||||
handler engine.HandlerFunc
|
handler engine.HandlerFunc
|
||||||
|
pool *Pool
|
||||||
logger logger.Logger
|
logger logger.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Pool struct {
|
||||||
|
request sync.Pool
|
||||||
|
response sync.Pool
|
||||||
|
requestHeader sync.Pool
|
||||||
|
responseHeader sync.Pool
|
||||||
|
url sync.Pool
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func New(addr string) *Server {
|
func New(addr string) *Server {
|
||||||
@@ -38,8 +48,35 @@ func NewConfig(c *engine.Config) (s *Server) {
|
|||||||
s = &Server{
|
s = &Server{
|
||||||
Server: new(http.Server),
|
Server: new(http.Server),
|
||||||
config: c,
|
config: c,
|
||||||
|
pool: &Pool{
|
||||||
|
request: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &Request{}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
response: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &Response{logger: s.logger}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
requestHeader: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &RequestHeader{}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
responseHeader: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &ResponseHeader{}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
url: sync.Pool{
|
||||||
|
New: func() interface{} {
|
||||||
|
return &URL{}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
handler: func(req engine.Request, res engine.Response) {
|
handler: func(req engine.Request, res engine.Response) {
|
||||||
s.logger.Info("handler not set")
|
s.logger.Warn("handler not set")
|
||||||
},
|
},
|
||||||
logger: log.New("echo"),
|
logger: log.New("echo"),
|
||||||
}
|
}
|
||||||
@@ -56,16 +93,27 @@ func (s *Server) SetLogger(l logger.Logger) {
|
|||||||
|
|
||||||
func (s *Server) Start() {
|
func (s *Server) Start() {
|
||||||
fasthttp.ListenAndServe(s.config.Address, func(c *fasthttp.RequestCtx) {
|
fasthttp.ListenAndServe(s.config.Address, func(c *fasthttp.RequestCtx) {
|
||||||
req := &Request{
|
// Request
|
||||||
context: c,
|
req := s.pool.request.Get().(*Request)
|
||||||
url: &URL{c.URI()},
|
reqHdr := s.pool.requestHeader.Get().(*RequestHeader)
|
||||||
header: &RequestHeader{c.Request.Header},
|
reqURL := s.pool.url.Get().(*URL)
|
||||||
}
|
reqHdr.reset(c.Request.Header)
|
||||||
res := &Response{
|
reqURL.reset(c.URI())
|
||||||
context: c,
|
req.reset(c, reqHdr, reqURL)
|
||||||
header: &ResponseHeader{c.Response.Header},
|
|
||||||
}
|
// Response
|
||||||
|
res := s.pool.response.Get().(*Response)
|
||||||
|
resHdr := s.pool.responseHeader.Get().(*ResponseHeader)
|
||||||
|
resHdr.reset(c.Response.Header)
|
||||||
|
res.reset(c, resHdr)
|
||||||
|
|
||||||
s.handler(req, res)
|
s.handler(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)
|
||||||
})
|
})
|
||||||
s.logger.Fatal(s.ListenAndServe())
|
s.logger.Fatal(s.ListenAndServe())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,3 +33,7 @@ func (u *URL) QueryValue(name string) string {
|
|||||||
func (u *URL) Object() interface{} {
|
func (u *URL) Object() interface{} {
|
||||||
return u.url
|
return u.url
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *URL) reset(url *fasthttp.URI) {
|
||||||
|
u.url = url
|
||||||
|
}
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ func NewConfig(c *engine.Config) (s *Server) {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
handler: func(req engine.Request, res engine.Response) {
|
handler: func(req engine.Request, res engine.Response) {
|
||||||
s.logger.Info("handler not set")
|
s.logger.Warn("handler not set")
|
||||||
},
|
},
|
||||||
logger: log.New("echo"),
|
logger: log.New("echo"),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user