11package echo
22
33import (
4+ "encoding/json"
45 "errors"
56 "io"
67 "log"
78 "net/http"
9+ "strings"
810 "sync"
911)
1012
@@ -15,15 +17,22 @@ type (
1517 middleware []MiddlewareFunc
1618 maxParam byte
1719 notFoundHandler HandlerFunc
20+ binder BindFunc
1821 renderer Renderer
1922 pool sync.Pool
2023 }
2124 Middleware interface {}
2225 MiddlewareFunc func (HandlerFunc ) HandlerFunc
2326 Handler interface {}
2427 HandlerFunc func (* Context )
25- Renderer interface {
26- Render (io.Writer , string , interface {}) error
28+ BindFunc func (r * http.Request , v interface {}) error
29+
30+ // Renderer is the interface that wraps the Render method.
31+ //
32+ // Render renders the HTML template with given name and specified data.
33+ // It writes the output to w.
34+ Renderer interface {
35+ Render (w io.Writer , name string , data interface {}) error
2736 }
2837)
2938
@@ -75,6 +84,15 @@ func New() (e *Echo) {
7584 notFoundHandler : func (c * Context ) {
7685 http .Error (c .Response , http .StatusText (http .StatusNotFound ), http .StatusNotFound )
7786 },
87+ binder : func (r * http.Request , v interface {}) error {
88+ ct := r .Header .Get (HeaderContentType )
89+ if strings .HasPrefix (ct , MIMEJSON ) {
90+ return json .NewDecoder (r .Body ).Decode (v )
91+ } else if strings .HasPrefix (ct , MIMEForm ) {
92+ return nil
93+ }
94+ return ErrUnsupportedMediaType
95+ },
7896 }
7997 e .Router = NewRouter (e )
8098 e .pool .New = func () interface {} {
@@ -115,8 +133,13 @@ func (e *Echo) NotFoundHandler(h Handler) {
115133 e .notFoundHandler = wrapH (h )
116134}
117135
118- // Renderer registers an HTML template renderer, it is used by
119- // echo.Context.Render API.
136+ // Binder registers a custom binder. It's invoked by Context.Bind API.
137+ func (e * Echo ) Binder (b BindFunc ) {
138+ e .binder = b
139+ }
140+
141+ // Renderer registers an HTML template renderer. It's invoked by Context.Render
142+ // API.
120143func (e * Echo ) Renderer (r Renderer ) {
121144 e .renderer = r
122145}
0 commit comments