You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "shashank (Jira)" <ji...@apache.org> on 2026/10/10 09:52:00 UTC

[jira] [Assigned] (CAMEL-25524) 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

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

shashank reassigned CAMEL-25524:
--------------------------------

    Assignee: 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)