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

@ -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)
}
}