diff options
author | Brian Picciano <mediocregopher@gmail.com> | 2021-08-07 20:38:37 -0600 |
---|---|---|
committer | Brian Picciano <mediocregopher@gmail.com> | 2021-08-07 20:38:37 -0600 |
commit | 0197d9cd493b5785bca05f476856540ec64da64a (patch) | |
tree | db19ac4bfa602b1e0b001769c57d6b7c37d96fc4 /srv/api/utils.go | |
parent | dce39b836a0fd6e37ab2499c2e0e232572c17ad6 (diff) |
split configuration parsing out into separate packages, split api out as well
Diffstat (limited to 'srv/api/utils.go')
-rw-r--r-- | srv/api/utils.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/srv/api/utils.go b/srv/api/utils.go new file mode 100644 index 0000000..8e2a63b --- /dev/null +++ b/srv/api/utils.go @@ -0,0 +1,60 @@ +package api + +import ( + "context" + "encoding/json" + "net/http" + + "github.com/mediocregopher/mediocre-go-lib/v2/mlog" +) + +type loggerCtxKey int + +func setRequestLogger(r *http.Request, logger *mlog.Logger) *http.Request { + ctx := r.Context() + ctx = context.WithValue(ctx, loggerCtxKey(0), logger) + return r.WithContext(ctx) +} + +func getRequestLogger(r *http.Request) *mlog.Logger { + ctx := r.Context() + logger, _ := ctx.Value(loggerCtxKey(0)).(*mlog.Logger) + if logger == nil { + logger = mlog.Null + } + return logger +} + +func jsonResult(rw http.ResponseWriter, r *http.Request, v interface{}) { + b, err := json.Marshal(v) + if err != nil { + internalServerError(rw, r, err) + return + } + b = append(b, '\n') + + rw.Header().Set("Content-Type", "application/json") + rw.Write(b) +} + +func badRequest(rw http.ResponseWriter, r *http.Request, err error) { + getRequestLogger(r).Warn(r.Context(), "bad request", err) + + rw.WriteHeader(400) + jsonResult(rw, r, struct { + Error string `json:"error"` + }{ + Error: err.Error(), + }) +} + +func internalServerError(rw http.ResponseWriter, r *http.Request, err error) { + getRequestLogger(r).Error(r.Context(), "internal server error", err) + + rw.WriteHeader(500) + jsonResult(rw, r, struct { + Error string `json:"error"` + }{ + Error: "internal server error", + }) +} |