Skip to content

Commit 81824d7

Browse files
hhirtzbelak
andauthored
reader: ignore empty messages (#81)
Co-authored-by: Kaleb Elwert <belak@coded.io>
1 parent db51cb8 commit 81824d7

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

conn.go

+19-11
Original file line numberDiff line numberDiff line change
@@ -88,16 +88,24 @@ func NewReader(r io.Reader) *Reader {
8888
}
8989

9090
// ReadMessage returns the next message from the stream or an error.
91-
func (r *Reader) ReadMessage() (*Message, error) {
92-
line, err := r.reader.ReadString('\n')
93-
if err != nil {
94-
return nil, err
91+
// It ignores empty messages.
92+
func (r *Reader) ReadMessage() (msg *Message, err error) {
93+
// It's valid for a message to be empty. Clients should ignore these,
94+
// so we do to be good citizens.
95+
err = ErrZeroLengthMessage
96+
for err == ErrZeroLengthMessage {
97+
var line string
98+
line, err = r.reader.ReadString('\n')
99+
if err != nil {
100+
return nil, err
101+
}
102+
103+
if r.DebugCallback != nil {
104+
r.DebugCallback(line)
105+
}
106+
107+
// Parse the message from our line
108+
msg, err = ParseMessage(line)
95109
}
96-
97-
if r.DebugCallback != nil {
98-
r.DebugCallback(line)
99-
}
100-
101-
// Parse the message from our line
102-
return ParseMessage(line)
110+
return msg, err
103111
}

conn_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,12 @@ func TestConn(t *testing.T) {
121121
_, err := c.ReadMessage()
122122
assert.Equal(t, ErrMissingDataAfterPrefix, err)
123123

124+
// Ensure empty messages are ignored
125+
m = MustParseMessage("001 test_nick")
126+
rwc.server.WriteString("\r\n" + m.String() + "\r\n")
127+
m2 = testReadMessage(t, c)
128+
assert.EqualValues(t, m, m2, "Message returned by client did not match input")
129+
124130
// This is an odd one... if there wasn't any output, it'll hit
125131
// EOF, so we expect an error here so we can test an error
126132
// condition.

0 commit comments

Comments
 (0)