Fix base64/binary access
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 0da1653..b810a21 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/UTF8StreamJsonParser.java
@@ -479,7 +479,7 @@
}
return 0;
}
-
+
@Override
public byte[] getBinaryValue(Base64Variant b64variant) throws IOException
{
@@ -3566,7 +3566,6 @@
{
ByteArrayBuilder builder = _getByteArrayBuilder();
- //main_loop:
while (true) {
// first, we'll skip preceding white space, if any
int ch;
diff --git a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java
index b718b09..29626b3 100644
--- a/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java
+++ b/src/main/java/com/fasterxml/jackson/core/json/async/NonBlockingJsonParserBase.java
@@ -7,6 +7,7 @@
import com.fasterxml.jackson.core.io.IOContext;
import com.fasterxml.jackson.core.json.JsonReadContext;
import com.fasterxml.jackson.core.sym.ByteQuadsCanonicalizer;
+import com.fasterxml.jackson.core.util.ByteArrayBuilder;
import static com.fasterxml.jackson.core.JsonTokenId.*;
@@ -437,13 +438,28 @@
@Override
public byte[] getBinaryValue(Base64Variant b64variant) throws IOException
{
- if (_currToken != JsonToken.VALUE_EMBEDDED_OBJECT ) {
- _reportError("Current token (%s) not VALUE_EMBEDDED_OBJECT, can not access as binary", _currToken);
+ if (_currToken != JsonToken.VALUE_STRING) {
+ _reportError("Current token (%s) not VALUE_STRING or VALUE_EMBEDDED_OBJECT, can not access as binary",
+ _currToken);
+ }
+ if (_binaryValue == null) {
+ @SuppressWarnings("resource")
+ ByteArrayBuilder builder = _getByteArrayBuilder();
+ _decodeBase64(getText(), builder, b64variant);
+ _binaryValue = builder.toByteArray();
}
return _binaryValue;
}
@Override
+ public int readBinaryValue(Base64Variant b64variant, OutputStream out) throws IOException
+ {
+ byte[] b = getBinaryValue(b64variant);
+ out.write(b);
+ return b.length;
+ }
+
+ @Override
public Object getEmbeddedObject() throws IOException
{
if (_currToken == JsonToken.VALUE_EMBEDDED_OBJECT ) {
@@ -452,16 +468,6 @@
return null;
}
- @Override
- public int readBinaryValue(Base64Variant b64variant, OutputStream out)
- throws IOException {
- if (_currToken != JsonToken.VALUE_EMBEDDED_OBJECT ) {
- _reportError("Current token (%s) not VALUE_EMBEDDED_OBJECT, can not access as binary", _currToken);
- }
- out.write(_binaryValue);
- return _binaryValue.length;
- }
-
/*
/**********************************************************************
/* Handling of nested scope, state
diff --git a/src/test/java/com/fasterxml/jackson/failing/async/AsyncBinaryParseTest.java b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncBinaryParseTest.java
similarity index 92%
rename from src/test/java/com/fasterxml/jackson/failing/async/AsyncBinaryParseTest.java
rename to src/test/java/com/fasterxml/jackson/core/json/async/AsyncBinaryParseTest.java
index e84a2e3..4ce01d2 100644
--- a/src/test/java/com/fasterxml/jackson/failing/async/AsyncBinaryParseTest.java
+++ b/src/test/java/com/fasterxml/jackson/core/json/async/AsyncBinaryParseTest.java
@@ -1,4 +1,4 @@
-package com.fasterxml.jackson.failing.async;
+package com.fasterxml.jackson.core.json.async;
import java.io.*;
@@ -72,8 +72,9 @@
// and verify
AsyncReaderWrapper p = asyncForBytes(f, readSize, smile, offset);
-
- assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+
+ // JSON has no native binary type so
+ assertToken(JsonToken.VALUE_STRING, p.nextToken());
byte[] result = p.getBinaryValue();
assertArrayEquals(binary, result);
assertNull(p.nextToken());
@@ -81,7 +82,7 @@
// and second time around, skipping
p = asyncForBytes(f, readSize, smile, offset);
- assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ assertToken(JsonToken.VALUE_STRING, p.nextToken());
assertNull(p.nextToken());
p.close();
}
@@ -103,7 +104,7 @@
// and verify
AsyncReaderWrapper p = asyncForBytes(f, readSize, smile, offset);
assertToken(JsonToken.START_ARRAY, p.nextToken());
- assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ assertToken(JsonToken.VALUE_STRING, p.nextToken());
byte[] result = p.getBinaryValue();
@@ -117,7 +118,7 @@
// and second time around, skipping
p = asyncForBytes(f, readSize, smile, offset);
assertToken(JsonToken.START_ARRAY, p.nextToken());
- assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ assertToken(JsonToken.VALUE_STRING, p.nextToken());
assertToken(JsonToken.VALUE_NUMBER_INT, p.nextToken());
assertToken(JsonToken.END_ARRAY, p.nextToken());
assertNull(p.nextToken());
@@ -143,7 +144,7 @@
assertToken(JsonToken.FIELD_NAME, p.nextToken());
assertEquals("binary", p.currentName());
- assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ assertToken(JsonToken.VALUE_STRING, p.nextToken());
byte[] result = p.getBinaryValue();
assertArrayEquals(data, result);
@@ -160,7 +161,7 @@
p = asyncForBytes(f, readSize, smile, offset);
assertToken(JsonToken.START_OBJECT, p.nextToken());
assertToken(JsonToken.FIELD_NAME, p.nextToken());
- assertToken(JsonToken.VALUE_EMBEDDED_OBJECT, p.nextToken());
+ assertToken(JsonToken.VALUE_STRING, p.nextToken());
assertToken(JsonToken.END_OBJECT, p.nextToken());
assertNull(p.nextToken());
p.close();