diff --git a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java index bcf143e603..ea69889e89 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/ReaderBasedJsonParser.java @@ -221,9 +221,6 @@ protected boolean _loadMore() throws IOException if (_reader != null) { int count = _reader.read(_inputBuffer, 0, _inputBuffer.length); if (count > 0) { - _inputPtr = 0; - _inputEnd = count; - _currInputProcessed += bufSize; _currInputRowStart -= bufSize; @@ -232,6 +229,9 @@ protected boolean _loadMore() throws IOException // in negative value, which is fine as combine value remains unchanged. _nameStartOffset -= bufSize; + _inputPtr = 0; + _inputEnd = count; + return true; } // End of input diff --git a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java index c39ad50b50..d39d725c29 100644 --- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java +++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java @@ -193,9 +193,6 @@ protected final boolean _loadMore() throws IOException int count = _inputStream.read(_inputBuffer, 0, space); if (count > 0) { - _inputPtr = 0; - _inputEnd = count; - _currInputProcessed += _inputEnd; _currInputRowStart -= _inputEnd; @@ -204,6 +201,9 @@ protected final boolean _loadMore() throws IOException // in negative value, which is fine as combine value remains unchanged. _nameStartOffset -= bufSize; + _inputPtr = 0; + _inputEnd = count; + return true; } // End of input diff --git a/src/test/java/com/fasterxml/jackson/core/read/LocationOffsetsTest.java b/src/test/java/com/fasterxml/jackson/core/read/LocationOffsetsTest.java index 057f8c1601..cb30781da9 100644 --- a/src/test/java/com/fasterxml/jackson/core/read/LocationOffsetsTest.java +++ b/src/test/java/com/fasterxml/jackson/core/read/LocationOffsetsTest.java @@ -3,6 +3,9 @@ import com.fasterxml.jackson.core.*; import com.fasterxml.jackson.core.json.JsonFactory; +import java.io.IOException; +import java.util.Random; + public class LocationOffsetsTest extends com.fasterxml.jackson.core.BaseTest { final JsonFactory JSON_F = new JsonFactory(); @@ -143,7 +146,7 @@ private void _testWithLazyStringRead(int readMode) throws Exception assertEquals(8, p.getCurrentLocation().getColumnNr()); p.close(); } - + // for [core#533] public void testUtf8Bom() throws Exception { @@ -232,4 +235,72 @@ private byte[] withUtf8Bom(byte[] bytes) { System.arraycopy(bytes, 0, arr, 3, bytes.length); return arr; } + + public void testBigPayload() throws IOException { + JsonLocation loc; + JsonParser p; + + String doc = "{\"key\":\"" + generateRandomAlpha(50000) + "\"}"; + + p = createParserUsingStream(JSON_F, doc, "UTF-8"); + + assertToken(JsonToken.START_OBJECT, p.nextToken()); + loc = p.getTokenLocation(); + assertEquals(0, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(1, loc.getColumnNr()); + loc = p.getCurrentLocation(); + assertEquals(1, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(2, loc.getColumnNr()); + + assertToken(JsonToken.FIELD_NAME, p.nextToken()); + loc = p.getTokenLocation(); + assertEquals(1, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(2, loc.getColumnNr()); + loc = p.getCurrentLocation(); + assertEquals(8, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(9, loc.getColumnNr()); + + assertToken(JsonToken.VALUE_STRING, p.nextToken()); + loc = p.getTokenLocation(); + assertEquals(7, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(8, loc.getColumnNr()); + loc = p.getCurrentLocation(); + assertEquals(8, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(9, loc.getColumnNr()); + + p.getTextCharacters(); + loc = p.getTokenLocation(); + assertEquals(7, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(8, loc.getColumnNr()); + loc = p.getCurrentLocation(); + assertEquals(doc.length() - 1, loc.getByteOffset()); + assertEquals(-1L, loc.getCharOffset()); + assertEquals(1, loc.getLineNr()); + assertEquals(doc.length(), loc.getColumnNr()); + } + + private String generateRandomAlpha(int length) { + StringBuilder sb = new StringBuilder(length); + Random rnd = new Random(length); + for (int i = 0; i < length; ++i) { + // let's limit it not to include surrogate pairs: + char ch = (char) ('A' + rnd.nextInt(26)); + sb.append(ch); + } + return sb.toString(); + } }