gojay

high performance JSON encoder/decoder with stream API for Golang
git clone git://git.lair.cx/gojay
Log | Files | Refs | README | LICENSE

commit cc245b0e4697a388d4f1ee8a9e09507cef8135c2
parent dd3bc129dd64a8ed3b9175610fc9f756bcd8b065
Author: francoispqt <francois@parquet.ninja>
Date:   Thu,  3 May 2018 00:14:43 +0800

improve io.Reader handling in decoder

Diffstat:
Mdecode.go | 18+++++++++++-------
Mdecode_stream_test.go | 3++-
2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/decode.go b/decode.go @@ -291,14 +291,18 @@ func (dec *Decoder) read() bool { copy(Buf, dec.data) dec.data = Buf } - n, err := dec.r.Read(dec.data[dec.length:]) - if err != nil { - dec.err = err - return false - } else if n == 0 { - return false + bRead := 0 + for bRead == 0 { + n, err := dec.r.Read(dec.data[dec.length:]) + if err != nil { + if err != io.EOF { + dec.err = err + } + return false + } + bRead = n } - dec.length = dec.length + n + dec.length = dec.length + bRead return true } return false diff --git a/decode_stream_test.go b/decode_stream_test.go @@ -2,6 +2,7 @@ package gojay import ( "context" + "io" "testing" "time" @@ -355,7 +356,7 @@ func (r *StreamReader) Read(b []byte) (int, error) { n := copy(b, v) return n, nil case <-r.done: - return 0, nil + return 0, io.EOF } }