You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by jk...@apache.org on 2019/07/12 14:09:14 UTC

[ant] 01/02: Bug 47414 - [PATCH] Add Ftp ant task timeout by Eugene Adell

This is an automated email from the ASF dual-hosted git repository.

jkf pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ant.git

commit e6b44170a8419f01a5ea45b4917f569ca45aafff
Author: jkf <jm...@famkruithof.net>
AuthorDate: Fri Jul 12 14:45:48 2019 +0200

    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 ee3d30b..3be911a 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",
@@ -1695,6 +1697,19 @@ public class FTP extends Task implements FTPTaskConfig {
     }
 
     /**
+     * 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.
      *
      * @throws BuildException if the configuration is not valid.
@@ -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()) {