title: 425 error ftp over SSL in Java
body: <p>Using the Apache commons library, I am attempting to put a file or to list directory contents on the remote server that is connected using FTP over SSL.  </p>
  
  <pre><code>public void outboundProcessFile(String inputFilePath, String outputFilePath) throws Exception {
  
  File inFile = new java.io.File(inputFilePath);
  if (args == null){
      System.exit(-1) ;
  }
  String args[] = this.args;
  
  boolean storeFile = false, binaryTransfer = false, error = false, listFiles = false, listNames = false, hidden = false;
  boolean mlst = false, mlsd = false;
  boolean lenient = true;
  boolean feat = true;;
  long keepAliveTimeout = 300000;
  int controlKeepAliveReplyTimeout = 300000;
  int minParams = 5; 
  String doCommand = "PROT P";//null
  String server = null, password = null, username = null, remote = null,local = null;
  int port = 990;//990
  int base = 0;
  for (base = 0; base &lt; args.length; base++)     {
      if (args[base].equals("-s")) {
          storeFile = true;
      }        else if (args[base].equals("-b")) {
          binaryTransfer = true;
      }        else if (args[base].equals("-c")) {
          doCommand = args[++base];
          minParams = 3;
      }        else if (args[base].equals("-d")) {
          mlsd = true;
          minParams = 3;
      }        else if (args[base].equals("-h")) {
          hidden = true;
      }        else if (args[base].equals("-k")) {
          keepAliveTimeout = Long.parseLong(args[++base]);
      }        else if (args[base].equals("-l")) {
          listFiles = true;
          minParams = 3;
      }        else if (args[base].equals("-L")) {
          lenient = true;
      }        else if (args[base].equals("-n")) {
          listNames = true;
          minParams = 3;
      }        else if (args[base].equals("-t")) {
          mlst = true;
          minParams = 3;
      }        else if (args[base].equals("-w")) {
          controlKeepAliveReplyTimeout = Integer.parseInt(args[++base]);
      }        else if (args[base].equals("-sh")) {
          server = args[++base];
          String parts[] = server.split(":");
          if (parts.length == 2){
              server=parts[0];
              port=Integer.parseInt(parts[1]);
          }
      }        else if (args[base].equals("-u")) {
          username = args[++base];
      }        else if (args[base].equals("-pw")) {
          password = args[++base];
      }        else if (args[base].equals("-rf")) {
          remote = null;
  
          if (args.length - base &gt; 0) {
              remote = args[++base];
          }
      }        else if (args[base].equals("-lf")) {
          local = null;
  
          if (args.length - base &gt; 0) {
              local = args[++base];
          }
      }        else {
          break;
      }
  }
  
  FTPClient ftp;
      FTPSClient ftps = new FTPSClient(true);
  
      ftp = ftps;
      ftps.setTrustManager(TrustManagerUtils.getAcceptAllTrustManager());
      ftp.setCopyStreamListener(createListener());
  
  if (keepAliveTimeout &gt;= 0) {
      ftp.setControlKeepAliveTimeout(keepAliveTimeout);
  }
  if (controlKeepAliveReplyTimeout &gt;= 0) {
      ftp.setControlKeepAliveReplyTimeout(controlKeepAliveReplyTimeout);
  }
  ftp.setListHiddenFiles(hidden);
  
  // suppress login details
  ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out), true));
  
  try                                  {
      int reply;
      if (port &gt; 0) {
          ftp.connect(server, port);
      } else {
          ftp.connect(server);
      }
      System.out.println("Connected to " + server + " on "+ftp.getRemotePort());
  
      // After connection attempt, you should check the reply code to verify
      // success.
      reply = ftp.getReplyCode();
  
      if (!FTPReply.isPositiveCompletion(reply))           {
          ftp.disconnect();
          System.err.println("FTP server refused connection.");
          System.exit(1);
      }
  }
  catch (IOException e)         {
      if (ftp.isConnected())         {
          try               {
              ftp.disconnect();
          }
          catch (IOException f)
          {
              // do nothing
          }
      }
      System.err.println("Could not connect to server.");
      e.printStackTrace();
      System.exit(1);
  }
  
  __main:
  try
  {
      String userid = null;//
  
      if (!ftp.login(username, password))              {
          ftp.logout();
          error = true;
          break __main;
      }
  
      System.out.println("Remote system is " + ftp.getSystemType());
      if (feat)                                                        {
          // boolean feature check
          if (remote != null) { // See if the command is present
              if (ftp.hasFeature(remote)) {
                  System.out.println("Has feature: "+remote);
              } else {
                  if (FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
  //                        System.out.println("FEAT "+remote+" was not detected");
                  } else {
                      System.out.println("Command failed: "+ftp.getReplyString());
                  }
              }
  
              // Strings feature check
              String []features = ftp.featureValues(remote);
              if (features != null) {
                  for(String f : features) {
                      System.out.println("FEAT "+remote+"="+f+".");
                  }
              } else {
                  if (FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
  //                        System.out.println("FEAT "+remote+" is not present");
                  } else {
                      System.out.println("Command failed: "+ftp.getReplyString());
                  }
              }
          } else {
              if (ftp.features()) {
  //                    Command listener has already printed the output
              } else {
                  System.out.println("Failed: "+ftp.getReplyString());
              }
          }
      }
      ftp.doCommandAsStrings("PBSZ", "0");
      ftp.doCommandAsStrings("PROT", "P");
      if (binaryTransfer)
          ftp.setFileType(FTP.ASCII_FILE_TYPE);//.BINARY_FILE_TYPE);
  
      // Use passive mode as default because most of us are
      // behind firewalls these days.
  
          ftp.enterLocalPassiveMode();
          ftp.doCommand("MLSD", "");
  
      if (storeFile)          {
          InputStream input;
  
          input = new FileInputStream(local);
          ftp.changeWorkingDirectory(remote);
          ftp.storeFile(local.substring(local.lastIndexOf("/")+1), input);
  
          input.close();
      }        else if (listFiles)          {
          if (lenient) {
              FTPClientConfig config = new FTPClientConfig();
              config.setLenientFutureDates(true);
              ftp.configure(config );
          }
  
          for (FTPFile f : ftp.listFiles(remote)) {
              System.out.println(f.getRawListing());
              System.out.println(f.toFormattedString());
          }
      }         else if (mlsd)         {
          for (FTPFile f : ftp.mlistDir(remote)) {
              System.out.println(f.getRawListing());
              System.out.println(f.toFormattedString());
          }
      }           else if (mlst)          {
          FTPFile f = ftp.mlistFile(remote);
          if (f != null){
              System.out.println(f.toFormattedString());
          }
      }               else if (listNames)           {
          for (String s : ftp.listNames(remote)) {
              System.out.println(s);
          }
      }    else          {
          OutputStream output;
  
          output = new FileOutputStream(local);
          ftp.changeWorkingDirectory(remote);
          ftp.retrieveFile(local.substring(local.lastIndexOf("/")), output);
  
          output.close();
      }
  
      ftp.noop(); // check that control connection is working OK
      ftp.logout();
  }       catch (FTPConnectionClosedException e)       {
      error = true;
      System.err.println("Server closed connection.");
      e.printStackTrace();
  }     catch (IOException e)        {
      error = true;
      e.printStackTrace();
  }     finally         {
      if (ftp.isConnected())         {
          try               {
              ftp.disconnect();
          }             catch (IOException f)             {
              // do nothing
          }
      }
  }
  System.exit(error? -1:0);       
     }
  </code></pre>
  
  <p>I run this and get console output for listing...</p>
  
  <pre><code>220 Serv-U FTP Server v6.4 for WinSock ready...
  Connected to ftps.server.com on 990
  USER *******
  331 User name okay, need password.
  PASS *******
  230 User logged in, proceed.
  SYST
  215 UNIX Type: L8
  Remote system is UNIX Type: L8
  FEAT
  211-Extension supported
   AUTH TLS
   SSCN
   PBSZ
   PROT
   CCC
   CLNT
   MDTM
   MDTM YYYYMMDDHHMMSS[+-TZ];filename
   SIZE
   SITE PSWD;EXEC;SET;INDEX;ZONE;CHMOD;MSG
   REST STREAM
   XCRC filename;start;end
   MODE Z
   MLST Type*;Size*;Create;Modify*;Win32.ea*;
  211 End
  PBSZ 0
  200 PBSZ command OK. Protection buffer size set to 0.
  PROT P
  200 PROT command OK. Using private data connection.
  TYPE A
  200 Type set to A.
  MLSD 
  150 Opening BINARY mode data connection for MLSD.
  PASV
  227 Entering Passive Mode (204,124,192,88,195,82)
  LIST Directory/toIC/
  425 Try later, data connection in use.
  NOOP
  150 Opening BINARY mode data connection for MLSD.
  QUIT
  200 Command okay.
  </code></pre>
  
  <p>If I do not MLSD and attempt to upload a file, I will see a 0 byte file with the file name placed on the server (via FileZilla) and I will get a 421 error. Ideas?</p>