portainer/portainer

View on GitHub
pkg/libhttp/response/response.go

Summary

Maintainability
A
0 mins
Test Coverage
// 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 interface{}) *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 interface{}, 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 interface{}) *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
}