[ 
https://issues.apache.org/jira/browse/CAMEL-25360?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

shashank reassigned CAMEL-25360:
--------------------------------

    Assignee: shashank

> camel-cloudevents - application-cloudevents+json ignores the datacontenttype 
> when it writes the data: JSON of a text/plain body is nested, JSON scalars 
> are strings, bytes that are not valid text are lost
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25360
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25360
>             Project: Camel
>          Issue Type: Bug
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Minor
>
> The {{application-cloudevents+json}} data type 
> ({{CloudEventJsonDataTypeTransformer}}) decides how to write the body as the 
> {{data}} of the event from the body alone: a body that is a JSON object or 
> array is nested, anything else is a JSON string. The CloudEvents JSON format 
> (section 3.1) decides by the {{datacontenttype}}: data whose content type is 
> JSON ({{*/json}}, {{*/*+json}}, and {{application/json}} when it is absent) 
> is a JSON value, other data is a string, and binary data is written Base64 
> encoded as {{data_base64}}. So:
> * a {{text/plain}} (or {{application/octet-stream}}) body {{[1,2]}} is 
> written as {{"data":[1,2]}} instead of {{"data":"[1,2]"}}. CloudEvents 
> readers reject such an event: the CloudEvents Java SDK 
> ({{CloudEventDeserializer}}) fails with "Because content type is not a json, 
> only a string is accepted as data";
> * under {{application/json}} (also the default), a body {{42}}, {{true}}, 
> {{null}} or {{"text"}} is written as a string ({{"data":"42"}}, 
> {{"data":"\"text\""}}), not as the JSON value;
> * a {{byte[]}} body that is not valid text is decoded as text into {{data}}, 
> which replaces every invalid byte, so the data is lost.
> In the review of #27342 Claus Ibsen listed these three as an optional 
> follow-up; they predate CAMEL-25301.
> h3. Reproduction
> {{CloudEventJsonDataTypeTransformerTest}} (new tests), failing on main: 
> {{shouldNotNestJsonDataOfANonJsonContentType}} ({{expected: <[1,2]> but was: 
> <[1, 2]>}}, a JSON array), {{shouldUseTheDataContentTypeOfTheEvent}} (the 
> {{CamelCloudEventDataContentType}} header {{text/plain}}), 
> {{shouldNestJsonScalarsOfAJsonContentType}} ({{expected: BigDecimal<42> but 
> was: String<42>}}), {{shouldWriteBinaryDataAsBase64}} and 
> {{shouldWriteBytesThatAreNotValidTextAsBase64WhateverTheContentType}} (no 
> {{data_base64}}), 
> {{shouldWriteBytesThatAreValidTextAsStringWhenTheContentTypeIsBinary}} (a 
> JSON {{byte[]}} body declared {{application/octet-stream}} is nested).
> h3. Proposed fix
> Decide by the {{datacontenttype}} of the event 
> ({{CamelCloudEventDataContentType}}, else {{Content-Type}}, else 
> {{application/json}}):
> * JSON media type (subtype {{json}} or suffix {{+json}}, parameters and case 
> ignored): a body that is a JSON value, now including a scalar, is nested; any 
> other body is a string (as the scan from CAMEL-25301 already does for 
> malformed JSON). Without a content type this is the default, so the default 
> behaviour stays: JSON objects and arrays nested, other text as a string; only 
> scalar bodies change.
> * any other content type: the body is a string, also a JSON object or array.
> * a {{byte[]}} body that is not valid text in the charset of the exchange 
> (UTF-8 by default), whatever the content type: {{data_base64}}. A {{byte[]}} 
> body that is valid text is written as text as before; valid UTF-8 written as 
> a JSON string gives a reader the same bytes back. Other bodies (an 
> {{InputStream}}, a stream cache) are read as text as before.
> Controls: a JSON {{byte[]}} body under {{application/json}} is nested and a 
> {{text/plain}} {{byte[]}} body is text, as before; malformed JSON under 
> {{application/json}} stays a string; {{application/vnd.example+json; 
> charset=UTF-8}} and {{Application/JSON}} are JSON; {{byte[]}} bodies are 
> decoded in the charset of the exchange. Module: 24 tests pass.
> Impact on component data types (upgrade guide): several CloudEvent data types 
> declare a fixed content type that is not JSON, whatever the body is: 
> {{aws2-s3}}, {{aws2-kinesis}}, {{google-pubsub}}, {{azure-eventhubs}}, 
> {{azure-storage-blob}} and others declare {{application/octet-stream}} (since 
> CAMEL-20334 for aws2-s3), {{aws-cloudtrail}}, {{azure-storage-queue}} and 
> {{azure-cosmosdb}} declare {{text/plain}}. Followed by 
> {{application-cloudevents+json}}, a JSON body of such a message (a CloudTrail 
> event always is one) is now a JSON string instead of nested. This narrows the 
> nesting of CAMEL-22339 to JSON content types. The upgrade guide says how to 
> keep a JSON body nested (set {{CamelCloudEventDataContentType}} to 
> {{application/json}}). No Kamelet in camel-kamelets uses 
> {{application-cloudevents+json}} (GitHub code search, 2026-10-05); a Pipe to 
> Knative such as the one in CAMEL-20334 uses the binary mode 
> ({{http:application-cloudevents}}), which this does not change.
> Affected: 4.14.x, 4.18.x and main.
> Duplicate check (2026-10-05): JIRA "CloudEventJsonDataTypeTransformer" 
> (CAMEL-25301 only), "datacontenttype" (CAMEL-25301, CAMEL-20334), 
> "data_base64" (none). GitHub pull requests "datacontenttype": only #27342; no 
> open PR on camel-cloudevents.
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to