writer.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package shared
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "syscall"
  7. "github.com/porter-dev/porter/api/server/shared/apierrors"
  8. "github.com/porter-dev/porter/api/server/shared/apierrors/alerter"
  9. "github.com/porter-dev/porter/pkg/logger"
  10. )
  11. type ResultWriter interface {
  12. WriteResult(w http.ResponseWriter, r *http.Request, v interface{})
  13. }
  14. // default generalizes response codes for common operations
  15. // (http.StatusOK, http.StatusCreated, etc)
  16. type DefaultResultWriter struct {
  17. logger *logger.Logger
  18. alerter alerter.Alerter
  19. }
  20. func NewDefaultResultWriter(
  21. logger *logger.Logger,
  22. alerter alerter.Alerter,
  23. ) ResultWriter {
  24. return &DefaultResultWriter{logger, alerter}
  25. }
  26. func (j *DefaultResultWriter) WriteResult(w http.ResponseWriter, r *http.Request, v interface{}) {
  27. err := json.NewEncoder(w).Encode(v)
  28. if errors.Is(err, syscall.EPIPE) || errors.Is(err, syscall.ECONNRESET) {
  29. // either a broken pipe error or econnreset, ignore. This means the client closed the connection while
  30. // the server was sending bytes.
  31. return
  32. } else if err != nil {
  33. apierrors.HandleAPIError(j.logger, j.alerter, w, r, apierrors.NewErrInternal(err), true)
  34. }
  35. }