From 6c8f5bcaf130edcd364dc45fa44502e24b18c5fa Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Thu, 16 Mar 2023 08:46:01 +0100 Subject: Report byte offset on parse error --- client/go/internal/vespa/feed/document.go | 8 ++++++++ client/go/internal/vespa/feed/document_test.go | 21 +++++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/client/go/internal/vespa/feed/document.go b/client/go/internal/vespa/feed/document.go index eccbb80b7c2..609e3f6c5aa 100644 --- a/client/go/internal/vespa/feed/document.go +++ b/client/go/internal/vespa/feed/document.go @@ -95,6 +95,14 @@ func (d *Decoder) readCloseToken() error { } func (d *Decoder) Decode() (Document, error) { + doc, err := d.decode() + if err != nil && err != io.EOF { + return Document{}, fmt.Errorf("invalid json at byte offset %d: %w", d.dec.InputOffset(), err) + } + return doc, err +} + +func (d *Decoder) decode() (Document, error) { if err := d.guessMode(); err != nil { return Document{}, err } diff --git a/client/go/internal/vespa/feed/document_test.go b/client/go/internal/vespa/feed/document_test.go index 6c8f92bdaa6..452c184a05a 100644 --- a/client/go/internal/vespa/feed/document_test.go +++ b/client/go/internal/vespa/feed/document_test.go @@ -132,4 +132,25 @@ func testDocumentDecoder(t *testing.T, jsonLike string) { func TestDocumentDecoder(t *testing.T) { testDocumentDecoder(t, feedInput(false)) testDocumentDecoder(t, feedInput(true)) + + jsonLike := ` +{ + "put": "id:ns:type::doc1", + "fields": {"foo": "123"} +} +{ + "put": "id:ns:type::doc1", + "fields": {"foo": "invalid +} +` + r := NewDecoder(strings.NewReader(jsonLike)) + _, err := r.Decode() // first object is valid + if err != nil { + t.Errorf("unexpected error: %s", err) + } + _, err = r.Decode() + wantErr := "invalid json at byte offset 60: invalid character '\\n' in string literal" + if err.Error() != wantErr { + t.Errorf("want error %q, got %q", wantErr, err.Error()) + } } -- cgit v1.2.3