[
https://issues.apache.org/jira/browse/CAMEL-26014?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen reassigned CAMEL-26014:
-----------------------------------
Assignee: Claus Ibsen
> camel-smpp - the body of the producer: a stream is sent empty, the 8-bit
> options, InOut and unknown commands
> ------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-26014
> URL: https://issues.apache.org/jira/browse/CAMEL-26014
> Project: Camel
> Issue Type: Bug
> Components: camel-smpp
> Affects Versions: 4.18.0, 4.22.0, 4.23.0
> Reporter: Claus Ibsen
> Assignee: Claus Ibsen
> Priority: Major
> Fix For: 4.24.0
>
>
> Found while checking the body types of the smpp component for the catalog
> (CAMEL-24961).
> h4. 1. A stream body is sent as an empty short message, and no body fails
> with a NullPointerException
> For SubmitSm (the default), SubmitMulti and ReplaceSm, the smpp producer
> converts the body to a String more than once: in {{determineAlphabet}} and
> again in {{getShortMessage}} ({{SmppSmCommand}}, main 56aa5f4970a6, lines 92,
> 113 and 165). The first conversion reads a stream body to its end, and the
> stream is not reset in between, so the short message is empty. A body that is
> null fails with a NullPointerException at line 114 ({{Cannot invoke
> "String.getBytes(java.nio.charset.Charset)" because "body" is null}}), rather
> than with an error that says the body is missing.
> Checked on 4.24.0-SNAPSHOT with {{camel run}} against the jSMPP
> SMPPServerSimulator that the camel-smpp integration tests use:
> * a body that is a ByteArrayInputStream of "Hello stream": the delivery
> receipt has an empty text;
> * the same text as a java.io.File: the receipt has "Hello file";
> * no body: the NullPointerException above.
> *Proposed change*: convert the body once, and fail with an
> InvalidPayloadException when there is none.
> h4. 2. The 8-bit dataCoding and alphabet options do not send a byte array as
> it is, as the headers do
> The smpp producer sends a byte array body as it is only when the
> {{CamelSmppDataCoding}} header, or else the {{CamelSmppAlphabet}} header, is
> an 8-bit value ({{SmppSmCommand.has8bitDataCoding}}, main 56aa5f4970a6, lines
> 118-126). The endpoint options {{dataCoding}} and {{alphabet}} with the same
> value do not do this: the body is converted to a String in the charset of the
> exchange and encoded with the {{encoding}} option, so bytes that are not text
> become {{?}}, while the data_coding of the PDU says 8-bit.
> Checked on 4.24.0-SNAPSHOT with {{camel run}} against the jSMPP simulator,
> with a body of the bytes {{41 42 E9 FF}}:
> * with the header {{CamelSmppDataCoding=4}}: the simulator receives the four
> bytes as they are;
> * with the endpoint options {{dataCoding=4&alphabet=4}}: it receives {{AB??}}.
> *Proposed change*: take the endpoint options into account when deciding to
> send the bytes as they are, after the headers.
> h4. 3. After an InOut send the message has no body and loses its headers
> All six commands of the smpp producer put their result headers on
> {{ExchangeHelper.getResultMessage(exchange)}} (for example
> {{SmppSubmitSmCommand}}, main 56aa5f4970a6, line 97). When the exchange is
> InOut, that is a new, empty message, so after the send the message has no
> body, and the headers set before the send are gone; only the result headers,
> such as {{CamelSmppId}}, are left. A route that answers an HTTP request with
> the SMS it sent answers with an empty body.
> Checked on 4.24.0-SNAPSHOT with {{camel run}} against the jSMPP simulator: a
> header {{marker}}, the body "Hello inout" and {{to: smpp://...}} with
> {{pattern: InOut}}: after the send the body is null, {{marker}} is gone, and
> {{CamelSmppId}} is set. With InOnly, the body and the headers stay.
> *Proposed change*: set the result headers on the message of the exchange, as
> InOnly does.
> h4. 4. A CamelSmppCommand value that is not a command sends the body as an SMS
> The smpp producer picks the command from the {{CamelSmppCommand}} header, and
> a value it does not know means SubmitSm ({{SmppCommandType.fromExchange}},
> main 56aa5f4970a6, line 97). So a misspelled command, such as {{querySm}} for
> {{QuerySm}}, sends the body as an SMS.
> Checked on 4.24.0-SNAPSHOT with {{camel run}} against the jSMPP simulator:
> {{CamelSmppCommand=querySm}} with the body "typo sends an SMS": the simulator
> logs "Receiving submit_sm 'typo sends an SMS'".
> *Proposed change*: fail for a value that is not a command, and keep SubmitSm
> for a missing header.
> _Claude Code on behalf of davsclaus_
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)