Skip to content

Commit 878fe71

Browse files
authored
Fix defaultLogEntry.Panic not respecting NoColor setting (#1050)
Panic() called PrintPrettyStack() which hardcodes useColor=true. Thread the useColor flag from defaultLogEntry through to prettyStack.parse() so it respects DefaultLogFormatter.NoColor. Fixes #1042
1 parent d7b767b commit 878fe71

3 files changed

Lines changed: 34 additions & 4 deletions

File tree

middleware/logger.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func (l *defaultLogEntry) Write(status, bytes int, header http.Header, elapsed t
166166
}
167167

168168
func (l *defaultLogEntry) Panic(v interface{}, stack []byte) {
169-
PrintPrettyStack(v)
169+
printPrettyStack(v, l.useColor)
170170
}
171171

172172
func init() {

middleware/recoverer.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@ func Recoverer(next http.Handler) http.Handler {
5252
var recovererErrorWriter io.Writer = os.Stderr
5353

5454
func PrintPrettyStack(rvr interface{}) {
55+
printPrettyStack(rvr, true)
56+
}
57+
58+
func printPrettyStack(rvr interface{}, useColor bool) {
5559
debugStack := debug.Stack()
5660
s := prettyStack{}
57-
out, err := s.parse(debugStack, rvr)
61+
out, err := s.parse(debugStack, rvr, useColor)
5862
if err == nil {
5963
recovererErrorWriter.Write(out)
6064
} else {
@@ -66,9 +70,8 @@ func PrintPrettyStack(rvr interface{}) {
6670
type prettyStack struct {
6771
}
6872

69-
func (s prettyStack) parse(debugStack []byte, rvr interface{}) ([]byte, error) {
73+
func (s prettyStack) parse(debugStack []byte, rvr interface{}, useColor bool) ([]byte, error) {
7074
var err error
71-
useColor := true
7275
buf := &bytes.Buffer{}
7376

7477
cW(buf, false, bRed, "\n")

middleware/recoverer_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import (
1212

1313
func panickingHandler(http.ResponseWriter, *http.Request) { panic("foo") }
1414

15+
type testPrintLogger struct{}
16+
17+
func (testPrintLogger) Print(v ...interface{}) {}
18+
1519
func TestRecoverer(t *testing.T) {
1620
r := chi.NewRouter()
1721

@@ -41,6 +45,29 @@ func TestRecoverer(t *testing.T) {
4145
t.Fatal("First func call line should start with ->.")
4246
}
4347

48+
func TestRecovererNoColor(t *testing.T) {
49+
oldRecovererErrorWriter := recovererErrorWriter
50+
defer func() { recovererErrorWriter = oldRecovererErrorWriter }()
51+
buf := &bytes.Buffer{}
52+
recovererErrorWriter = buf
53+
54+
r := chi.NewRouter()
55+
r.Use(RequestLogger(&DefaultLogFormatter{Logger: testPrintLogger{}, NoColor: true}))
56+
r.Use(Recoverer)
57+
r.Get("/", panickingHandler)
58+
59+
ts := httptest.NewServer(r)
60+
defer ts.Close()
61+
62+
res, _ := testRequest(t, ts, "GET", "/", nil)
63+
assertEqual(t, res.StatusCode, http.StatusInternalServerError)
64+
65+
// ANSI escape sequences start with \x1b[
66+
if strings.Contains(buf.String(), "\x1b[") {
67+
t.Fatal("Output should not contain ANSI color codes when NoColor is true")
68+
}
69+
}
70+
4471
func TestRecovererAbortHandler(t *testing.T) {
4572
defer func() {
4673
rcv := recover()

0 commit comments

Comments
 (0)