diff --git a/.gitignore b/.gitignore index c36c9107c..5b4cf75cd 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,10 @@ # Maven build targets target/ +# NPM dependencies and build output +node_modules/ +dist/ + # Maven release files *.releaseBackup release.properties diff --git a/api/src/main/java/com/github/streamshub/console/api/support/serdes/MultiformatDeserializer.java b/api/src/main/java/com/github/streamshub/console/api/support/serdes/MultiformatDeserializer.java index 8761fadd8..ba9afc8e9 100644 --- a/api/src/main/java/com/github/streamshub/console/api/support/serdes/MultiformatDeserializer.java +++ b/api/src/main/java/com/github/streamshub/console/api/support/serdes/MultiformatDeserializer.java @@ -196,13 +196,13 @@ public RecordData deserialize(String topic, Headers headers, byte[] data) { } } + var idHandler = baseSerde.getIdHandler(); ByteBuffer buffer; SchemaLookupResult schema; int length; - if (data.length > 0 && data[0] == BaseSerde.MAGIC_BYTE) { + if (data.length > 0 && data[0] == BaseSerde.MAGIC_BYTE && idHandler != null) { buffer = BaseSerde.getByteBuffer(data); - var idHandler = baseSerde.getIdHandler(); artifactReference = idHandler.readId(buffer); schema = resolve(artifactReference); length = buffer.limit() - idHandler.idSize() - 1; diff --git a/api/src/test/java/com/github/streamshub/console/api/RecordsResourceIT.java b/api/src/test/java/com/github/streamshub/console/api/RecordsResourceIT.java index 048a4b7f8..ebfb7d00c 100644 --- a/api/src/test/java/com/github/streamshub/console/api/RecordsResourceIT.java +++ b/api/src/test/java/com/github/streamshub/console/api/RecordsResourceIT.java @@ -91,6 +91,7 @@ class RecordsResourceIT { RecordHelper recordUtils; String clusterId1; String clusterId3; + String clusterIdY = "test-kafkaY"; @BeforeEach void setup() { @@ -473,6 +474,24 @@ void testConsumeRecordWithOffsetBeforeBeginning() { .body("data[0].attributes.value", is(equalTo("fourth"))); } + @Test + void testConsumeRecordMagicByteWithoutRegistry() { + final String topicName = UUID.randomUUID().toString(); + var topicIds = topicUtils.createTopics(List.of(topicName), 1); + recordUtils.produceRecord(topicName, null, null, null, "\u0000rest of value"); + + await().atMost(5, TimeUnit.SECONDS) + .until(() -> topicUtils.getTopicSize(topicName) == 1); + + whenRequesting(req -> req + .get("", clusterIdY, topicIds.get(topicName))) + .assertThat() + .statusCode(is(Status.OK.getStatusCode())) + .body("data", hasSize(1)) + .body("data[0].attributes.offset", is(equalTo(0))) + .body("data[0].attributes.value", is(equalTo("\u0000rest of value"))); + } + @Test void testConsumeRecordFromTimestampAcrossPartitions() { final String topicName = UUID.randomUUID().toString();