[ 
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)

Reply via email to