[
https://issues.apache.org/jira/browse/CAMEL-25524?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Work on CAMEL-25524 started by shashank.
----------------------------------------
> camel-mina-sftp - the producer writes a file in the charset of the exchange
> instead of the charset option, and fails for a null body with
> allowNullBody=true
> ------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25524
> URL: https://issues.apache.org/jira/browse/CAMEL-25524
> Project: Camel
> Issue Type: Bug
> Components: camel-ftp
> Reporter: shashank
> Assignee: shashank
> Priority: Major
>
> {{MinaSftpOperations.doStoreFile}} (lines 1306-1373 at main 586855a18315)
> writes the body as {{exchange.getIn().getMandatoryBody(InputStream.class)}}.
> The {{charset}} option of the endpoint ("This option is used to specify the
> encoding of the file") is not used, so a String body is encoded in the
> charset of the exchange ({{CamelCharsetName}}, UTF-8 by default). And a null
> body fails with {{InvalidPayloadException: No body available of type:
> java.io.InputStream}} although {{allowNullBody=true}}. camel-sftp, camel-ftp
> and camel-smb do both in their {{storeFile}}:
> {code:java}
> if (exchange.getIn().getBody() == null) {
> if (endpoint.isAllowNullBody()) { is = new ByteArrayInputStream(new
> byte[] {}); } else { throw ... }
> }
> ...
> String charset = endpoint.getCharset();
> if (charset != null) { is = GenericFileHelper.toInputStream(exchange,
> charset); } else { is = getMandatoryBody(InputStream.class); }
> {code}
> The existing {{SftpProducerWithCharsetIT}} of camel-mina-sftp passes only
> because it sends with a {{ProducerTemplate}} directly to the endpoint:
> {{DefaultEndpoint.createExchange}} then sets the endpoint charset on the
> exchange. In a route
> ({{from("file:in").to("mina-sftp:...?charset=iso-8859-1")}}) the exchange
> comes from another endpoint, and every non-ASCII character of the file is
> written in UTF-8, without any error.
> h3. Reproduction
> New test {{SftpProducerWithCharsetIT.testProducerWithCharsetInRoute}}
> (embedded SFTP server as in the other tests): {{"æøå ©"}} sent through
> {{direct:start}} to the endpoint with {{charset=iso-8859-1}}; new
> {{SftpProducerAllowNullBodyIT}} (as {{FtpProducerAllowNullBodyIT}} of
> camel-ftp). On main, twice:
> {noformat}
> SftpProducerWithCharsetIT.testProducerWithCharsetInRoute: The file must be
> written in the charset of the endpoint ==> expected: <æøå ©> but was: <æøå
> ©>
> SftpProducerAllowNullBodyIT.testAllowNullBodyTrue: CamelExecutionException
> ... Caused by: InvalidPayloadException: No body available of type:
> java.io.InputStream
> {noformat}
> h3. Proposed fix
> {{doStoreFile}} gets the input stream as camel-sftp does: an empty file for a
> null body with {{allowNullBody=true}} (and the same "Cannot write null body
> to file" failure as camel-sftp when it is false),
> {{GenericFileHelper.toInputStream(exchange, charset)}} (streaming,
> CAMEL-25167) when the {{charset}} option is set, the body as before
> otherwise. Files written without a {{charset}} option, or from exchanges
> created by the endpoint, are unchanged. 4.23 upgrade guide note added.
> camel-mina-sftp with the fix: 26 unit tests (1 skipped) and 270 integration
> tests with the embedded SFTP server (7 skipped), 0 failures; one
> {{SftpBulkRequestsIT}} test timed out once waiting for the embedded server to
> start and passed on the rerun (7 of 7).
> Found with a Lean 4 model of the store (body as code points or null, UTF-8
> and ISO-8859-1, the endpoint options and the exchange charset): "the file is
> the body in the endpoint charset, an empty file for a null body with
> allowNullBody" (camel-sftp) fails for "æ" ({{C3 A6}} instead of {{E6}}) and
> for a null body, and main is proved to write every character from U+0080 to
> U+00FF wrong when the two charsets differ. The fix is proved to equal
> camel-sftp's behaviour for every body and configuration, and to write the
> same bytes as main when no charset option is set or it is the exchange
> charset. Confirmed with the real producer.
> Not changed here: camel-azure-files has the same omission
> ({{FilesOperations.storeFile}} ignores {{charset}}); it needs its own change
> because it computes the length of the upload.
> Affected: main, camel-4.22.x, camel-4.18.x (same code, GitHub contents API);
> the component was added in 4.18.
> Duplicate check (2026-10-10): JIRA text "mina-sftp" (19, none about charset
> or allowNullBody; CAMEL-25167 changed the charset conversion of ftp, sftp and
> smb only); GitHub pull requests "mina-sftp charset" (none),
> "MinaSftpOperations" (4, thread leak and path containment). No open pull
> request changes {{MinaSftpOperations}}.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)