You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by se...@apache.org on 2011/03/08 17:56:40 UTC

svn commit: r1079436 - in /commons/proper/net/trunk/src: changes/changes.xml main/java/org/apache/commons/net/ftp/FTPClient.java

Author: sebb
Date: Tue Mar  8 16:56:40 2011
New Revision: 1079436

URL: http://svn.apache.org/viewvc?rev=1079436&view=rev
Log:
NET-314 The FTP client should autodetect the control encoding.

Modified:
    commons/proper/net/trunk/src/changes/changes.xml
    commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java

Modified: commons/proper/net/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/changes/changes.xml?rev=1079436&r1=1079435&r2=1079436&view=diff
==============================================================================
--- commons/proper/net/trunk/src/changes/changes.xml (original)
+++ commons/proper/net/trunk/src/changes/changes.xml Tue Mar  8 16:56:40 2011
@@ -57,6 +57,9 @@ The <action> type attribute can be add,u
 
     <body>
         <release version="3.0" date="TBA" description="TBA">
+            <action issue="NET-314" dev="sebb" type="add" due-to="Bogdan Drozdowski" due-to-email="bogdandr # op . pl">
+            The FTP client should autodetect the control encoding.
+            </action>
             <action issue="NET-363" dev="sebb" type="fix" due-to="daniel damon">
             Can't connect to a server behind firewall in passive mode.
             </action>

Modified: commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java
URL: http://svn.apache.org/viewvc/commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java?rev=1079436&r1=1079435&r2=1079436&view=diff
==============================================================================
--- commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java (original)
+++ commons/proper/net/trunk/src/main/java/org/apache/commons/net/ftp/FTPClient.java Tue Mar  8 16:56:40 2011
@@ -18,10 +18,12 @@ package org.apache.commons.net.ftp;
 import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
+import java.io.OutputStreamWriter;
 import java.net.Inet6Address;
 import java.net.InetAddress;
 import java.net.ServerSocket;
@@ -353,6 +355,9 @@ implements Configurable
                 "(\\d{1,3},\\d{1,3},\\d{1,3},\\d{1,3}),(\\d{1,3}),(\\d{1,3})");
     }
 
+    /** Controls the automatic server encoding detection (only UTF-8 supported). */
+    private boolean __autodetectEncoding = false;
+
     private static class PropertiesSingleton {
 
         static final Properties PROPERTIES;
@@ -719,6 +724,38 @@ implements Configurable
     {
         super._connectAction_();
         __initDefaults();
+        // must be after super._connectAction_(), because otherwise we get an
+        // Exception claiming we're not connected
+        if ( __autodetectEncoding )
+        {
+            ArrayList<String> oldReplyLines = new ArrayList<String> (_replyLines);
+            int oldReplyCode = _replyCode;
+            if ( features() )
+            {
+                String[] features = getReplyStrings();
+                if ( features != null )
+                {
+                    for ( int i = 0; i < features.length; i++ )
+                    {
+                        if ( features[i].trim().toUpperCase().equals("UTF8")
+                            || features[i].trim().toUpperCase().equals("UTF-8") )
+                        {
+                            setControlEncoding("UTF-8");
+                            _controlInput_ =
+                                new BufferedReader(new InputStreamReader(_socket_.getInputStream(),
+                                                                        getControlEncoding()));
+                            _controlOutput_ =
+                                new BufferedWriter(new OutputStreamWriter(_socket_.getOutputStream(),
+                                                                        getControlEncoding()));
+                            break;
+                        }
+                    }
+                }
+            }
+            // restore the original reply (server greeting)
+            _replyLines = new ArrayList<String> (oldReplyLines);
+            _replyCode = oldReplyCode;
+        }
     }
 
 
@@ -3021,6 +3058,25 @@ implements Configurable
         merged.addCopyStreamListener(__copyStreamListener);
         return merged;
     }
+
+    /**
+     * Enables or disables automatic server encoding detection (only UTF-8 supported).
+     * @param autodetect If true, automatic server encoding detection will be enabled.
+     */
+    public void setAutodetectUTF8(boolean autodetect)
+    {
+        __autodetectEncoding = autodetect;
+    }
+
+    /**
+     * Tells if automatic server encoding detection is enabled or disabled.
+     * @return true, if automatic server encoding detection is enabled.
+     */
+    public boolean getAutodetectUTF8()
+    {
+        return __autodetectEncoding;
+    }
+
 }
 
 /* Emacs configuration
@@ -3030,3 +3086,4 @@ implements Configurable
  * indent-tabs-mode: nil   **
  * End:                    **
  */
+/* kate: indent-width 4; replace-tabs on; */