[
https://issues.apache.org/jira/browse/CAMEL-25154?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Claus Ibsen resolved CAMEL-25154.
---------------------------------
Fix Version/s: 4.23.0
Resolution: Fixed
The fix is merged on main, so it is in Camel 4.23.0:
* 0066c102dd1e CAMEL-25154: camel-vertx-http - send a file body that is not a
local java.io.File
* 03cb0c082587 CAMEL-25154: camel-vertx-http - drop the camel-file dependency
for the upload name fallback
* 4c21404e957b CAMEL-25154: camel-vertx-http - name a remote file upload after
the file, and test a streamed remote file body
Resolving, as the ticket was not updated when the PR was merged.
_Claude Code on behalf of Claus Ibsen_
> camel-vertx-http - a file body that is not a local java.io.File (such as a
> file from ftp, sftp or smb) is never sent and the exchange never completes,
> so the route hangs (regression of CAMEL-22044)
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: CAMEL-25154
> URL: https://issues.apache.org/jira/browse/CAMEL-25154
> Project: Camel
> Issue Type: Bug
> Components: camel-vertx-http
> Reporter: shashank
> Priority: Minor
> Labels: regression
> Fix For: 4.23.0
>
>
> Since CAMEL-22044 (4.12.0) {{VertxHttpProducer.process}} handles file bodies
> in their own branch (line numbers of main):
> {code:java}
> if (body instanceof File || body instanceof WrappedFile) { // :98
> File file = message.getBody(File.class); // :100
> if (file != null) { // :101
> ... request.sendBuffer(buf, resultHandler) or sendMultipartForm(...)
> }
> }
> ...
> return false; // :154
> {code}
> When the body is a {{WrappedFile}} that cannot be converted to a
> {{java.io.File}}, {{file}} is null: nothing is sent, the callback is never
> called, and {{process}} returns false (continue asynchronously). The exchange
> never completes.
> This is the case for the remote file consumers without
> {{localWorkDirectory}}: camel-ftp (FTP, FTPS, SFTP) and camel-smb put a
> {{RemoteFile}} on the message whose content is already downloaded as
> {{byte[]}} (or an {{InputStream}} with {{streamDownload=true}});
> {{GenericFileConverter}} has no converter from those to {{File}} and returns
> null. Before 4.12.0 such a body went through
> {{getMandatoryBody(Buffer.class)}} and was sent.
> Effect: {{from("sftp:...").to("vertx-http:https://...")}} (download and
> upload by HTTP) never sends the first file. The exchange stays inflight, the
> calling thread waits for it (for a polling consumer such as sftp the consumer
> thread blocks, so the route stops polling), and a graceful shutdown waits for
> the full timeout.
> h3. Reproduction
> A local Vert.x HTTP server counts the requests; route
> {{from("direct:in").to("vertx-http:http://localhost:port/upload?httpMethod=POST")}};
> the exchange is sent with {{asyncSend}} and awaited for 5 s:
> * body a {{GenericFile}} whose file handle is not a {{java.io.File}} and
> whose content is {{byte[]}} (what the ftp/sftp consumers produce): not
> completed after 5 s, 0 requests at the server, inflight 1. 3 of 3 runs, and 5
> of 5 in a loop;
> * controls: a {{GenericFile}} of a local file, and a {{byte[]}} body:
> completed, response 200, 1 request each.
> h3. Proposed fix
> Add the missing else branch: when the file body cannot be converted to a
> {{File}}, send its content ({{getMandatoryBody(Buffer.class)}}), as a
> multipart file upload with the {{CamelFileNameOnly}} header as the file name
> ({{multipartUploadName}} when the header is missing) when
> {{multipartUpload=true}}, else as a buffer. Any conversion failure then
> completes the exchange with the exception through the existing catch block.
> With the fix the remote-file case completes with response 200 and the server
> receives the 12 bytes of content (3 of 3); the controls are unchanged. A test
> with a {{GenericFile}} body with {{byte[]}} content, sent as a plain body and
> as a multipart upload, times out without the fix and passes with it; the
> camel-vertx-http tests pass (95 tests, 1 skipped).
> Affected: 4.12.0 and later (the branch is not at camel-4.11.0; it is at
> 4.12.0, 4.13.0, 4.14.0, 4.18.0, 4.22.0 and main).
> Duplicate check (2026-09-30): JIRA component camel-vertx-http since 2024 (15
> issues: SSL, header filter, tracing, CAMEL-22044 multipart upload), text
> "vertx-http" with "file" (44, none about a remote file body or a hang);
> GitHub pull requests "VertxHttpProducer", "vertx-http WrappedFile",
> "vertx-http file upload": none.
> _Filed with Claude Code on behalf of allthingssecurity._
--
This message was sent by Atlassian Jira
(v8.20.10#820010)