1
0
mirror of https://github.com/golang/go synced 2024-11-12 10:30:23 -07:00

encoding/json: fix EOF bug decoding HTTP stream

Fixes bug referenced in this thread on golang-dev:
https://groups.google.com/d/topic/golang-dev/U4LSpMzL82c/discussion

Change-Id: If01a2644863f9e5625dd2f95f9d344bda772e12c
Reviewed-on: https://go-review.googlesource.com/12726
Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
Peter Waldschmidt 2015-07-27 21:33:53 -04:00 committed by Russ Cox
parent a01d90744f
commit 7e70c2468b
2 changed files with 48 additions and 1 deletions

View File

@ -437,6 +437,7 @@ func (dec *Decoder) More() bool {
}
func (dec *Decoder) peek() (byte, error) {
var err error
for {
for i := dec.scanp; i < len(dec.buf); i++ {
c := dec.buf[i]
@ -446,9 +447,11 @@ func (dec *Decoder) peek() (byte, error) {
dec.scanp = i
return c, nil
}
if err := dec.refill(); err != nil {
// buffer has been scanned, now report any error
if err != nil {
return 0, err
}
err = dec.refill()
}
}

View File

@ -8,7 +8,10 @@ import (
"bytes"
"io"
"io/ioutil"
"log"
"net"
"net/http"
"net/http/httptest"
"reflect"
"strings"
"testing"
@ -315,3 +318,44 @@ func TestDecodeInStream(t *testing.T) {
}
}
const raw = `{ "foo": "bar" }`
func makeHTTP() io.ReadCloser {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(raw))
})
ts := httptest.NewServer(mux)
defer ts.Close()
res, err := http.Get(ts.URL)
if err != nil {
log.Fatalf("GET failed: %v", err)
}
return res.Body
}
func TestHttpDecoding(t *testing.T) {
foo := struct {
Foo string
}{}
rc := makeHTTP()
defer rc.Close()
d := NewDecoder(rc)
err := d.Decode(&foo)
if err != nil {
t.Errorf("Unexpected error %v", err)
}
if foo.Foo != "bar" {
t.Errorf("Expected \"bar\", was %v", foo.Foo)
}
// make sure we get the EOF the second time
err = d.Decode(&foo)
if err != io.EOF {
t.Errorf("Expected io.EOF, was %v", err)
}
}