From 94490a0a9abb76aa162fbaf0c8a3513963f00a07 Mon Sep 17 00:00:00 2001 From: Kaleb Elwert Date: Tue, 16 Jun 2020 01:35:17 -0700 Subject: [PATCH 1/4] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..b2604cc --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [belak] From 9c29b9d2a2c341a62a50a7a2241d66aefc6587a8 Mon Sep 17 00:00:00 2001 From: Ilia Choly Date: Thu, 13 Aug 2020 09:38:03 -0400 Subject: [PATCH 2/4] Add Param method to Message type --- parser.go | 9 +++++++++ parser_test.go | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/parser.go b/parser.go index 0ed6c64..6889a00 100644 --- a/parser.go +++ b/parser.go @@ -315,6 +315,15 @@ func ParseMessage(line string) (*Message, error) { return c, nil } +// Param returns the i'th argument in the Message or an empty string +// if the requested arg does not exist +func (m *Message) Param(i int) string { + if i < 0 || i >= len(m.Params) { + return "" + } + return m.Params[i] +} + // Trailing returns the last argument in the Message or an empty string // if there are no args func (m *Message) Trailing() string { diff --git a/parser_test.go b/parser_test.go index f639184..710f6a7 100644 --- a/parser_test.go +++ b/parser_test.go @@ -68,6 +68,15 @@ func TestMustParseMessage(t *testing.T) { }, "Got unexpected panic") } +func TestMessageParam(t *testing.T) { + t.Parallel() + + m := MustParseMessage("PING :test") + assert.Equal(t, m.Param(0), "test") + assert.Equal(t, m.Param(-1), "") + assert.Equal(t, m.Param(2), "") +} + func TestMessageTrailing(t *testing.T) { t.Parallel() From db51cb8e93a40d7737babf936c50ba88a1665c21 Mon Sep 17 00:00:00 2001 From: Kaleb Elwert Date: Tue, 19 Jan 2021 09:26:44 -0800 Subject: [PATCH 3/4] Update to stable versions of GitHub Actions --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0d953d..2a1cb78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,17 +12,20 @@ jobs: steps: - name: Set up Go - uses: actions/setup-go@v2-beta + uses: actions/setup-go@v2 with: go-version: '^1.7' - name: Check out code - uses: actions/checkout@9a3a9ade + uses: actions/checkout@v2 with: submodules: true - name: Clean up extra files run: rm ./testcases/*.go + + - name: Download deps + run: go mod download - name: Run golangci-lint uses: actions-contrib/golangci-lint@v1 @@ -31,9 +34,6 @@ jobs: with: golangci_lint_version: 'v1.23.6' - - name: Download deps - run: go mod download - - name: Run tests run: go test -race -v ./... From 81824d727e960fc22fa1c8a5aea4acaf6e957e19 Mon Sep 17 00:00:00 2001 From: Hubert Hirtz Date: Tue, 19 Jan 2021 17:45:41 +0000 Subject: [PATCH 4/4] reader: ignore empty messages (#81) Co-authored-by: Kaleb Elwert --- conn.go | 30 +++++++++++++++++++----------- conn_test.go | 6 ++++++ 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/conn.go b/conn.go index 7f9b68e..f778e95 100644 --- a/conn.go +++ b/conn.go @@ -88,16 +88,24 @@ func NewReader(r io.Reader) *Reader { } // ReadMessage returns the next message from the stream or an error. -func (r *Reader) ReadMessage() (*Message, error) { - line, err := r.reader.ReadString('\n') - if err != nil { - return nil, err +// It ignores empty messages. +func (r *Reader) ReadMessage() (msg *Message, err error) { + // It's valid for a message to be empty. Clients should ignore these, + // so we do to be good citizens. + err = ErrZeroLengthMessage + for err == ErrZeroLengthMessage { + var line string + line, err = r.reader.ReadString('\n') + if err != nil { + return nil, err + } + + if r.DebugCallback != nil { + r.DebugCallback(line) + } + + // Parse the message from our line + msg, err = ParseMessage(line) } - - if r.DebugCallback != nil { - r.DebugCallback(line) - } - - // Parse the message from our line - return ParseMessage(line) + return msg, err } diff --git a/conn_test.go b/conn_test.go index c0ddd9b..836c8dd 100644 --- a/conn_test.go +++ b/conn_test.go @@ -121,6 +121,12 @@ func TestConn(t *testing.T) { _, err := c.ReadMessage() assert.Equal(t, ErrMissingDataAfterPrefix, err) + // Ensure empty messages are ignored + m = MustParseMessage("001 test_nick") + rwc.server.WriteString("\r\n" + m.String() + "\r\n") + m2 = testReadMessage(t, c) + assert.EqualValues(t, m, m2, "Message returned by client did not match input") + // This is an odd one... if there wasn't any output, it'll hit // EOF, so we expect an error here so we can test an error // condition.