Commit 7e70c246 authored by Peter Waldschmidt's avatar Peter Waldschmidt Committed by Russ Cox

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/12726Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
parent a01d9074
...@@ -437,6 +437,7 @@ func (dec *Decoder) More() bool { ...@@ -437,6 +437,7 @@ func (dec *Decoder) More() bool {
} }
func (dec *Decoder) peek() (byte, error) { func (dec *Decoder) peek() (byte, error) {
var err error
for { for {
for i := dec.scanp; i < len(dec.buf); i++ { for i := dec.scanp; i < len(dec.buf); i++ {
c := dec.buf[i] c := dec.buf[i]
...@@ -446,9 +447,11 @@ func (dec *Decoder) peek() (byte, error) { ...@@ -446,9 +447,11 @@ func (dec *Decoder) peek() (byte, error) {
dec.scanp = i dec.scanp = i
return c, nil return c, nil
} }
if err := dec.refill(); err != nil { // buffer has been scanned, now report any error
if err != nil {
return 0, err return 0, err
} }
err = dec.refill()
} }
} }
......
...@@ -8,7 +8,10 @@ import ( ...@@ -8,7 +8,10 @@ import (
"bytes" "bytes"
"io" "io"
"io/ioutil" "io/ioutil"
"log"
"net" "net"
"net/http"
"net/http/httptest"
"reflect" "reflect"
"strings" "strings"
"testing" "testing"
...@@ -315,3 +318,44 @@ func TestDecodeInStream(t *testing.T) { ...@@ -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)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment