miniflux/http/response/json/json.go

114 lines
3.3 KiB
Go
Raw Normal View History

// SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
2018-08-25 06:51:50 +02:00
package json // import "miniflux.app/http/response/json"
import (
"encoding/json"
"errors"
"net/http"
2018-08-25 06:51:50 +02:00
"miniflux.app/http/response"
"miniflux.app/logger"
)
const contentTypeHeader = `application/json`
2018-10-08 03:42:43 +02:00
// OK creates a new JSON response with a 200 status code.
func OK(w http.ResponseWriter, r *http.Request, body interface{}) {
builder := response.New(w, r)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSON(body))
builder.Write()
}
2018-10-08 03:42:43 +02:00
// Created sends a created response to the client.
func Created(w http.ResponseWriter, r *http.Request, body interface{}) {
builder := response.New(w, r)
builder.WithStatus(http.StatusCreated)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSON(body))
builder.Write()
}
2018-10-08 03:42:43 +02:00
// NoContent sends a no content response to the client.
func NoContent(w http.ResponseWriter, r *http.Request) {
builder := response.New(w, r)
builder.WithStatus(http.StatusNoContent)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.Write()
}
2018-10-08 03:42:43 +02:00
// ServerError sends an internal error to the client.
func ServerError(w http.ResponseWriter, r *http.Request, err error) {
logger.Error("[HTTP:Internal Server Error] %s => %v", r.URL, err)
builder := response.New(w, r)
builder.WithStatus(http.StatusInternalServerError)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSONError(err))
builder.Write()
}
2018-10-08 03:42:43 +02:00
// BadRequest sends a bad request error to the client.
func BadRequest(w http.ResponseWriter, r *http.Request, err error) {
logger.Error("[HTTP:Bad Request] %s => %v", r.URL, err)
2018-10-08 03:42:43 +02:00
builder := response.New(w, r)
builder.WithStatus(http.StatusBadRequest)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSONError(err))
builder.Write()
}
2018-10-08 03:42:43 +02:00
// Unauthorized sends a not authorized error to the client.
func Unauthorized(w http.ResponseWriter, r *http.Request) {
logger.Error("[HTTP:Unauthorized] %s", r.URL)
2018-10-08 03:42:43 +02:00
builder := response.New(w, r)
builder.WithStatus(http.StatusUnauthorized)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSONError(errors.New("Access Unauthorized")))
builder.Write()
}
2018-10-08 03:42:43 +02:00
// Forbidden sends a forbidden error to the client.
func Forbidden(w http.ResponseWriter, r *http.Request) {
logger.Error("[HTTP:Forbidden] %s", r.URL)
2018-10-08 03:42:43 +02:00
builder := response.New(w, r)
builder.WithStatus(http.StatusForbidden)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSONError(errors.New("Access Forbidden")))
builder.Write()
}
2018-10-08 03:42:43 +02:00
// NotFound sends a page not found error to the client.
func NotFound(w http.ResponseWriter, r *http.Request) {
logger.Error("[HTTP:Not Found] %s", r.URL)
builder := response.New(w, r)
builder.WithStatus(http.StatusNotFound)
builder.WithHeader("Content-Type", contentTypeHeader)
2018-10-08 03:42:43 +02:00
builder.WithBody(toJSONError(errors.New("Resource Not Found")))
builder.Write()
}
2018-10-08 03:42:43 +02:00
func toJSONError(err error) []byte {
type errorMsg struct {
ErrorMessage string `json:"error_message"`
}
2018-10-08 03:42:43 +02:00
return toJSON(errorMsg{ErrorMessage: err.Error()})
}
func toJSON(v interface{}) []byte {
b, err := json.Marshal(v)
if err != nil {
2018-10-08 03:42:43 +02:00
logger.Error("[HTTP:JSON] %v", err)
return []byte("")
}
return b
}