From 9ff3dc1d5086e4f98442c7e08f1b05571f467707 Mon Sep 17 00:00:00 2001 From: James Jeffrey Date: Fri, 28 Jul 2017 11:05:30 -0700 Subject: [PATCH] Export handling error response (#171) --- api/server/error_response.go | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/api/server/error_response.go b/api/server/error_response.go index 200e0b673..ded558874 100644 --- a/api/server/error_response.go +++ b/api/server/error_response.go @@ -1,14 +1,16 @@ package server import ( + "context" + "encoding/json" "errors" "net/http" "runtime/debug" "github.com/Sirupsen/logrus" - "github.com/gin-gonic/gin" "github.com/fnproject/fn/api/models" "github.com/fnproject/fn/api/runner/common" + "github.com/gin-gonic/gin" ) // ErrInternalServerError returned when something exceptional happens. @@ -19,15 +21,28 @@ func simpleError(err error) *models.Error { } func handleErrorResponse(c *gin.Context, err error) { - log := common.Logger(c.Request.Context()) + HandleErrorResponse(c.Request.Context(), c.Writer, err) +} + +// HandleErrorResponse used to handle response errors in the same way. +func HandleErrorResponse(ctx context.Context, w http.ResponseWriter, err error) { + log := common.Logger(ctx) + var statuscode int switch e := err.(type) { case models.APIError: if e.Code() >= 500 { log.WithFields(logrus.Fields{"code": e.Code()}).WithError(e).Error("api error") } - c.JSON(e.Code(), simpleError(e)) + statuscode = e.Code() default: log.WithError(err).WithFields(logrus.Fields{"stack": string(debug.Stack())}).Error("internal server error") - c.JSON(http.StatusInternalServerError, simpleError(ErrInternalServerError)) + statuscode = http.StatusInternalServerError + err = ErrInternalServerError + } + w.Header().Set("Content-Type", "application/json; charset=utf-8") + w.WriteHeader(statuscode) + err = json.NewEncoder(w).Encode(simpleError(err)) + if err != nil { + log.WithError(err).Errorln("error encoding error json") } }