This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/main by this push:
new b7dcde7c913 SOLR-17787 CBOR should use content-type: application/cbor
b7dcde7c913 is described below
commit b7dcde7c9132cc5548a46eed3898cd6b6233b2d1
Author: Sanjay Kumar Yadav <[email protected]>
AuthorDate: Thu Dec 4 08:25:22 2025 +0530
SOLR-17787 CBOR should use content-type: application/cbor
CborResponseWriter should use content-type: application/cbor
---
...er-should-use-content-type-application.yaml.yml | 7 ++++
.../apache/solr/response/CborResponseWriter.java | 4 +-
.../solr/response/TestRawResponseWriter.java | 45 +++++++++++++++++++++-
3 files changed, 52 insertions(+), 4 deletions(-)
diff --git
a/changelog/unreleased/SOLR-17787-CborResponseWriter-should-use-content-type-application.yaml.yml
b/changelog/unreleased/SOLR-17787-CborResponseWriter-should-use-content-type-application.yaml.yml
new file mode 100644
index 00000000000..cb73b4d104f
--- /dev/null
+++
b/changelog/unreleased/SOLR-17787-CborResponseWriter-should-use-content-type-application.yaml.yml
@@ -0,0 +1,7 @@
+title: CborResponseWriter should use content-typ- application/cbor
+type: other
+authors:
+- name: Sanjay Kumar Yadav
+links:
+- name: SOLR-17787
+ url: https://issues.apache.org/jira/browse/SOLR-17787
diff --git
a/solr/core/src/java/org/apache/solr/response/CborResponseWriter.java
b/solr/core/src/java/org/apache/solr/response/CborResponseWriter.java
index 8aa473e03ee..3821c647dc9 100644
--- a/solr/core/src/java/org/apache/solr/response/CborResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/CborResponseWriter.java
@@ -22,7 +22,6 @@ import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.BigInteger;
-import org.apache.solr.client.solrj.response.JavaBinResponseParser;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.request.SolrQueryRequest;
@@ -31,6 +30,7 @@ import org.apache.solr.request.SolrQueryRequest;
* jackson library to write the stream out
*/
public class CborResponseWriter implements QueryResponseWriter {
+ public static final String APPLICATION_CBOR_VALUE = "application/cbor";
final CBORFactory cborFactory;
final CBORFactory cborFactoryCompact;
@@ -52,7 +52,7 @@ public class CborResponseWriter implements
QueryResponseWriter {
@Override
public String getContentType(SolrQueryRequest request, SolrQueryResponse
response) {
- return JavaBinResponseParser.JAVABIN_CONTENT_TYPE;
+ return APPLICATION_CBOR_VALUE;
}
static class WriterImpl extends JSONWriter {
diff --git
a/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
b/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
index 901223a362b..7b822b18848 100644
--- a/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
+++ b/solr/core/src/test/org/apache/solr/response/TestRawResponseWriter.java
@@ -16,16 +16,24 @@
*/
package org.apache.solr.response;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.dataformat.cbor.CBORFactory;
+import com.fasterxml.jackson.dataformat.cbor.CBORGenerator;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.util.concurrent.atomic.LongAdder;
import org.apache.lucene.tests.util.TestUtil;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.response.JavaBinResponseParser;
import org.apache.solr.common.util.ContentStreamBase.ByteArrayStream;
import org.apache.solr.common.util.ContentStreamBase.StringStream;
import org.apache.solr.common.util.NamedList;
+import org.apache.solr.handler.loader.CborLoader;
import org.junit.AfterClass;
import org.junit.BeforeClass;
@@ -35,6 +43,7 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
private static RawResponseWriter writerXmlBase;
private static RawResponseWriter writerJsonBase;
private static RawResponseWriter writerBinBase;
+ private static RawResponseWriter writerCborBase;
private static RawResponseWriter writerNoBase;
private static RawResponseWriter[] allWriters;
@@ -51,9 +60,12 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
writerXmlBase = newRawResponseWriter("xml");
writerJsonBase = newRawResponseWriter("json");
writerBinBase = newRawResponseWriter("javabin");
+ writerCborBase = newRawResponseWriter("cbor");
allWriters =
- new RawResponseWriter[] {writerXmlBase, writerJsonBase, writerBinBase,
writerNoBase};
+ new RawResponseWriter[] {
+ writerXmlBase, writerJsonBase, writerBinBase, writerCborBase,
writerNoBase
+ };
}
@AfterClass
@@ -62,7 +74,7 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
writerJsonBase = null;
writerBinBase = null;
writerNoBase = null;
-
+ writerCborBase = null;
allWriters = null;
}
@@ -125,6 +137,8 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
assertEquals("application/xml; charset=UTF-8",
writerXmlBase.getContentType(req(), rsp));
assertEquals("application/json; charset=UTF-8",
writerJsonBase.getContentType(req(), rsp));
assertEquals("application/octet-stream",
writerBinBase.getContentType(req(), rsp));
+ assertEquals(
+ CborResponseWriter.APPLICATION_CBOR_VALUE,
writerCborBase.getContentType(req(), rsp));
// check response against each writer
@@ -162,6 +176,33 @@ public class TestRawResponseWriter extends SolrTestCaseJ4 {
assertEquals("test", out.getVal(0));
assertEquals("foo", out.getName(1));
assertEquals("bar", out.getVal(1));
+
+ // cbor
+
+ byte[] cborBytes =
convertJsonToCborFormat(json.getBytes(StandardCharsets.UTF_8));
+ assertEquals(25, cborBytes.length);
+ LongAdder numberOfObjectsInResponse = new LongAdder();
+ new CborLoader(null, (document) -> numberOfObjectsInResponse.increment())
+ .stream(new ByteArrayInputStream(cborBytes));
+ assertEquals(1, numberOfObjectsInResponse.intValue());
+ }
+
+ private byte[] convertJsonToCborFormat(byte[] inputJson) throws IOException {
+ ByteArrayOutputStream baos;
+ ObjectMapper jsonMapper = new ObjectMapper(new JsonFactory());
+
+ // Read JSON file as a JsonNode
+ JsonNode jsonNode = jsonMapper.readTree(inputJson);
+ // Create a CBOR ObjectMapper
+ baos = new ByteArrayOutputStream();
+
+ ObjectMapper cborMapper =
+ new
ObjectMapper(CBORFactory.builder().enable(CBORGenerator.Feature.STRINGREF).build());
+ JsonGenerator jsonGenerator = cborMapper.createGenerator(baos);
+
+ jsonGenerator.writeTree(jsonNode);
+ jsonGenerator.close();
+ return baos.toByteArray();
}
/**