mirror of
https://github.com/labstack/echo.git
synced 2025-11-06 08:59:21 +02:00
@@ -1,6 +1,9 @@
|
||||
package engine
|
||||
|
||||
import "io"
|
||||
import (
|
||||
"io"
|
||||
"time"
|
||||
)
|
||||
|
||||
type (
|
||||
Type uint8
|
||||
@@ -31,6 +34,8 @@ type (
|
||||
Status() int
|
||||
Size() int64
|
||||
Committed() bool
|
||||
SetWriter(io.Writer)
|
||||
Writer() io.Writer
|
||||
}
|
||||
|
||||
Header interface {
|
||||
@@ -49,7 +54,11 @@ type (
|
||||
}
|
||||
|
||||
Config struct {
|
||||
Address string
|
||||
Address string
|
||||
ReadTimeout time.Duration
|
||||
WriteTimeout time.Duration
|
||||
TLSCertfile string
|
||||
TLSKeyfile string
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package fasthttp
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"github.com/labstack/echo/engine"
|
||||
"github.com/valyala/fasthttp"
|
||||
)
|
||||
@@ -12,6 +14,7 @@ type (
|
||||
status int
|
||||
size int64
|
||||
committed bool
|
||||
writer io.Writer
|
||||
}
|
||||
)
|
||||
|
||||
@@ -38,3 +41,11 @@ func (r *Response) Size() int64 {
|
||||
func (r *Response) Committed() bool {
|
||||
return r.committed
|
||||
}
|
||||
|
||||
func (r *Response) SetWriter(w io.Writer) {
|
||||
r.writer = w
|
||||
}
|
||||
|
||||
func (r *Response) Writer() io.Writer {
|
||||
return r.writer
|
||||
}
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package fasthttp
|
||||
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/labstack/gommon/log"
|
||||
)
|
||||
import (
|
||||
"github.com/labstack/echo/engine"
|
||||
@@ -27,7 +28,6 @@ func NewServer(config *engine.Config, handler engine.HandlerFunc) *Server {
|
||||
|
||||
func (s *Server) Start() {
|
||||
fasthttp.ListenAndServe(s.config.Address, func(ctx *fasthttp.RequestCtx) {
|
||||
println("FastHTTP")
|
||||
req := &Request{
|
||||
context: ctx,
|
||||
url: &URL{ctx.URI()},
|
||||
|
||||
@@ -4,22 +4,26 @@ import "net/http"
|
||||
|
||||
type (
|
||||
Header struct {
|
||||
http.Header
|
||||
header http.Header
|
||||
}
|
||||
)
|
||||
|
||||
func (h *Header) Add(key, val string) {
|
||||
h.Header.Add(key, val)
|
||||
h.header.Add(key, val)
|
||||
}
|
||||
|
||||
func (h *Header) Del(key string) {
|
||||
h.Header.Del(key)
|
||||
h.header.Del(key)
|
||||
}
|
||||
|
||||
func (h *Header) Get(key string) string {
|
||||
return h.Header.Get(key)
|
||||
return h.header.Get(key)
|
||||
}
|
||||
|
||||
func (h *Header) Set(key, val string) {
|
||||
h.Header.Set(key, val)
|
||||
h.header.Set(key, val)
|
||||
}
|
||||
|
||||
func (h *Header) reset(hdr http.Header) {
|
||||
h.header = hdr
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ type (
|
||||
func NewRequest(r *http.Request) *Request {
|
||||
return &Request{
|
||||
request: r,
|
||||
url: NewURL(r.URL),
|
||||
url: &URL{url: r.URL},
|
||||
header: &Header{r.Header},
|
||||
}
|
||||
}
|
||||
@@ -54,3 +54,9 @@ func (r *Request) Body() io.ReadCloser {
|
||||
func (r *Request) FormValue(name string) string {
|
||||
return r.request.FormValue(name)
|
||||
}
|
||||
|
||||
func (r *Request) reset(req *http.Request, h engine.Header, u engine.URL) {
|
||||
r.request = req
|
||||
r.header = h
|
||||
r.url = u
|
||||
}
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
package standard
|
||||
|
||||
import "net/http"
|
||||
import "github.com/labstack/echo/engine"
|
||||
import (
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"github.com/labstack/echo/engine"
|
||||
)
|
||||
|
||||
type (
|
||||
Response struct {
|
||||
@@ -10,6 +14,7 @@ type (
|
||||
status int
|
||||
size int64
|
||||
committed bool
|
||||
writer io.Writer
|
||||
}
|
||||
)
|
||||
|
||||
@@ -17,6 +22,7 @@ func NewResponse(w http.ResponseWriter) *Response {
|
||||
return &Response{
|
||||
response: w,
|
||||
header: &Header{w.Header()},
|
||||
writer: w,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +41,7 @@ func (r *Response) WriteHeader(code int) {
|
||||
}
|
||||
|
||||
func (r *Response) Write(b []byte) (n int, err error) {
|
||||
n, err = r.response.Write(b)
|
||||
n, err = r.writer.Write(b)
|
||||
r.size += int64(n)
|
||||
return
|
||||
}
|
||||
@@ -51,3 +57,20 @@ func (r *Response) Size() int64 {
|
||||
func (r *Response) Committed() bool {
|
||||
return r.committed
|
||||
}
|
||||
|
||||
func (r *Response) SetWriter(w io.Writer) {
|
||||
r.writer = w
|
||||
}
|
||||
|
||||
func (r *Response) Writer() io.Writer {
|
||||
return r.writer
|
||||
}
|
||||
|
||||
func (r *Response) reset(w http.ResponseWriter, h engine.Header) {
|
||||
r.response = w
|
||||
r.header = h
|
||||
r.status = http.StatusOK
|
||||
r.size = 0
|
||||
r.committed = false
|
||||
r.writer = w
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package standard
|
||||
import (
|
||||
"log"
|
||||
"net/http"
|
||||
"sync"
|
||||
|
||||
"github.com/labstack/echo/engine"
|
||||
)
|
||||
@@ -12,6 +13,14 @@ type (
|
||||
*http.Server
|
||||
config *engine.Config
|
||||
handler engine.HandlerFunc
|
||||
pool *Pool
|
||||
}
|
||||
|
||||
Pool struct {
|
||||
request sync.Pool
|
||||
response sync.Pool
|
||||
header sync.Pool
|
||||
url sync.Pool
|
||||
}
|
||||
)
|
||||
|
||||
@@ -20,13 +29,54 @@ func NewServer(config *engine.Config, handler engine.HandlerFunc) *Server {
|
||||
Server: new(http.Server),
|
||||
config: config,
|
||||
handler: handler,
|
||||
pool: &Pool{
|
||||
request: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &Request{}
|
||||
},
|
||||
},
|
||||
response: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &Response{}
|
||||
},
|
||||
},
|
||||
header: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &Header{}
|
||||
},
|
||||
},
|
||||
url: sync.Pool{
|
||||
New: func() interface{} {
|
||||
return &URL{}
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Server) Start() {
|
||||
s.Addr = s.config.Address
|
||||
s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
s.handler(NewRequest(r), NewResponse(w))
|
||||
// Request
|
||||
req := s.pool.request.Get().(*Request)
|
||||
reqHdr := s.pool.request.Get().(*Header)
|
||||
reqURL := s.pool.request.Get().(*URL)
|
||||
reqHdr.reset(r.Header)
|
||||
reqURL.reset(r.URL)
|
||||
req.reset(r, reqHdr, reqURL)
|
||||
|
||||
// Response
|
||||
res := s.pool.request.Get().(*Response)
|
||||
resHdr := s.pool.request.Get().(*Header)
|
||||
res.reset(w, reqHdr)
|
||||
|
||||
s.handler(req, res)
|
||||
|
||||
s.pool.request.Put(req)
|
||||
s.pool.header.Put(reqHdr)
|
||||
s.pool.url.Put(reqURL)
|
||||
s.pool.response.Put(res)
|
||||
s.pool.header.Put(resHdr)
|
||||
})
|
||||
log.Fatal(s.ListenAndServe())
|
||||
}
|
||||
|
||||
@@ -9,10 +9,6 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
func NewURL(u *url.URL) *URL {
|
||||
return &URL{url: u}
|
||||
}
|
||||
|
||||
func (u *URL) URL() *url.URL {
|
||||
return u.url
|
||||
}
|
||||
@@ -39,3 +35,7 @@ func (u *URL) QueryValue(name string) string {
|
||||
}
|
||||
return u.query.Get(name)
|
||||
}
|
||||
|
||||
func (u *URL) reset(url *url.URL) {
|
||||
u.url = url
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user