This repository has been archived by the owner on Sep 30, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrespond.go
121 lines (96 loc) · 3.32 KB
/
respond.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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
MIT License
Copyright (c) 2018 Danny van Kooten
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
package respond
import (
"encoding/json"
"encoding/xml"
"html/template"
"net/http"
)
const (
// ContentType HTTP header name for defining the content type
ContentType = "Content-Type"
// ContentHTML HTTP header value for HTML data
ContentHTML = "text/html"
// ContentJSON HTTP header value for JSON data
ContentJSON = "application/json"
// ContentText header value for Text data.
ContentText = "text/plain"
// ContentXML header value for XML data.
ContentXML = "text/xml"
)
var Charset = "UTF-8"
// Template executes the template and writes to the responsewriter
func Template(w http.ResponseWriter, statusCode int, tmpl *template.Template, data ...interface{}) error {
w.Header().Set(ContentType, ContentHTML+"; charset="+Charset)
w.WriteHeader(statusCode)
var d interface{}
if len(data) > 0 {
d = data[0]
}
return tmpl.Execute(w, d)
}
// HTML sets a Content-Type: text/html header with charset and writes the byte data to the stream
func HTML(w http.ResponseWriter, statusCode int, data ...[]byte) error {
w.Header().Set(ContentType, ContentHTML+"; charset="+Charset)
w.WriteHeader(statusCode)
for i := range data {
if _, err := w.Write(data[i]); err != nil {
return err
}
}
return nil
}
// JSON renders the data as a JSON HTTP response to the ResponseWriter
func JSON(w http.ResponseWriter, statusCode int, data ...interface{}) error {
w.Header().Set(ContentType, ContentJSON+"; charset="+Charset)
w.WriteHeader(statusCode)
for i := range data {
err := json.NewEncoder(w).Encode(data[i])
if err != nil {
return err
}
}
return nil
}
// XML writes the data as a XML HTTP response to the ResponseWriter
func XML(w http.ResponseWriter, statusCode int, data ...interface{}) error {
w.Header().Set(ContentType, ContentXML+"; charset="+Charset)
w.WriteHeader(statusCode)
// do nothing if nil data
for i := range data {
err := xml.NewEncoder(w).Encode(data[i])
if err != nil {
return err
}
}
return nil
}
// Text writes the data as a JSON HTTP response to the ResponseWriter
func Text(w http.ResponseWriter, statusCode int, data ...[]byte) error {
w.Header().Set(ContentType, ContentText+"; charset="+Charset)
w.WriteHeader(statusCode)
for i := range data {
if _, err := w.Write(data[i]); err != nil {
return err
}
}
return nil
}