]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: fix EOF bug decoding HTTP stream
authorPeter Waldschmidt <peter@waldschmidt.com>
Tue, 28 Jul 2015 01:33:53 +0000 (21:33 -0400)
committerRuss Cox <rsc@golang.org>
Tue, 28 Jul 2015 02:51:55 +0000 (02:51 +0000)
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>
src/encoding/json/stream.go
src/encoding/json/stream_test.go

index 53e9b0fa9a405fbb9cca58bf87d4ff9324a16e09..3e8fe402681ea79ebe9cbbf3ddadefef2f998560 100644 (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()
        }
 }
 
index 3aff035fefd96018efced384665113d9aec0494f..1e9d3d0dce6907d0ee9f43b61e1b2c261c6102d5 100644 (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)
+       }
+}