Description
Randomly, we're experiencing SocketTimoutException when we connect an FTP via an Http Proxy :
java.io.IOException: Timed out waiting for initial connect reply at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:403) at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:931) at org.apache.commons.net.ftp.FTPClient._connectAction_(FTPClient.java:925) at org.apache.commons.net.ftp.FTPHTTPClient.connect(FTPHTTPClient.java:144) Caused by: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121) at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:284) at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:326) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178) at java.io.InputStreamReader.read(InputStreamReader.java:184) at java.io.BufferedReader.fill(BufferedReader.java:161) at java.io.BufferedReader.read(BufferedReader.java:182) at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58) at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:315) at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:295) at org.apache.commons.net.ftp.FTP._connectAction_(FTP.java:397) ... 6 more
After analysis, I think the problem is that commons-net opens 2 BufferedReader on the same InputStream : first in the FTPHTTPClient.tunnelHandshake method, and the second in FTP._connectAction() method.
If the first BufferedReader reads all datas in the socket, the second waits until SocketTimeout.