You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Mario Ivankovits <im...@apache.org> on 2004/10/18 12:21:45 UTC

[net][vfs] detection of closed ftp connections due to timeout

Hello!

I currently try to extend the VFS ftp implementation to allow automatic 
reconnect if the ftp connection timed out.
This already works pretty well, but it relys on the 
FTPConnectionClosedException.

The bad side is, the user who initiated this does not get a 
FTPConnectionClosedException - The exception is a SocketException 
(Broken pipe).

After discussion we found there is a firewall sitting between him and 
his ftp-server.
Now that I know firewalls which disconnects idle connections on its own, 
I bet this is what causes this "strange" exception.

FTP.isConnected() also returns true - odd thing.

Now i would like to know what we could do next.

I would like to propose to catch the SocketException and wrap a 
FTPConnectionClosedException.

In FTP.sendCommand():

try
{
        _controlOutput.write(message = __commandBuffer.toString());
        _controlOutput.flush();
}
catch (SocketException e)
{
    throw new FTPConnectionClosedException(e);
}

The question is, do a SocketException always mean "connection closed", 
for sure I dont think so, but matching the message against "broken pipe" 
is also not an option.
Maybe - in the catch block we could also query the isConnected() and 
throw the FTPConnectionClosedException() only if it is false.

For sure I send a clean patch if we find a solution.

This is what the user gets:

Caused by: java.net.SocketException: Broken pipe
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at
org.apache.commons.net.telnet.TelnetClient._flushOutputStream(TelnetClient.java:76)
	at
org.apache.commons.net.telnet.TelnetOutputStream.flush(TelnetOutputStream.java:136)
	at java.io.FilterOutputStream.flush(FilterOutputStream.java:123)
	at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:410)
	at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
	at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
	at java.io.BufferedWriter.flush(BufferedWriter.java:236)
	at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:405)
	at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:438)
	at org.apache.commons.net.ftp.FTP.port(FTP.java:767)
	at
org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:449)
	at
org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2335)
	at
org.apache.commons.net.ftp.FTPClient.initiateListParsing(FTPClient.java:2309)
	at org.apache.commons.net.ftp.FTPClient.listFiles(FTPClient.java:2055)
	at
org.apache.commons.vfs.provider.ftp.FtpFileObject.doGetChildren(FtpFileObject.java:118)
	at
org.apache.commons.vfs.provider.ftp.FtpFileObject.doListChildren(FtpFileObject.java:260)
	at
org.apache.commons.vfs.provider.AbstractFileObject.getChildren(AbstractFileObject.java:545)
	... 38 more


-- 
Mario


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org