@@ -11,6 +11,7 @@ import (
1111 "net/url"
1212
1313 "golang.org/x/net/websocket"
14+ "bytes"
1415)
1516
1617type (
@@ -110,68 +111,99 @@ func (c *Context) Bind(i interface{}) error {
110111
111112// Render renders a template with data and sends a text/html response with status
112113// code. Templates can be registered using `Echo.SetRenderer()`.
113- func (c * Context ) Render (code int , name string , data interface {}) error {
114+ func (c * Context ) Render (code int , name string , data interface {}) ( err error ) {
114115 if c .echo .renderer == nil {
115116 return RendererNotRegistered
116117 }
118+ buf := new (bytes.Buffer )
119+ if err = c .echo .renderer .Render (buf , name , data ); err != nil {
120+ return
121+ }
117122 c .response .Header ().Set (ContentType , TextHTMLCharsetUTF8 )
118123 c .response .WriteHeader (code )
119- return c .echo .renderer .Render (c .response , name , data )
124+ c .response .Write (buf .Bytes ())
125+ return
120126}
121127
122128// HTML formats according to a format specifier and sends HTML response with
123129// status code.
124130func (c * Context ) HTML (code int , format string , a ... interface {}) (err error ) {
131+ buf := new (bytes.Buffer )
132+ _ , err = fmt .Fprintf (buf , format , a ... )
133+ if err != nil {
134+ return err
135+ }
125136 c .response .Header ().Set (ContentType , TextHTMLCharsetUTF8 )
126137 c .response .WriteHeader (code )
127- _ , err = fmt . Fprintf ( c .response , format , a ... )
138+ c .response . Write ( buf . Bytes () )
128139 return
129140}
130141
131142// String formats according to a format specifier and sends text response with status
132143// code.
133144func (c * Context ) String (code int , format string , a ... interface {}) (err error ) {
145+ buf := new (bytes.Buffer )
146+ _ , err = fmt .Fprintf (buf , format , a ... )
147+ if err != nil {
148+ return err
149+ }
134150 c .response .Header ().Set (ContentType , TextPlain )
135151 c .response .WriteHeader (code )
136- _ , err = fmt . Fprintf ( c .response , format , a ... )
152+ c .response . Write ( buf . Bytes () )
137153 return
138154}
139155
140156// JSON sends a JSON response with status code.
141- func (c * Context ) JSON (code int , i interface {}) error {
157+ func (c * Context ) JSON (code int , i interface {}) (err error ) {
158+ b , err := json .Marshal (i )
159+ if err != nil {
160+ return err
161+ }
142162 c .response .Header ().Set (ContentType , ApplicationJSONCharsetUTF8 )
143163 c .response .WriteHeader (code )
144- return json .NewEncoder (c .response ).Encode (i )
164+ c .response .Write (b )
165+ return
145166}
146167
147168// JSONP sends a JSONP response with status code. It uses `callback` to construct
148169// the JSONP payload.
149170func (c * Context ) JSONP (code int , callback string , i interface {}) (err error ) {
171+ b , err := json .Marshal (i )
172+ if err != nil {
173+ return err
174+ }
150175 c .response .Header ().Set (ContentType , ApplicationJavaScriptCharsetUTF8 )
151176 c .response .WriteHeader (code )
152177 c .response .Write ([]byte (callback + "(" ))
153- if err = json .NewEncoder (c .response ).Encode (i ); err == nil {
154- c .response .Write ([]byte (");" ))
155- }
178+ c .response .Write (b )
179+ c .response .Write ([]byte (");" ))
156180 return
157181}
158182
159183// XML sends an XML response with status code.
160- func (c * Context ) XML (code int , i interface {}) error {
184+ func (c * Context ) XML (code int , i interface {}) (err error ) {
185+ b , err := xml .Marshal (i )
186+ if err != nil {
187+ return err
188+ }
161189 c .response .Header ().Set (ContentType , ApplicationXMLCharsetUTF8 )
162190 c .response .WriteHeader (code )
163191 c .response .Write ([]byte (xml .Header ))
164- return xml .NewEncoder (c .response ).Encode (i )
192+ c .response .Write (b )
193+ return
165194}
166195
167196// File sends a response with the content of the file. If attachment is true, the
168197// client is prompted to save the file.
169- func (c * Context ) File (name string , attachment bool ) error {
198+ func (c * Context ) File (name string , attachment bool ) ( err error ) {
170199 dir , file := path .Split (name )
171200 if attachment {
172201 c .response .Header ().Set (ContentDisposition , "attachment; filename=" + file )
173202 }
174- return serveFile (dir , file , c )
203+ if err = serveFile (dir , file , c ); err != nil {
204+ c .response .Header ().Del (ContentDisposition )
205+ }
206+ return
175207}
176208
177209// NoContent sends a response with no body and a status code.
0 commit comments