-
Notifications
You must be signed in to change notification settings - Fork 10
/
audit.go
55 lines (49 loc) · 1.47 KB
/
audit.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
// Copyright (c) 2022-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package service
import (
"encoding/json"
"fmt"
"net/http"
"github.com/mattermost/mattermost/server/public/shared/mlog"
)
type httpData struct {
err string
code int
reqData map[string]string
resData map[string]string
}
func (s *Service) httpAudit(handler string, data *httpData, w http.ResponseWriter, r *http.Request) {
fields := append(reqAuditFields(r), mlog.Int("code", data.code))
status := "fail"
if data.err == "" {
status = "success"
} else {
data.resData["error"] = data.err
fields = append(fields, mlog.Err(fmt.Errorf("%s", data.err)))
}
if clientID := data.reqData["clientID"]; clientID != "" {
fields = append(fields, mlog.String("clientID", clientID))
}
s.log.Debug(handler, append(fields, mlog.String("status", status))...)
if w != nil {
data.resData["code"] = fmt.Sprintf("%d", data.code)
w.Header().Add("Content-Type", "application/json")
w.WriteHeader(data.code)
if err := json.NewEncoder(w).Encode(data.resData); err != nil {
s.log.Error("failed to encode data", mlog.Err(err))
}
}
}
func reqAuditFields(req *http.Request) []mlog.Field {
hdr := req.Header.Clone()
delete(hdr, "Authorization")
fields := []mlog.Field{
mlog.String("remoteAddr", req.RemoteAddr),
mlog.String("method", req.Method),
mlog.String("url", req.URL.String()),
mlog.Any("header", hdr),
mlog.String("host", req.Host),
}
return fields
}