}
func (dec *Decoder) peek() (byte, error) {
+ var err error
for {
for i := dec.scanp; i < len(dec.buf); i++ {
c := dec.buf[i]
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()
}
}
"bytes"
"io"
"io/ioutil"
+ "log"
"net"
+ "net/http"
+ "net/http/httptest"
"reflect"
"strings"
"testing"
}
}
+
+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)
+ }
+}