forked from mirror/go-json
Merge pull request #124 from vearutop/streaming-decode
Wait for io.EOF when decoding a stream
This commit is contained in:
commit
d7c9594839
|
@ -75,7 +75,7 @@ func (s *stream) read() bool {
|
||||||
buf[last] = nul
|
buf[last] = nul
|
||||||
n, err := s.r.Read(buf[:last])
|
n, err := s.r.Read(buf[:last])
|
||||||
s.length = s.cursor + int64(n)
|
s.length = s.cursor + int64(n)
|
||||||
if n < last || err == io.EOF {
|
if err == io.EOF {
|
||||||
s.allRead = true
|
s.allRead = true
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return false
|
return false
|
||||||
|
|
|
@ -6,6 +6,7 @@ package json_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"compress/gzip"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"log"
|
"log"
|
||||||
|
@ -463,3 +464,41 @@ func TestHTTPDecoding(t *testing.T) {
|
||||||
t.Errorf("err = %v; want io.EOF", err)
|
t.Errorf("err = %v; want io.EOF", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGzipStreaming(t *testing.T) {
|
||||||
|
type someStruct struct {
|
||||||
|
ID int `json:"id"`
|
||||||
|
Text []string `json:"text"`
|
||||||
|
}
|
||||||
|
|
||||||
|
manyItems := strings.Repeat(`"Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam`+
|
||||||
|
` nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur?",`, 400)
|
||||||
|
|
||||||
|
longJSON := `{"id":123,"text":[` + manyItems[0:len(manyItems)-1] + `]}`
|
||||||
|
|
||||||
|
compressed := bytes.NewBuffer(nil)
|
||||||
|
gw := gzip.NewWriter(compressed)
|
||||||
|
|
||||||
|
_, err := io.Copy(gw, bytes.NewReader([]byte(longJSON)))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = gw.Close()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
gr, err := gzip.NewReader(bytes.NewReader(compressed.Bytes()))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var v someStruct
|
||||||
|
dec := json.NewDecoder(gr)
|
||||||
|
|
||||||
|
err = dec.Decode(&v)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue