Skip to content

Commit 63a9f34

Browse files
authored
setting TLSError message as debug (#197)
1 parent 2fb4ae1 commit 63a9f34

File tree

2 files changed

+70
-4
lines changed

2 files changed

+70
-4
lines changed

server/server.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package server
22

33
import (
4+
"bytes"
45
"context"
56
"crypto"
67
"crypto/tls"
78
"crypto/x509"
89
"fmt"
10+
"io"
911
"log"
1012
"net"
1113
"net/http"
@@ -40,7 +42,24 @@ type ListenOpts struct {
4042
// Override legacy behavior where server logs written to the application's logrus object
4143
// were dropped unless logrus was set to debug-level (such as by launching steve with '--debug').
4244
// Setting this to true results in server logs appearing at an ERROR level.
43-
DisplayServerLogs bool
45+
DisplayServerLogs bool
46+
IgnoreTLSHandshakeError bool
47+
}
48+
49+
var TLSHandshakeError = []byte("http: TLS handshake error")
50+
51+
var _ io.Writer = &TLSErrorDebugger{}
52+
53+
type TLSErrorDebugger struct{}
54+
55+
func (t *TLSErrorDebugger) Write(p []byte) (n int, err error) {
56+
p = bytes.TrimSpace(p)
57+
if bytes.HasPrefix(p, TLSHandshakeError) {
58+
logrus.Debug(string(p))
59+
} else {
60+
logrus.Error(string(p))
61+
}
62+
return len(p), err
4463
}
4564

4665
func ListenAndServe(ctx context.Context, httpsPort, httpPort int, handler http.Handler, opts *ListenOpts) error {
@@ -52,9 +71,15 @@ func ListenAndServe(ctx context.Context, httpsPort, httpPort int, handler http.H
5271
if opts.DisplayServerLogs {
5372
writer = logger.WriterLevel(logrus.ErrorLevel)
5473
}
55-
// Otherwise preserve legacy behaviour of displaying server logs only in debug mode.
5674

57-
errorLog := log.New(writer, "", log.LstdFlags)
75+
var errorLog *log.Logger
76+
if opts.IgnoreTLSHandshakeError {
77+
debugWriter := &TLSErrorDebugger{}
78+
errorLog = log.New(debugWriter, "", 0)
79+
} else {
80+
// Otherwise preserve legacy behaviour of displaying server logs only in debug mode.
81+
errorLog = log.New(writer, "", 0)
82+
}
5883

5984
if opts.TLSListenerConfig.TLSConfig == nil {
6085
opts.TLSListenerConfig.TLSConfig = &tls.Config{}

server/server_test.go

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,47 @@ func (s *safeWriter) Write(p []byte) (n int, err error) {
3939
return s.writer.Write(p)
4040
}
4141

42+
func TestTLSHandshakeErrorWriter(t *testing.T) {
43+
tests := []struct {
44+
name string
45+
ignoreTLSHandshakeError bool
46+
message []byte
47+
expectedLevel logrus.Level
48+
}{
49+
{
50+
name: "TLS handshake error is logged as debug",
51+
message: []byte("http: TLS handshake error: EOF"),
52+
expectedLevel: logrus.DebugLevel,
53+
},
54+
{
55+
name: "other errors are logged as error",
56+
message: []byte("some other server error"),
57+
expectedLevel: logrus.ErrorLevel,
58+
},
59+
}
60+
var baseLogLevel = logrus.GetLevel()
61+
for _, tt := range tests {
62+
t.Run(tt.name, func(t *testing.T) {
63+
assert := assertPkg.New(t)
64+
65+
var buf bytes.Buffer
66+
logrus.SetOutput(&buf)
67+
logrus.SetLevel(logrus.DebugLevel)
68+
69+
debugger := &TLSErrorDebugger{}
70+
n, err := debugger.Write(tt.message)
71+
72+
assert.Nil(err)
73+
assert.Equal(len(tt.message), n)
74+
75+
logOutput := buf.String()
76+
assert.Contains(logOutput, "level="+tt.expectedLevel.String())
77+
assert.Contains(logOutput, string(tt.message))
78+
})
79+
}
80+
logrus.SetLevel(baseLogLevel)
81+
}
82+
4283
func TestHttpServerLogWithLogrus(t *testing.T) {
4384
assert := assertPkg.New(t)
4485
message := "debug-level writer"
@@ -84,7 +125,7 @@ func doRequest(safeWriter *safeWriter, message string, logLevel logrus.Level) er
84125
msg := fmt.Sprintf("panicking context: %s", message)
85126
handler := alwaysPanicHandler{msg: msg}
86127
listenOpts := &ListenOpts{
87-
BindHost: host,
128+
BindHost: host,
88129
DisplayServerLogs: logLevel == logrus.ErrorLevel,
89130
}
90131

0 commit comments

Comments
 (0)