[
https://issues.apache.org/jira/browse/CAMEL-11754?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16165315#comment-16165315
]
dheitzer commented on CAMEL-11754:
----------------------------------
I tried reproducing this against another FTP server and to my surprise, I was
actually unable to. After some more digging, I found that the issue is that
some UNIX-based FTP servers (like the one I'm using) respond to the LIST
command with absolute paths to files and others do not.
According to [this stack overflow post|
https://stackoverflow.com/questions/42962211/why-ftp-list-command-returns-full-path-to-file],
the issue is that the LIST command protocol does not specify what kinda of
path should be returned. Unfortunately, as I showed in my original post, Camel
expects the FTPFile.name to _not_ be an absolute path to a file, however my
flavor of server is returning one.
I have tried all of the other parser options with no luck. Can Camel be
updated to check if FTPFile.name is an absolute path or not before appending it?
> Apache Camel FTP getting Cannot retrieve file: RemoteFile error
> ---------------------------------------------------------------
>
> Key: CAMEL-11754
> URL: https://issues.apache.org/jira/browse/CAMEL-11754
> Project: Camel
> Issue Type: Bug
> Components: camel-ftp
> Affects Versions: 2.19.0
> Environment: Windows 10 x64
> jdk1.8.0_131
> Camel 2.19.0
> Reporter: dheitzer
>
> I'm receiving an error from the FTP Component when its processing files in
> Camel 2.19.0.
> I'm trying to retrieve files using the Camel FTP component (Camel 2.19.0):
> from("ftp://my.host.com:21/my/relative/directory?download=true&stepwise=false&delete=false")
> {code:java}
> org.apache.camel.component.file.GenericFileOperationFailedException: Cannot
> retrieve file: RemoteFile[my/relative/directory/file1.txt] from:
> ftp://my.host.com:21/my/relative/directory?delete=false&download=true&stepwise=false
> at
> org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:427)
> at
> org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137)
> at
> org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:218)
> at
> org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:182)
> at
> org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174)
> at
> org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101)
> at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
> at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
> at
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at java.lang.Thread.run(Thread.java:748)
> {code}
> From the TRACE logs, I can see that Camel is listing the files in the
> directory correctly:
> {code:java}
> [TRACE] 2017-09-05 11:40:49,438
> org.apache.camel.component.file.remote.FtpConsumer - Polling directory:
> my/relative/directory
> [TRACE] 2017-09-05 11:40:51,748
> org.apache.camel.component.file.remote.FtpOperations -
> listFiles(my/relative/directory)
> [TRACE] 2017-09-05 11:40:58,657
> org.apache.camel.component.file.remote.FtpConsumer - Found 3 in directory:
> my/relative/directory
> [TRACE] 2017-09-05 11:40:58,657
> org.apache.camel.component.file.remote.FtpConsumer -
> FtpFile[name=/absolute/path/to/directory/file1.txt, dir=false, file=true]
> [TRACE] 2017-09-05 11:40:58,657
> org.apache.camel.component.file.remote.FtpConsumer -
> FtpFile[name=/absolute/path/to/directory/file2.txt, dir=false, file=true]
> [TRACE] 2017-09-05 11:40:58,657
> org.apache.camel.component.file.remote.FtpConsumer -
> FtpFile[name=/absolute/path/to/directory/file3.txt, dir=false, file=true]
> {code}
> When Camel tries to process each file however, it appears to be prepending
> the relative directory to the absolute directory and failing to find the
> resulting garbled path:
> {code:java}
> [TRACE] 2017-09-05 11:40:59,417
> org.apache.camel.component.file.remote.FtpConsumer - Processing file:
> RemoteFile[absolute/path/to/directory/file1.txt]
> [TRACE] 2017-09-05 11:40:59,418
> org.apache.camel.component.file.remote.FtpConsumer - Retrieving file:
> my/relative/directory//absolute/path/to/directory/file1.txt from:
> ftp://my.host.com:21/my/relative/directory?delete=false&download=true&stepwise=false
> [TRACE] 2017-09-05 11:40:59,418
> org.apache.camel.component.file.remote.FtpOperations -
> retrieveFile(my/relative/directory//absolute/path/to/directory/file1.txt)
> [TRACE] 2017-09-05 11:40:59,418
> org.apache.camel.component.file.remote.FtpOperations - Client retrieveFile:
> my/relative/directory//absolute/path/to/directory/file1.txt
> [WARN ] 2017-09-05 11:40:59,518
> org.apache.camel.component.file.remote.FtpConsumer - Error processing file
> RemoteFile[absolute/path/to/directory/file1.txt] due to Cannot retrieve file:
> RemoteFile[absolute/path/to/directory/file1.txt] from:
> ftp://my.host.com:21/my/relative/directory?delete=false&download=true&stepwise=false
> {code}
> This path in the logs constructed by the FTPComponent is incorrect:
> {noformat}
> Retrieving file: my/relative/directory//absolute/path/to/directory/file1.txt
> {noformat}
> I debugged the Camel FTP consumer and it looks like
> [on line 238 is where the relative path is getting prepended to the absolute
> path|https://github.com/apache/camel/blob/camel-2.19.x/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/FtpConsumer.java#L238]
> Interestingly enough, [the SFTP component is doing the same
> thing|https://github.com/apache/camel/blob/camel-2.19.x/components/camel-ftp/src/main/java/org/apache/camel/component/file/remote/SftpConsumer.java#L208]
> however it is working because
> {code:java}
> RemoteFileOperations<ChannelSftp.LsEntry>
> {code}
> does not set filename as an absolute path but
> {code:java}
> RemoteFileOperations<FTPFile>
> {code}
> does.
> Does anyone have any suggestions to work around this to get the FTP Conponent
> to consume the files? or am I doing something incorrectly?
> I'm using Camel 2.19.0
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)