Skip to content

Commit 32adfe9

Browse files
authored
Fix NPE in CloudEventDeserializer when deserializing header with null value (#415)
Signed-off-by: Dmitrii Bocharov <[email protected]>
1 parent 0277ee4 commit 32adfe9

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

core/src/main/java/io/cloudevents/core/message/impl/BaseGenericBinaryMessageReaderImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ public <T extends CloudEventWriter<V>, V> V read(CloudEventWriterFactory<T, V> w
5656
// This implementation avoids to use visitAttributes and visitExtensions
5757
// in order to complete the visit in one loop
5858
this.forEachHeader((key, value) -> {
59+
if (value == null) {
60+
return;
61+
}
5962
if (isContentTypeHeader(key)) {
6063
visitor.withContextAttribute(CloudEventV1.DATACONTENTTYPE, toCloudEventsValue(value));
6164
} else if (isCloudEventsHeader(key)) {

kafka/src/test/java/io/cloudevents/kafka/CloudEventDeserializerTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.cloudevents.core.test.Data;
2424
import io.cloudevents.rw.CloudEventDataMapper;
2525
import org.apache.kafka.clients.producer.ProducerRecord;
26+
import org.apache.kafka.common.header.Headers;
2627
import org.junit.jupiter.api.Test;
2728

2829
import java.util.HashMap;
@@ -60,6 +61,26 @@ public void deserializerWithMapper() {
6061
);
6162
}
6263

64+
@Test
65+
public void deserializerShouldWorkWithNullableManuallyDefinedHeaders() {
66+
String topic = "test";
67+
CloudEvent testCloudEvent = Data.V1_MIN;
68+
CloudEventDeserializer cloudEventDeserializer = new CloudEventDeserializer();
69+
70+
// Serialize the event first
71+
ProducerRecord<Void, byte[]> inRecord = KafkaMessageFactory
72+
.createWriter(topic)
73+
.writeBinary(testCloudEvent);
74+
75+
// add optional subject header with null value
76+
Headers headers = inRecord.headers();
77+
headers.add("ce_subject", null);
78+
CloudEvent outEvent = cloudEventDeserializer.deserialize(topic, headers, inRecord.value());
79+
80+
assertThat(outEvent)
81+
.isEqualTo(testCloudEvent);
82+
}
83+
6384
private void testDeserialize(CloudEventDeserializer deserializer, CloudEvent input, CloudEvent expected) {
6485
String topic = "test";
6586

0 commit comments

Comments
 (0)