Claus Ibsen created CAMEL-26023:
-----------------------------------
Summary: camel-slack - the webhook mode writes camelCase JSON keys
and changes the message body
Key: CAMEL-26023
URL: https://issues.apache.org/jira/browse/CAMEL-26023
Project: Camel
Issue Type: Bug
Components: camel-slack
Affects Versions: 4.18.0, 4.22.0, 4.23.0
Reporter: Claus Ibsen
Fix For: 4.24.0
Found while checking the body types of the slack component for the catalog
(CAMEL-24961).
h4. 1. The webhook mode writes camelCase JSON keys that Slack ignores
In webhook mode the producer turns the message into JSON with a plain {{new
Gson()}} ({{SlackProducer}}, main 07d2e7a987bc, line 38), which writes the Java
field names. Slack expects snake_case keys, so it ignores:
* {{iconEmoji}} and {{iconUrl}} of the endpoint (Slack reads {{icon_emoji}} and
{{icon_url}});
* for a {{com.slack.api.model.Message}} body, keys such as {{threadTs}},
{{unfurlLinks}} and {{unfurlMedia}}, and in blocks {{imageUrl}} and {{altText}};
* for a {{SlackMessage}} body, the camelCase keys of its attachments, such as
{{authorName}}, {{titleLink}} and {{imageUrl}}.
Before CAMEL-16255 (Camel 3.9), the producer wrote these keys in snake_case,
with the names in {{SlackConstants}}.
Checked on 4.24.0-SNAPSHOT with {{camel run}} and a fake webhook: the text
"Hello text" with {{username=CamelBot&iconEmoji=:camel:}} was posted as
{{{"text":"Hello
text","channel":"#general","username":"CamelBot","iconEmoji":":camel:"}}}.
*Proposed change*: write the JSON with the snake_case Gson of the Slack SDK
({{GsonFactory.createSnakeCase()}}), as the token mode effectively does through
the SDK.
h4. 2. The webhook mode changes the message body
In webhook mode the producer sets the channel and the username of the endpoint,
and for a {{SlackMessage}} also its icons, on the message body itself
({{SlackProducer}}, main 07d2e7a987bc, lines 151-163). So the caller's object
is changed by the send.
Checked on 4.24.0-SNAPSHOT with {{camel run}}: after the send, the
{{com.slack.api.model.Message}} body had {{channel=#general}} and
{{username=CamelBot}}, which it did not have before.
*Proposed change*: copy the message before it is changed, or set the values on
the JSON only.
h4. Also read in the code, not run
* The token mode sends only the text of a {{SlackMessage}} body, not its
attachments ({{SlackProducer}}, lines 101-108); the webhook mode sends them.
* The webhook mode catches only IOException and calls {{callback.done(true)}}
in a finally block (lines 141-146), so a RuntimeException from {{slack.send}},
such as for an invalid webhookUrl, completes the exchange and is thrown as well.
* {{SlackCloudEventDataTypeTransformer}} sets the source to "slack." plus a
boolean and the subject to {{true}} (lines 49 and 54), and fails with a
NullPointerException for no body (line 47).
_Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)