commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jeff Barrett" <JBarr...@sawyermedia.com>
Subject [VFS][patch] idle FTP connections throw exceptions
Date Mon, 23 Jun 2003 19:01:56 GMT
I've noticed that leaving an FTP provider idle for a while, and thereby the FTP connection
idle, causes exceptions to be thrown on subsequent client-server communication.  I didn't
have too much time to investigate the problem.  Unfortunately FTPClient.isConnection() will
still return true when the connection is in this "stale" state.  One clear symptom was the
following line in the commons-net FTPClient.__openDataConnection : 
server = _socketFactory_.createServerSocket(0, 1, getLocalAddress());

that call to getLocalAddress returns 255.255.255.255 when the state of the connection is bad.

Anyway, I have a cheesy workaround.  The diff below also includes some URLEncode/decode stuff
from another patch I submitted.  You may include or remove this as you see fit.



Index: src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystem.java
===================================================================
RCS file: /home/cvspublic/jakarta-commons-sandbox/vfs/src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystem.java,v
retrieving revision 1.21
diff -u -r1.21 FtpFileSystem.java
--- src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystem.java     14 Apr 2003 01:09:25
-0000   1.21
+++ src/java/org/apache/commons/vfs/provider/ftp/FtpFileSystem.java     23 Jun 2003 18:52:34
-0000
@@ -56,6 +56,9 @@
 package org.apache.commons.vfs.provider.ftp;

 import java.io.IOException;
+import java.net.BindException;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
 import java.util.Collection;
 import org.apache.commons.net.ftp.FTP;
 import org.apache.commons.net.ftp.FTPClient;
@@ -97,7 +100,7 @@
         }
         else
         {
-            username = rootName.getUserName();
+            username = URLDecoder.decode( rootName.getUserName() );
         }
         if ( rootName.getPassword() == null )
         {
@@ -105,7 +108,7 @@
         }
         else
         {
-            password = rootName.getPassword();
+            password = URLDecoder.decode( rootName.getPassword() );
         }
     }

@@ -166,6 +169,23 @@
         }
         else
         {
+
+            /*
+             * It seems there are cases that leaving an ftp
+             * connection idle for a while will cause errors.
+             * client.isConnected() doesnt help here.  these errors
+             * are manifested as IOExceptions thrown when sending
+             * commands to the FTP server.  The below will
+             * make sure the connection still works.  If it doesn't
+             * it will re-establish it.
+             */
+            try {
+                idleClient.getStatus();
+            } catch (IOException e) {
+                closeConnection( idleClient );
+                idleClient = createConnection();
+            }
+
             final FTPClient client = idleClient;
             idleClient = null;
             return client;










The information in this email and subsequent attachments may contain confidential information
that is intended solely for the attention and use of the named addressee(s). This message
or any part thereof must not be disclosed, copied, distributed, or retained by any person
without the authorization from the addressee.

 

Mime
View raw message