Skip to content

Commit 0c193f6

Browse files
authored
Merge pull request #15 from francoispqt/update/improve-io-reader
improve io.Reader handling in decoder, handling EOF error and retrying
2 parents 616be90 + 55210b4 commit 0c193f6

File tree

3 files changed

+35
-9
lines changed

3 files changed

+35
-9
lines changed

decode.go

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,16 @@ func (dec *Decoder) read() bool {
291291
copy(Buf, dec.data)
292292
dec.data = Buf
293293
}
294-
n, err := dec.r.Read(dec.data[dec.length:])
295-
if err != nil {
296-
dec.err = err
297-
return false
298-
} else if n == 0 {
299-
return false
294+
var n int
295+
var err error
296+
for n == 0 {
297+
n, err = dec.r.Read(dec.data[dec.length:])
298+
if err != nil {
299+
if err != io.EOF {
300+
dec.err = err
301+
}
302+
return false
303+
}
300304
}
301305
dec.length = dec.length + n
302306
return true
@@ -305,10 +309,9 @@ func (dec *Decoder) read() bool {
305309
}
306310

307311
func (dec *Decoder) nextChar() byte {
308-
for dec.cursor < dec.length || dec.read() {
312+
for ; dec.cursor < dec.length || dec.read(); dec.cursor++ {
309313
switch dec.data[dec.cursor] {
310314
case ' ', '\n', '\t', '\r', ',':
311-
dec.cursor = dec.cursor + 1
312315
continue
313316
}
314317
d := dec.data[dec.cursor]

decode_stream.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ func (dec *StreamDecoder) DecodeStream(c UnmarshalerStream) error {
6363
return nil
6464
}
6565
}
66+
close(dec.done)
6667
return InvalidJSONError("Invalid JSON while parsing line delimited JSON")
6768
}
6869

decode_stream_test.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package gojay
22

33
import (
44
"context"
5+
"errors"
6+
"io"
57
"testing"
68
"time"
79

@@ -310,6 +312,20 @@ loop:
310312
testCase.expectations(dec.Err(), result, t)
311313
}
312314

315+
func TestStreamDecodingErr(t *testing.T) {
316+
testChan := ChannelStreamStrings(make(chan *string))
317+
dec := Stream.NewDecoder(&StreamReaderErr{})
318+
// start decoding (will block the goroutine until something is written to the ReadWriter)
319+
go dec.DecodeStream(testChan)
320+
select {
321+
case <-dec.Done():
322+
assert.NotNil(t, dec.Err(), "dec.Err() should not be nil")
323+
case <-testChan:
324+
assert.True(t, false, "should not be called")
325+
}
326+
327+
}
328+
313329
type ChannelStreamStrings chan *string
314330

315331
func (c ChannelStreamStrings) UnmarshalStream(dec *StreamDecoder) error {
@@ -355,10 +371,16 @@ func (r *StreamReader) Read(b []byte) (int, error) {
355371
n := copy(b, v)
356372
return n, nil
357373
case <-r.done:
358-
return 0, nil
374+
return 0, io.EOF
359375
}
360376
}
361377

378+
type StreamReaderErr struct{}
379+
380+
func (r *StreamReaderErr) Read(b []byte) (int, error) {
381+
return 0, errors.New("Test Error")
382+
}
383+
362384
// Deadline test
363385
func TestStreamDecodingDeadline(t *testing.T) {
364386
dec := Stream.NewDecoder(&StreamReader{})

0 commit comments

Comments
 (0)