From eb8d352e3efdd3e95e1e0b6543b8140e9203e58a Mon Sep 17 00:00:00 2001 From: gabrielcorado Date: Thu, 10 Dec 2020 10:39:50 -0300 Subject: [PATCH 1/2] refactor(acceptor): check if the header sizer is empty --- acceptor/tcp_acceptor.go | 4 ++++ acceptor/tcp_acceptor_test.go | 23 +++++++++++++++++++++++ constants/errors.go | 1 + 3 files changed, 28 insertions(+) diff --git a/acceptor/tcp_acceptor.go b/acceptor/tcp_acceptor.go index 055efaf0..dadfeaf2 100644 --- a/acceptor/tcp_acceptor.go +++ b/acceptor/tcp_acceptor.go @@ -51,6 +51,10 @@ func (t *tcpPlayerConn) GetNextMessage() (b []byte, err error) { if err != nil { return nil, err } + // if the header has no data, we can consider it as a closed connection + if len(header) == 0 { + return nil, constants.ErrConnectionClosed + } msgSize, _, err := codec.ParseHeader(header) if err != nil { return nil, err diff --git a/acceptor/tcp_acceptor_test.go b/acceptor/tcp_acceptor_test.go index ff050d54..ca608aa7 100644 --- a/acceptor/tcp_acceptor_test.go +++ b/acceptor/tcp_acceptor_test.go @@ -242,7 +242,30 @@ func TestGetNextMessageEOF(t *testing.T) { _, err = playerConn.GetNextMessage() assert.EqualError(t, err, constants.ErrReceivedMsgSmallerThanExpected.Error()) +} +func TestGetNextMessageEmptyEOF(t *testing.T) { + a := NewTCPAcceptor("0.0.0.0:0") + go a.ListenAndServe() + defer a.Stop() + c := a.GetConnChan() + // should be able to connect within 100 milliseconds + var conn net.Conn + var err error + helpers.ShouldEventuallyReturn(t, func() error { + conn, err = net.Dial("tcp", a.GetAddr()) + return err + }, nil, 10*time.Millisecond, 100*time.Millisecond) + + playerConn := helpers.ShouldEventuallyReceive(t, c, 100*time.Millisecond).(PlayerConn) + + go func() { + time.Sleep(100 * time.Millisecond) + conn.Close() + }() + + _, err = playerConn.GetNextMessage() + assert.EqualError(t, err, constants.ErrConnectionClosed.Error()) } func TestGetNextMessageInParts(t *testing.T) { diff --git a/constants/errors.go b/constants/errors.go index 9e88fa74..b254cac0 100644 --- a/constants/errors.go +++ b/constants/errors.go @@ -84,4 +84,5 @@ var ( ErrRateLimitExceeded = errors.New("rate limit exceeded") ErrReceivedMsgSmallerThanExpected = errors.New("received less data than expected, EOF?") ErrReceivedMsgBiggerThanExpected = errors.New("received more data than expected") + ErrConnectionClosed = errors.New("client connection closed") ) From fb0f0d0206ce6f91a66b1e68e646c6ad13d7467e Mon Sep 17 00:00:00 2001 From: gabrielcorado Date: Thu, 10 Dec 2020 10:40:38 -0300 Subject: [PATCH 2/2] refactor(service): do not log message as an error what it is only closed --- service/handler.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/service/handler.go b/service/handler.go index 5026bebe..0cba8932 100644 --- a/service/handler.go +++ b/service/handler.go @@ -183,7 +183,10 @@ func (h *HandlerService) Handle(conn acceptor.PlayerConn) { msg, err := conn.GetNextMessage() if err != nil { - logger.Log.Errorf("Error reading next available message: %s", err.Error()) + if err != constants.ErrConnectionClosed { + logger.Log.Errorf("Error reading next available message: %s", err.Error()) + } + return }