diff --git a/libs/x-content/impl/src/main/java/org/elasticsearch/xcontent/provider/json/JsonXContentParser.java b/libs/x-content/impl/src/main/java/org/elasticsearch/xcontent/provider/json/JsonXContentParser.java index 9530627157683..ecf83756c8c8f 100644 --- a/libs/x-content/impl/src/main/java/org/elasticsearch/xcontent/provider/json/JsonXContentParser.java +++ b/libs/x-content/impl/src/main/java/org/elasticsearch/xcontent/provider/json/JsonXContentParser.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.core.exc.InputCoercionException; import com.fasterxml.jackson.core.exc.StreamConstraintsException; +import com.fasterxml.jackson.core.filter.FilteringParserDelegate; import com.fasterxml.jackson.core.io.JsonEOFException; import org.elasticsearch.core.IOUtils; @@ -146,6 +147,10 @@ public XContentString optimizedText() throws IOException { if (currentToken().isValue() == false) { throwOnNoText(); } + var parser = this.parser; + if (parser instanceof FilteringParserDelegate delegate) { + parser = delegate.delegate(); + } if (parser instanceof ESUTF8StreamJsonParser esParser) { var bytesRef = esParser.getValueAsText(); if (bytesRef != null) { diff --git a/server/src/test/java/org/elasticsearch/common/xcontent/json/JsonXContentTests.java b/server/src/test/java/org/elasticsearch/common/xcontent/json/JsonXContentTests.java index 4135ead545e07..87c98a99e2579 100644 --- a/server/src/test/java/org/elasticsearch/common/xcontent/json/JsonXContentTests.java +++ b/server/src/test/java/org/elasticsearch/common/xcontent/json/JsonXContentTests.java @@ -9,7 +9,10 @@ package org.elasticsearch.common.xcontent.json; +import org.elasticsearch.common.bytes.BytesReference; import org.elasticsearch.common.xcontent.BaseXContentTestCase; +import org.elasticsearch.xcontent.Text; +import org.elasticsearch.xcontent.XContentBuilder; import org.elasticsearch.xcontent.XContentGenerator; import org.elasticsearch.xcontent.XContentParseException; import org.elasticsearch.xcontent.XContentParser; @@ -18,6 +21,9 @@ import org.elasticsearch.xcontent.json.JsonXContent; import java.io.ByteArrayOutputStream; +import java.util.Set; + +import static org.hamcrest.Matchers.equalTo; public class JsonXContentTests extends BaseXContentTestCase { @@ -41,4 +47,20 @@ public void testMalformedJsonFieldThrowsXContentException() throws Exception { assertThrows(XContentParseException.class, () -> parser.text()); } } + + public void testOptimizedTextHasBytes() throws Exception { + XContentBuilder builder = builder().startObject().field("text", new Text("foo")).endObject(); + XContentParserConfiguration parserConfig = parserConfig(); + if (randomBoolean()) { + parserConfig = parserConfig.withFiltering(null, Set.of("*"), null, true); + } + try (XContentParser parser = createParser(parserConfig, xcontentType().xContent(), BytesReference.bytes(builder))) { + assertSame(XContentParser.Token.START_OBJECT, parser.nextToken()); + assertSame(XContentParser.Token.FIELD_NAME, parser.nextToken()); + assertTrue(parser.nextToken().isValue()); + Text text = (Text) parser.optimizedText(); + assertTrue(text.hasBytes()); + assertThat(text.string(), equalTo("foo")); + } + } }