// Copyright 2018 Frédéric Guillot. All rights reserved. // Use of this source code is governed by the MIT license // that can be found in the LICENSE file. package json // import "miniflux.app/http/response/json" import ( "encoding/json" "errors" "net/http" "miniflux.app/http/response" "miniflux.app/logger" ) // 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", "application/json; charset=utf-8") builder.WithBody(toJSON(body)) builder.Write() } // 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", "application/json; charset=utf-8") builder.WithBody(toJSON(body)) builder.Write() } // 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", "application/json; charset=utf-8") builder.Write() } // 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", "application/json; charset=utf-8") builder.WithBody(toJSONError(err)) builder.Write() } // 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) builder := response.New(w, r) builder.WithStatus(http.StatusBadRequest) builder.WithHeader("Content-Type", "application/json; charset=utf-8") builder.WithBody(toJSONError(err)) builder.Write() } // Unauthorized sends a not authorized error to the client. func Unauthorized(w http.ResponseWriter, r *http.Request) { logger.Error("[HTTP:Unauthorized] %s", r.URL) builder := response.New(w, r) builder.WithStatus(http.StatusUnauthorized) builder.WithHeader("Content-Type", "application/json; charset=utf-8") builder.WithBody(toJSONError(errors.New("Access Unauthorized"))) builder.Write() } // Forbidden sends a forbidden error to the client. func Forbidden(w http.ResponseWriter, r *http.Request) { logger.Error("[HTTP:Forbidden] %s", r.URL) builder := response.New(w, r) builder.WithStatus(http.StatusForbidden) builder.WithHeader("Content-Type", "application/json; charset=utf-8") builder.WithBody(toJSONError(errors.New("Access Forbidden"))) builder.Write() } // 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", "application/json; charset=utf-8") builder.WithBody(toJSONError(errors.New("Resource Not Found"))) builder.Write() } func toJSONError(err error) []byte { type errorMsg struct { ErrorMessage string `json:"error_message"` } return toJSON(errorMsg{ErrorMessage: err.Error()}) } func toJSON(v interface{}) []byte { b, err := json.Marshal(v) if err != nil { logger.Error("[HTTP:JSON] %v", err) return []byte("") } return b }