1
1
package echo
2
2
3
3
import (
4
+ "encoding/json"
4
5
"errors"
5
6
"io"
6
7
"log"
7
8
"net/http"
9
+ "strings"
8
10
"sync"
9
11
)
10
12
@@ -15,15 +17,22 @@ type (
15
17
middleware []MiddlewareFunc
16
18
maxParam byte
17
19
notFoundHandler HandlerFunc
20
+ binder BindFunc
18
21
renderer Renderer
19
22
pool sync.Pool
20
23
}
21
24
Middleware interface {}
22
25
MiddlewareFunc func (HandlerFunc ) HandlerFunc
23
26
Handler interface {}
24
27
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
27
36
}
28
37
)
29
38
@@ -75,6 +84,15 @@ func New() (e *Echo) {
75
84
notFoundHandler : func (c * Context ) {
76
85
http .Error (c .Response , http .StatusText (http .StatusNotFound ), http .StatusNotFound )
77
86
},
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
+ },
78
96
}
79
97
e .Router = NewRouter (e )
80
98
e .pool .New = func () interface {} {
@@ -115,8 +133,13 @@ func (e *Echo) NotFoundHandler(h Handler) {
115
133
e .notFoundHandler = wrapH (h )
116
134
}
117
135
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.
120
143
func (e * Echo ) Renderer (r Renderer ) {
121
144
e .renderer = r
122
145
}
0 commit comments