You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
portainer/pkg/libhttp/response/response.go

58 lines
1.6 KiB

// Package response provides convenience functions to write into a http.ResponseWriter.
package response
import (
"errors"
"fmt"
"net/http"
httperror "github.com/portainer/portainer/pkg/libhttp/error"
"github.com/segmentio/encoding/json"
)
// JSON encodes data to rw in JSON format. Returns a pointer to a
// HandlerError if encoding fails.
func JSON(rw http.ResponseWriter, data any) *httperror.HandlerError {
return JSONWithStatus(rw, data, http.StatusOK)
}
// JSONWithStatus encodes data to rw in JSON format with a specific status code.
// Returns a pointer to a HandlerError if encoding fails.
func JSONWithStatus(rw http.ResponseWriter, data any, status int) *httperror.HandlerError {
rw.Header().Set("Content-Type", "application/json")
rw.WriteHeader(status)
enc := json.NewEncoder(rw)
enc.SetSortMapKeys(false)
enc.SetAppendNewline(false)
err := enc.Encode(data)
if err != nil {
return httperror.InternalServerError("Unable to write JSON response", err)
}
return nil
}
// JSON encodes data to rw in YAML format. Returns a pointer to a
// HandlerError if encoding fails.
func YAML(rw http.ResponseWriter, data any) *httperror.HandlerError {
rw.Header().Set("Content-Type", "text/yaml")
strData, ok := data.(string)
if !ok {
return httperror.InternalServerError("Unable to write YAML response", errors.New("failed to convert input to string"))
}
fmt.Fprint(rw, strData)
return nil
}
// Empty merely sets the response code to NoContent (204).
func Empty(rw http.ResponseWriter) *httperror.HandlerError {
rw.WriteHeader(http.StatusNoContent)
return nil
}