diff options
Diffstat (limited to 'http/response/json/json.go')
-rw-r--r-- | http/response/json/json.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/http/response/json/json.go b/http/response/json/json.go new file mode 100644 index 0000000..ff0f06b --- /dev/null +++ b/http/response/json/json.go @@ -0,0 +1,107 @@ +// Copyright 2018 Frédéric Guillot. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package json + +import ( + "encoding/json" + "errors" + "net/http" + + "github.com/miniflux/miniflux/logger" +) + +// OK sends a JSON response with the status code 200. +func OK(w http.ResponseWriter, v interface{}) { + commonHeaders(w) + w.WriteHeader(http.StatusOK) + w.Write(toJSON(v)) +} + +// Created sends a JSON response with the status code 201. +func Created(w http.ResponseWriter, v interface{}) { + commonHeaders(w) + w.WriteHeader(http.StatusCreated) + w.Write(toJSON(v)) +} + +// NoContent sends a JSON response with the status code 204. +func NoContent(w http.ResponseWriter) { + commonHeaders(w) + w.WriteHeader(http.StatusNoContent) +} + +// NotFound sends a JSON response with the status code 404. +func NotFound(w http.ResponseWriter, err error) { + logger.Error("[Not Found] %v", err) + commonHeaders(w) + w.WriteHeader(http.StatusNotFound) + w.Write(encodeError(err)) +} + +// ServerError sends a JSON response with the status code 500. +func ServerError(w http.ResponseWriter, err error) { + logger.Error("[Internal Server Error] %v", err) + commonHeaders(w) + w.WriteHeader(http.StatusInternalServerError) + + if err != nil { + w.Write(encodeError(err)) + } +} + +// Forbidden sends a JSON response with the status code 403. +func Forbidden(w http.ResponseWriter) { + logger.Info("[Forbidden]") + commonHeaders(w) + w.WriteHeader(http.StatusForbidden) + w.Write(encodeError(errors.New("Access Forbidden"))) +} + +// Unauthorized sends a JSON response with the status code 401. +func Unauthorized(w http.ResponseWriter) { + commonHeaders(w) + w.WriteHeader(http.StatusUnauthorized) + w.Write(encodeError(errors.New("Access Unauthorized"))) +} + +// BadRequest sends a JSON response with the status code 400. +func BadRequest(w http.ResponseWriter, err error) { + logger.Error("[Bad Request] %v", err) + commonHeaders(w) + w.WriteHeader(http.StatusBadRequest) + + if err != nil { + w.Write(encodeError(err)) + } +} + +func commonHeaders(w http.ResponseWriter) { + w.Header().Set("Accept", "application/json") + w.Header().Set("Content-Type", "application/json; charset=utf-8") +} + +func encodeError(err error) []byte { + type errorMsg struct { + ErrorMessage string `json:"error_message"` + } + + tmp := errorMsg{ErrorMessage: err.Error()} + data, err := json.Marshal(tmp) + if err != nil { + logger.Error("json encoding error: %v", err) + } + + return data +} + +func toJSON(v interface{}) []byte { + b, err := json.Marshal(v) + if err != nil { + logger.Error("json encoding error: %v", err) + return []byte("") + } + + return b +} |