-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsender.go
85 lines (66 loc) · 1.63 KB
/
sender.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
package sender
import (
"encoding/json"
"io"
"net/http"
)
const (
HeaderContentType = "Content-Type"
ContentTypeApplicationJSON = "application/json"
ContentTypeTextHTML = "text/html; charset=utf-8"
)
type (
Sender struct {
response http.ResponseWriter
request *http.Request
}
errorData struct {
Error string `json:"error"`
}
panicData struct {
Panic string `json:"panic"`
Stack string `json:"stack"`
}
)
func NewSender(w http.ResponseWriter, r *http.Request) Sender {
return Sender{
response: w,
request: r,
}
}
func (s Sender) Response() http.ResponseWriter { return s.response }
func (s Sender) Request() *http.Request { return s.request }
func (s Sender) SendStatus(statusCode int) {
s.response.WriteHeader(statusCode)
}
func (s Sender) SetContentTypeJSON() {
s.response.Header().Set(HeaderContentType, ContentTypeApplicationJSON)
}
func (s Sender) SetContentTypeHTML() {
s.response.Header().Set(HeaderContentType, ContentTypeTextHTML)
}
func (s Sender) SendReader(r io.Reader) (int64, error) {
return io.Copy(s.response, r)
}
func (s Sender) SendBytes(data []byte) error {
_, err := s.response.Write(data)
if err != nil {
return s.SendError(http.StatusInternalServerError, err)
}
return err
}
func (s Sender) SendJson(value any) error {
s.SetContentTypeJSON()
err := json.NewEncoder(s.response).Encode(value)
if err != nil {
return s.SendError(http.StatusInternalServerError, err)
}
return err
}
func (s Sender) SendError(statusCode int, err error) error {
s.SetContentTypeJSON()
s.SendStatus(statusCode)
return json.NewEncoder(s.response).Encode(errorData{
Error: err.Error(),
})
}