diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-03-16 08:46:01 +0100 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2023-03-23 12:13:16 +0100 |
commit | 6c8f5bcaf130edcd364dc45fa44502e24b18c5fa (patch) | |
tree | 62a6a1cc978cce56bfcc9a5e6899e4fd6e79ebc5 /client | |
parent | 1f568435f5111da3eb19d6be2e9be7d89c1d60dc (diff) |
Report byte offset on parse error
Diffstat (limited to 'client')
-rw-r--r-- | client/go/internal/vespa/feed/document.go | 8 | ||||
-rw-r--r-- | client/go/internal/vespa/feed/document_test.go | 21 |
2 files changed, 29 insertions, 0 deletions
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()) + } } |