Merge v1.2.1-master

Signed-off-by: Emile Vauge <emile@vauge.com>
This commit is contained in:
Emile Vauge 2017-04-11 17:10:46 +02:00
parent a590155b0b
commit aeb17182b4
No known key found for this signature in database
GPG key ID: D808B4C167352E59
396 changed files with 27271 additions and 9969 deletions

View file

@ -5,12 +5,13 @@ import (
"encoding/json"
"encoding/xml"
"html/template"
"io"
"net/http"
)
// Engine is the generic interface for all responses.
type Engine interface {
Render(http.ResponseWriter, interface{}) error
Render(io.Writer, interface{}) error
}
// Head defines the basic ContentType and Status fields.
@ -66,19 +67,21 @@ func (h Head) Write(w http.ResponseWriter) {
}
// Render a data response.
func (d Data) Render(w http.ResponseWriter, v interface{}) error {
c := w.Header().Get(ContentType)
if c != "" {
d.Head.ContentType = c
func (d Data) Render(w io.Writer, v interface{}) error {
if hw, ok := w.(http.ResponseWriter); ok {
c := hw.Header().Get(ContentType)
if c != "" {
d.Head.ContentType = c
}
d.Head.Write(hw)
}
d.Head.Write(w)
w.Write(v.([]byte))
return nil
}
// Render a HTML response.
func (h HTML) Render(w http.ResponseWriter, binding interface{}) error {
func (h HTML) Render(w io.Writer, binding interface{}) error {
// Retrieve a buffer from the pool to write to.
out := bufPool.Get()
err := h.Templates.ExecuteTemplate(out, h.Name, binding)
@ -86,7 +89,9 @@ func (h HTML) Render(w http.ResponseWriter, binding interface{}) error {
return err
}
h.Head.Write(w)
if hw, ok := w.(http.ResponseWriter); ok {
h.Head.Write(hw)
}
out.WriteTo(w)
// Return the buffer to the pool.
@ -95,7 +100,7 @@ func (h HTML) Render(w http.ResponseWriter, binding interface{}) error {
}
// Render a JSON response.
func (j JSON) Render(w http.ResponseWriter, v interface{}) error {
func (j JSON) Render(w io.Writer, v interface{}) error {
if j.StreamingJSON {
return j.renderStreamingJSON(w, v)
}
@ -121,7 +126,9 @@ func (j JSON) Render(w http.ResponseWriter, v interface{}) error {
}
// JSON marshaled fine, write out the result.
j.Head.Write(w)
if hw, ok := w.(http.ResponseWriter); ok {
j.Head.Write(hw)
}
if len(j.Prefix) > 0 {
w.Write(j.Prefix)
}
@ -129,8 +136,10 @@ func (j JSON) Render(w http.ResponseWriter, v interface{}) error {
return nil
}
func (j JSON) renderStreamingJSON(w http.ResponseWriter, v interface{}) error {
j.Head.Write(w)
func (j JSON) renderStreamingJSON(w io.Writer, v interface{}) error {
if hw, ok := w.(http.ResponseWriter); ok {
j.Head.Write(hw)
}
if len(j.Prefix) > 0 {
w.Write(j.Prefix)
}
@ -139,7 +148,7 @@ func (j JSON) renderStreamingJSON(w http.ResponseWriter, v interface{}) error {
}
// Render a JSONP response.
func (j JSONP) Render(w http.ResponseWriter, v interface{}) error {
func (j JSONP) Render(w io.Writer, v interface{}) error {
var result []byte
var err error
@ -153,7 +162,9 @@ func (j JSONP) Render(w http.ResponseWriter, v interface{}) error {
}
// JSON marshaled fine, write out the result.
j.Head.Write(w)
if hw, ok := w.(http.ResponseWriter); ok {
j.Head.Write(hw)
}
w.Write([]byte(j.Callback + "("))
w.Write(result)
w.Write([]byte(");"))
@ -166,19 +177,21 @@ func (j JSONP) Render(w http.ResponseWriter, v interface{}) error {
}
// Render a text response.
func (t Text) Render(w http.ResponseWriter, v interface{}) error {
c := w.Header().Get(ContentType)
if c != "" {
t.Head.ContentType = c
func (t Text) Render(w io.Writer, v interface{}) error {
if hw, ok := w.(http.ResponseWriter); ok {
c := hw.Header().Get(ContentType)
if c != "" {
t.Head.ContentType = c
}
t.Head.Write(hw)
}
t.Head.Write(w)
w.Write([]byte(v.(string)))
return nil
}
// Render an XML response.
func (x XML) Render(w http.ResponseWriter, v interface{}) error {
func (x XML) Render(w io.Writer, v interface{}) error {
var result []byte
var err error
@ -193,7 +206,9 @@ func (x XML) Render(w http.ResponseWriter, v interface{}) error {
}
// XML marshaled fine, write out the result.
x.Head.Write(w)
if hw, ok := w.(http.ResponseWriter); ok {
x.Head.Write(hw)
}
if len(x.Prefix) > 0 {
w.Write(x.Prefix)
}