-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathrender.go
40 lines (35 loc) · 1002 Bytes
/
render.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package api
import (
"regexp"
"net/http"
"github.com/unrolled/render"
)
var defaultRenderer = render.New(render.Options{})
var validJsonpCallback = regexp.MustCompile(`(?i)^[$A-Z_][0-9A-Z_$]*$`)
func Render(w http.ResponseWriter, req *http.Request, status int, v interface{}) {
vars := req.URL.Query()
messages := GetMessages(req)
if body, ok := v.(map[string]interface{}); ok && len(messages) > 0 {
if m, ok := body["meta"]; ok {
if meta, ok := m.(map[string]interface{}); ok {
meta["messages"] = messages
}
} else {
body["meta"] = map[string]interface{} {
"messages": messages,
}
}
}
if callback, ok := vars["callback"]; ok {
if validJsonpCallback.MatchString(callback[0]) {
defaultRenderer.JSONP(w, status, callback[0], v)
} else {
defaultRenderer.JSON(w, 400, map[string]string{
"name": "InvalidCallbackNameError",
"message": "Callback must be a valid javascript function name",
})
}
} else {
defaultRenderer.JSON(w, status, v)
}
}