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/request/payload.go

38 lines
1.0 KiB

package request
import (
"net/http"
"github.com/pkg/errors"
"github.com/segmentio/encoding/json"
)
// PayloadValidation is an interface used to validate the payload of a request.
type PayloadValidation interface {
Validate(request *http.Request) error
}
// DecodeAndValidateJSONPayload decodes the body of the request into an object
// implementing the PayloadValidation interface.
// It also triggers a validation of object content.
func DecodeAndValidateJSONPayload(request *http.Request, v PayloadValidation) error {
if err := json.NewDecoder(request.Body).Decode(v); err != nil {
return err
}
return v.Validate(request)
}
// GetPayload decodes the body of the request into an object implementing the PayloadValidation interface.
func GetPayload[T any, PT interface {
*T
Validate(request *http.Request) error
}](r *http.Request) (PT, error) {
p := PT(new(T))
err := DecodeAndValidateJSONPayload(r, p)
if err != nil {
return nil, errors.WithMessage(err, "Invalid request payload")
}
return p, nil
}