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)

Reply via email to