diff --git a/backend/pkgs/logger/struct_logger.go b/backend/pkgs/logger/struct_logger.go index 2007ebb..2ebd3b6 100644 --- a/backend/pkgs/logger/struct_logger.go +++ b/backend/pkgs/logger/struct_logger.go @@ -11,6 +11,10 @@ import ( type Level int8 +var ( + IncludeTrace = false +) + const ( LevelDebug Level = iota LevelInfo @@ -88,8 +92,12 @@ func (l *Logger) print(level Level, message string, properties map[string]string } // Include a stack trace for entries at the ERROR and FATAL levels. + dumpTrace := false if level >= LevelError { - aux.Trace = string(debug.Stack()) + dumpTrace = true + if IncludeTrace { + aux.Trace = string(debug.Stack()) + } } // Declare a line variable for holding the actual log entry text. @@ -109,8 +117,11 @@ func (l *Logger) print(level Level, message string, properties map[string]string l.mu.Lock() defer l.mu.Unlock() - // Write the log entry followed by a newline. - return l.out.Write(append(line, '\n')) + n, err := l.out.Write(line) + if dumpTrace { + l.out.Write(debug.Stack()) + } + return n, err } // We also implement a Write() method on our Logger type so that it satisfies the diff --git a/backend/pkgs/server/constants.go b/backend/pkgs/server/constants.go index 1d07ef5..e083a57 100644 --- a/backend/pkgs/server/constants.go +++ b/backend/pkgs/server/constants.go @@ -1,7 +1,8 @@ package server const ( - ContentType = "Content-Type" - ContentJSON = "application/json" - ContentXML = "application/xml" + ContentType = "Content-Type" + ContentJSON = "application/json" + ContentXML = "application/xml" + ContentFormUrlEncoded = "application/x-www-form-urlencoded" ) diff --git a/backend/pkgs/server/response.go b/backend/pkgs/server/response.go index d4d008f..61cebf6 100644 --- a/backend/pkgs/server/response.go +++ b/backend/pkgs/server/response.go @@ -8,17 +8,16 @@ import ( // Respond converts a Go value to JSON and sends it to the client. // Adapted from https://github.com/ardanlabs/service/tree/master/foundation/web -func Respond(w http.ResponseWriter, statusCode int, data interface{}) error { - // If there is nothing to marshal then set status code and return. +func Respond(w http.ResponseWriter, statusCode int, data interface{}) { if statusCode == http.StatusNoContent { w.WriteHeader(statusCode) - return nil + return } // Convert the response value to JSON. jsonData, err := json.Marshal(data) if err != nil { - return err + panic(err) } // Set the content type and headers once we know marshaling has succeeded. @@ -29,10 +28,8 @@ func Respond(w http.ResponseWriter, statusCode int, data interface{}) error { // Send the result back to the client. if _, err := w.Write(jsonData); err != nil { - return err + panic(err) } - - return nil } // ResponseError is a helper function that sends a JSON response of an error message @@ -42,9 +39,9 @@ func RespondError(w http.ResponseWriter, statusCode int, err error) { eb.Respond(w, statusCode) } -// RespondInternalServerError is a wrapper around RespondError that sends a 500 internal server error. Useful for +// RespondServerError is a wrapper around RespondError that sends a 500 internal server error. Useful for // Sending generic errors when everything went wrong. -func RespondInternalServerError(w http.ResponseWriter) { +func RespondServerError(w http.ResponseWriter) { RespondError(w, http.StatusInternalServerError, errors.New("internal server error")) } diff --git a/backend/pkgs/server/response_test.go b/backend/pkgs/server/response_test.go index 2e98365..a6446d3 100644 --- a/backend/pkgs/server/response_test.go +++ b/backend/pkgs/server/response_test.go @@ -52,7 +52,7 @@ func Test_RespondError(t *testing.T) { func Test_RespondInternalServerError(t *testing.T) { recorder := httptest.NewRecorder() - RespondInternalServerError(recorder) + RespondServerError(recorder) assert.Equal(t, http.StatusInternalServerError, recorder.Code) assert.JSONEq(t, recorder.Body.String(), `{"details":["internal server error"], "message":"Internal Server Error", "error":true}`)