improve error handling on json marshalling
This commit is contained in:
parent
e5850035dd
commit
2d45f059ec
1 changed files with 24 additions and 9 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue