report read limit violations on EventDisconnected via ErrReadLimit sentinel
This commit is contained in:
@@ -27,6 +27,7 @@ var (
|
||||
ErrPeerClosedClean = errors.New("peer closed connection cleanly")
|
||||
ErrPeerClosedUnexpected = errors.New("peer closed connection unexpectedly")
|
||||
ErrReadError = errors.New("read error")
|
||||
ErrReadLimit = errors.New("read limit exceeded")
|
||||
)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -350,7 +351,12 @@ func (c *Connection) classifyCloseError(err error) error {
|
||||
}
|
||||
}
|
||||
|
||||
classifiedError = fmt.Errorf("%w: %w", ErrReadError, err)
|
||||
if errors.Is(err, websocket.ErrReadLimit) {
|
||||
classifiedError = fmt.Errorf("%w: %w: %v",
|
||||
ErrReadError, ErrReadLimit, err)
|
||||
} else {
|
||||
classifiedError = fmt.Errorf("%w: %w", ErrReadError, err)
|
||||
}
|
||||
}
|
||||
|
||||
return classifiedError
|
||||
|
||||
@@ -225,6 +225,51 @@ func TestConnection_Errors(t *testing.T) {
|
||||
}, "expected read error")
|
||||
|
||||
})
|
||||
|
||||
t.Run("read limit exceeded", func(t *testing.T) {
|
||||
mockSocket := honeybeetest.NewMockSocket()
|
||||
mockSocket.ReadMessageFunc = func() (int, []byte, error) {
|
||||
return 0, nil, websocket.ErrReadLimit
|
||||
}
|
||||
|
||||
conn, err := NewConnection(context.Background(), mockSocket, nil, nil)
|
||||
assert.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
honeybeetest.Eventually(t, func() bool {
|
||||
select {
|
||||
case err := <-conn.Errors():
|
||||
return errors.Is(err, ErrReadLimit) &&
|
||||
errors.Is(err, ErrReadError) &&
|
||||
!errors.Is(err, websocket.ErrReadLimit)
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}, "expected read limit error classified as ErrReadLimit")
|
||||
|
||||
})
|
||||
|
||||
t.Run("generic read error is not a read limit error", func(t *testing.T) {
|
||||
mockSocket := honeybeetest.NewMockSocket()
|
||||
mockSocket.ReadMessageFunc = func() (int, []byte, error) {
|
||||
return 0, nil, io.EOF
|
||||
}
|
||||
|
||||
conn, err := NewConnection(context.Background(), mockSocket, nil, nil)
|
||||
assert.NoError(t, err)
|
||||
defer conn.Close()
|
||||
|
||||
honeybeetest.Eventually(t, func() bool {
|
||||
select {
|
||||
case err := <-conn.Errors():
|
||||
return errors.Is(err, ErrReadError) &&
|
||||
!errors.Is(err, ErrReadLimit)
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}, "expected generic read error without ErrReadLimit")
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
func TestConnection_Heartbeat(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user