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();
   }
 
   /**

Reply via email to