From e6b44170a8419f01a5ea45b4917f569ca45aafff Mon Sep 17 00:00:00 2001 From: jkf Date: Fri, 12 Jul 2019 14:45:48 +0200 Subject: [PATCH] Bug 47414 - [PATCH] Add Ftp ant task timeout by Eugene Adell --- .../tools/ant/taskdefs/optional/net/FTP.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java index ee3d30ba2..3be911a4d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/net/FTP.java @@ -25,6 +25,7 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.SocketTimeoutException; import java.nio.file.Files; import java.text.SimpleDateFormat; import java.util.Collection; @@ -144,6 +145,7 @@ public class FTP extends Task implements FTPTaskConfig { private String siteCommand = null; private String initialSiteCommand = null; private boolean enableRemoteVerification = true; + private int dataTimeout = -1; protected static final String[] ACTION_STRS = { //NOSONAR "sending", @@ -1694,6 +1696,19 @@ public class FTP extends Task implements FTPTaskConfig { enableRemoteVerification = b; } + /** + * Sets the timeout on the data connection. + * Any negative value is discarded and leaves the default + * + * @param dataTimeout int + * @since Ant 1.10.6 + */ + public void setDataTimeout(int dataTimeout) { + if(dataTimeout >= 0) { + this.dataTimeout = dataTimeout; + } + } + /** * Checks to see that all required parameters are set. * @@ -2443,6 +2458,11 @@ public class FTP extends Task implements FTPTaskConfig { ftp.setRemoteVerificationEnabled(enableRemoteVerification); ftp.connect(server, port); + + if (dataTimeout >= 0) { + ftp.setDataTimeout(dataTimeout); + log("Setting data timeout to " + dataTimeout, Project.MSG_VERBOSE); + } if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { throw new BuildException("FTP connection failed: %s", ftp.getReplyString()); @@ -2536,6 +2556,22 @@ public class FTP extends Task implements FTPTaskConfig { } } catch (IOException ex) { + String cause = ex.getCause().toString(); + if(cause != null) { + if(cause.contains("java.net.SocketTimeoutException")) { + // When a read timeout occurs, inform the server that it + // should abort. + // Note that the latest commons-net (3.6) still doesn't + // support sending urgent data, which is normally a + // prerequisite for ABORT command. + // As a consequence, it might not be taken in account immediately + try { + ftp.abort(); + } catch(IOException ioe) { + // ignore it + } + } + } throw new BuildException("error during FTP transfer: " + ex, ex); } finally { if (ftp != null && ftp.isConnected()) {