forked from niflheims-io/httpmux
/
response.go
109 lines (94 loc) · 2.21 KB
/
response.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
package httpmux
import (
"net/http"
"encoding/json"
"compress/gzip"
"encoding/xml"
"html/template"
)
type Response struct {
w http.ResponseWriter
tpl *template.Template
gzipOn bool
}
func writeContentType(w http.ResponseWriter, value []string) {
header := w.Header()
if val := header["Content-Type"]; len(val) == 0 {
header["Content-Type"] = value
}
}
func (r *Response) Gzip() *Response {
r.w.Header().Add("Content-Encoding", "gzip")
r.gzipOn = true
return r
}
func (r *Response) Status(status int) *Response {
r.w.WriteHeader(status)
return r
}
func (r *Response) Write(data []byte, contentTypes []string) error {
writeContentType(r.w, contentTypes)
if r.gzipOn {
w := gzip.NewWriter(r.w)
defer w.Close()
defer w.Flush()
_, err := w.Write(data)
return err
}
_, err := r.w.Write(data)
return err
}
var plainContentType = []string{"text/plain; charset=utf-8"}
func (r *Response) String(o string) error {
writeContentType(r.w, plainContentType)
if r.gzipOn {
w := gzip.NewWriter(r.w)
defer w.Close()
defer w.Flush()
_, err := w.Write([]byte(o))
return err
}
_, err := r.w.Write([]byte(o))
return err
}
var jsonContentType = []string{"application/json; charset=utf-8"}
func (r *Response) Json(o interface{}) error {
writeContentType(r.w, jsonContentType)
if r.gzipOn {
w := gzip.NewWriter(r.w)
defer w.Close()
defer w.Flush()
err := json.NewEncoder(w).Encode(o)
return err
}
return json.NewEncoder(r.w).Encode(o)
}
var xmlContentType = []string{"application/xml; charset=utf-8"}
func (r *Response) Xml(o interface{}) error {
writeContentType(r.w, xmlContentType)
if r.gzipOn {
w := gzip.NewWriter(r.w)
defer w.Close()
defer w.Flush()
err := xml.NewEncoder(w).Encode(o)
return err
}
return xml.NewEncoder(r.w).Encode(o)
}
var htmlContentType = []string{"text/html; charset=utf-8"}
func (r *Response) Html(tplName string, o interface{}) error {
writeContentType(r.w, htmlContentType)
if r.gzipOn {
w := gzip.NewWriter(r.w)
defer w.Close()
defer w.Flush()
if tplName == "" {
return r.tpl.Execute(w, o)
}
return r.tpl.ExecuteTemplate(w, tplName, o)
}
if tplName == "" {
return r.tpl.Execute(r.w, o)
}
return r.tpl.ExecuteTemplate(r.w, tplName, o)
}