improve error handling on json marshalling

This commit is contained in:
Niko Storni 2019-09-10 16:07:44 +02:00
parent e5850035dd
commit 2d45f059ec

View file

@ -113,21 +113,17 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var trace []string var trace []string
if TraceEnabled && errors.HasTrace(rsp.Error) { if TraceEnabled && errors.HasTrace(rsp.Error) {
trace = strings.Split(errors.Trace(rsp.Error), "\n") trace = getTraceFromError(rsp.Error)
for index, element := range trace {
if strings.HasPrefix(element, "\t") {
trace[index] = strings.Replace(element, "\t", " ", 1)
}
}
} }
// http://choly.ca/post/go-json-marshalling/ // http://choly.ca/post/go-json-marshalling/
jsonResponse, err := json.MarshalIndent(&struct { type apiResponse struct {
Success bool `json:"success"` Success bool `json:"success"`
Error *string `json:"error"` Error *string `json:"error"`
Data interface{} `json:"data"` Data interface{} `json:"data"`
Trace []string `json:"_trace,omitempty"` Trace []string `json:"_trace,omitempty"`
}{ }
jsonResponse, err := json.MarshalIndent(&apiResponse{
Success: success, Success: success,
Error: errorString, Error: errorString,
Data: rsp.Data, Data: rsp.Data,
@ -135,10 +131,29 @@ func (h Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}, "", " ") }, "", " ")
if err != nil { if err != nil {
Log(r, &rsp, errors.Prefix("Error encoding JSON response: ", err)) Log(r, &rsp, errors.Prefix("Error encoding JSON response: ", err))
jsonResponse, err = json.MarshalIndent(&apiResponse{
Success: false,
Error: util.PtrToString(err.Error()),
Data: rsp.Data,
Trace: getTraceFromError(err),
}, "", " ")
if err != nil {
Log(r, &rsp, errors.Prefix("Error encoding JSON response: ", err))
}
} }
w.WriteHeader(rsp.Status) w.WriteHeader(rsp.Status)
w.Write(jsonResponse) _, _ = w.Write(jsonResponse)
}
func getTraceFromError(err error) []string {
trace := strings.Split(errors.Trace(err), "\n")
for index, element := range trace {
if strings.HasPrefix(element, "\t") {
trace[index] = strings.Replace(element, "\t", " ", 1)
}
}
return trace
} }
// IgnoredFormFields are ignored by FormValues() when checking for extraneous fields // IgnoredFormFields are ignored by FormValues() when checking for extraneous fields