1
0
mirror of https://github.com/labstack/echo.git synced 2024-12-24 20:14:31 +02:00

Binder interface instead of BinderFunc

Signed-off-by: Vishal Rana <vr@labstack.com>
This commit is contained in:
Vishal Rana 2015-07-30 14:43:22 -07:00
parent a5696d631c
commit 832fd111d4
4 changed files with 31 additions and 35 deletions

View File

@ -101,10 +101,10 @@ func (c *Context) Set(key string, val interface{}) {
c.store[key] = val
}
// Bind binds the request body into specified type v. Default binder does it based
// on Content-Type header.
// Bind binds the request body into specified type `i`. The default binder does
// it based on Content-Type header.
func (c *Context) Bind(i interface{}) error {
return c.echo.binder(c.request, i)
return c.echo.binder.Bind(c.request, i)
}
// Render renders a template with data and sends a text/html response with status

37
echo.go
View File

@ -30,7 +30,7 @@ type (
notFoundHandler HandlerFunc
defaultHTTPErrorHandler HTTPErrorHandler
httpErrorHandler HTTPErrorHandler
binder BindFunc
binder Binder
renderer Renderer
pool sync.Pool
debug bool
@ -56,12 +56,15 @@ type (
// HTTPErrorHandler is a centralized HTTP error handler.
HTTPErrorHandler func(error, *Context)
BindFunc func(*http.Request, interface{}) error
// Binder is the interface that wraps the Bind method.
Binder interface {
Bind(*http.Request, interface{}) error
}
binder struct {
}
// Renderer is the interface that wraps the Render method.
//
// Render renders the HTML template with given name and specified data.
// It writes the output to w.
Renderer interface {
Render(w io.Writer, name string, data interface{}) error
}
@ -190,16 +193,7 @@ func New() (e *Echo) {
log.Println(err)
}
e.SetHTTPErrorHandler(e.defaultHTTPErrorHandler)
e.SetBinder(func(r *http.Request, v interface{}) (err error) {
ct := r.Header.Get(ContentType)
err = UnsupportedMediaType
if strings.HasPrefix(ct, ApplicationJSON) {
err = json.NewDecoder(r.Body).Decode(v)
} else if strings.HasPrefix(ct, ApplicationXML) {
err = xml.NewDecoder(r.Body).Decode(v)
}
return
})
e.SetBinder(&binder{})
return
}
@ -233,7 +227,7 @@ func (e *Echo) SetHTTPErrorHandler(h HTTPErrorHandler) {
}
// SetBinder registers a custom binder. It's invoked by Context.Bind().
func (e *Echo) SetBinder(b BindFunc) {
func (e *Echo) SetBinder(b Binder) {
e.binder = b
}
@ -592,3 +586,14 @@ func wrapHandler(h Handler) HandlerFunc {
panic("echo => unknown handler")
}
}
func (*binder) Bind(r *http.Request, i interface{}) (err error) {
ct := r.Header.Get(ContentType)
err = UnsupportedMediaType
if strings.HasPrefix(ct, ApplicationJSON) {
err = json.NewDecoder(r.Body).Decode(i)
} else if strings.HasPrefix(ct, ApplicationXML) {
err = xml.NewDecoder(r.Body).Decode(i)
}
return
}

View File

@ -1,9 +1,6 @@
package echo
import (
"encoding/binary"
"net/http"
)
import "net/http"
type (
Router struct {
@ -215,14 +212,6 @@ func (n *node) findChildWithType(t ntype) *node {
return nil
}
func (r *Router) treeIndex(method string) uint8 {
if method[0] == 'P' {
return method[0]%10 + method[1] - 65
} else {
return method[0] % 10
}
}
func (r *Router) findTree(method string) (n *node) {
switch method[0] {
case 'G': // GET
@ -233,7 +222,8 @@ func (r *Router) findTree(method string) (n *node) {
case 'P': // POST, PUT or PATCH
switch method[1] {
case 'O': // POST
m := binary.BigEndian.Uint32([]byte(method))
m := uint32(method[3]) | uint32(method[2])<<8 | uint32(method[1])<<16 |
uint32(method[0])<<24
if m == 0x504f5354 {
n = r.postTree
}
@ -263,7 +253,8 @@ func (r *Router) findTree(method string) (n *node) {
n = r.connectTree
}
case 'H': // HEAD
m := binary.BigEndian.Uint32([]byte(method))
m := uint32(method[3]) | uint32(method[2])<<8 | uint32(method[1])<<16 |
uint32(method[0])<<24
if m == 0x48454144 {
n = r.headTree
}

View File

@ -1,6 +1,6 @@
# Echo
# Echo <iframe src="https://ghbtns.com/github-btn.html?user=labstack&repo=echo&type=star&count=true&size=large" frameborder="0" scrolling="0" width="160px" height="30px"></iframe>
A fast and unfancy micro web framework for Golang.
A fast and unfancy micro web framework for Golang.
---