diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java index ac5e17a6d..47ad97e04 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/cloudevent/CloudEventMessageUtils.java @@ -231,15 +231,16 @@ public final class CloudEventMessageUtils { inputMessage = canonicalizeHeadersWithPossibleCopy(inputMessage); Map headers = new HashMap<>(inputMessage.getHeaders()); - if (isCloudEvent(inputMessage) && headers.containsKey("content-type")) { + boolean isCloudEvent = isCloudEvent(inputMessage); + if (isCloudEvent && headers.containsKey("content-type")) { inputMessage = MessageBuilder.fromMessage(inputMessage).setHeader(MessageHeaders.CONTENT_TYPE, headers.get("content-type")).build(); } - + MimeType contentType = contentTypeResolver.resolve(inputMessage.getHeaders()); String inputContentType = (String) inputMessage.getHeaders().get(DATACONTENTTYPE); // first check the obvious and see if content-type is `cloudevents` - if (!isCloudEvent(inputMessage) && headers.containsKey(MessageHeaders.CONTENT_TYPE)) { + if (!isCloudEvent && contentType != null) { // structured-mode - MimeType contentType = contentTypeResolver.resolve(inputMessage.getHeaders()); + if (contentType.getType().equals(APPLICATION_CLOUDEVENTS.getType()) && contentType .getSubtype().startsWith(APPLICATION_CLOUDEVENTS.getSubtype())) { @@ -254,7 +255,6 @@ public final class CloudEventMessageUtils { .setHeader(DATACONTENTTYPE, dataContentType).build(); Map structuredCloudEvent = (Map) messageConverter .fromMessage(cloudEventMessage, Map.class); - canonicalizeHeaders(structuredCloudEvent, true); return buildBinaryMessageFromStructuredMap(structuredCloudEvent, inputMessage.getHeaders()); diff --git a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/cloudevent/CloudEventFunctionTests.java b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/cloudevent/CloudEventFunctionTests.java index 388b0f057..0ad602b4e 100644 --- a/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/cloudevent/CloudEventFunctionTests.java +++ b/spring-cloud-function-context/src/test/java/org/springframework/cloud/function/cloudevent/CloudEventFunctionTests.java @@ -391,6 +391,7 @@ public class CloudEventFunctionTests { Function, Message> springReleaseAsMessage() { return message -> { SpringReleaseEvent updated = springRelease().apply(message.getPayload()); + assertThat(message.getHeaders().get("ce-type")).isEqualTo("org.springframework"); return CloudEventMessageBuilder.withData(updated) .copyHeaders(message.getHeaders()) .setSource("https://spring.release.event")