reader.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package shared
  2. import (
  3. "fmt"
  4. "net/http"
  5. "github.com/porter-dev/porter/api/server/shared/apierrors"
  6. "github.com/porter-dev/porter/api/server/shared/config"
  7. "github.com/porter-dev/porter/api/server/shared/requestutils"
  8. )
  9. type RequestDecoderValidator interface {
  10. DecodeAndValidate(w http.ResponseWriter, r *http.Request, v interface{}) bool
  11. DecodeAndValidateNoWrite(r *http.Request, v interface{}) error
  12. }
  13. type DefaultRequestDecoderValidator struct {
  14. config *config.Config
  15. validator requestutils.Validator
  16. decoder requestutils.Decoder
  17. }
  18. func NewDefaultRequestDecoderValidator(
  19. conf *config.Config,
  20. ) RequestDecoderValidator {
  21. validator := requestutils.NewDefaultValidator()
  22. decoder := requestutils.NewDefaultDecoder()
  23. return &DefaultRequestDecoderValidator{conf, validator, decoder}
  24. }
  25. func (j *DefaultRequestDecoderValidator) DecodeAndValidate(
  26. w http.ResponseWriter,
  27. r *http.Request,
  28. v interface{},
  29. ) (ok bool) {
  30. var requestErr apierrors.RequestError
  31. // decode the request parameters (body and query)
  32. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  33. apierrors.HandleAPIError(j.config, w, r, requestErr, true)
  34. return false
  35. }
  36. // validate the request object
  37. if requestErr = j.validator.Validate(v); requestErr != nil {
  38. apierrors.HandleAPIError(j.config, w, r, requestErr, true)
  39. return false
  40. }
  41. return true
  42. }
  43. func (j *DefaultRequestDecoderValidator) DecodeAndValidateNoWrite(
  44. r *http.Request,
  45. v interface{},
  46. ) error {
  47. var requestErr apierrors.RequestError
  48. // decode the request parameters (body and query)
  49. if requestErr = j.decoder.Decode(v, r); requestErr != nil {
  50. return fmt.Errorf(requestErr.InternalError())
  51. }
  52. // validate the request object
  53. if requestErr = j.validator.Validate(v); requestErr != nil {
  54. return fmt.Errorf(requestErr.InternalError())
  55. }
  56. return nil
  57. }