You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@mina.apache.org by "amtlib.dll (JIRA)" <ji...@apache.org> on 2015/01/26 08:01:34 UTC

[jira] [Updated] (FTPSERVER-465) A patch to enable controlling the charset in order to work around a bug of Windows Explorer in CJK environments

     [ https://issues.apache.org/jira/browse/FTPSERVER-465?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

amtlib.dll updated FTPSERVER-465:
---------------------------------
    Summary: A patch to enable controlling the charset in order to work around a bug of Windows Explorer in CJK environments  (was: A patch to control the charset in order to work around a bug of Windows Explorer in CJK environments)

> A patch to enable controlling the charset in order to work around a bug of Windows Explorer in CJK environments
> ---------------------------------------------------------------------------------------------------------------
>
>                 Key: FTPSERVER-465
>                 URL: https://issues.apache.org/jira/browse/FTPSERVER-465
>             Project: FtpServer
>          Issue Type: Improvement
>          Components: Core
>         Environment: any
>            Reporter: amtlib.dll
>              Labels: patch
>   Original Estimate: 5m
>  Remaining Estimate: 5m
>
> Index: org/apache/ftpserver/impl/FtpServerContext.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/impl/FtpServerContext.java	(revision )
> +++ org/apache/ftpserver/impl/FtpServerContext.java	(revision )
> @@ -19,6 +19,7 @@
>  
>  package org.apache.ftpserver.impl;
>  
> +import java.nio.charset.Charset;
>  import java.util.Map;
>  import java.util.concurrent.ThreadPoolExecutor;
>  
> @@ -70,4 +71,6 @@
>       * @return the thread pool executor for this context.
>       */
>      ThreadPoolExecutor getThreadPoolExecutor();
> +    
> +    Charset getCharset();
>  }
> Index: org/apache/ftpserver/impl/IODataConnection.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/impl/IODataConnection.java	(revision )
> +++ org/apache/ftpserver/impl/IODataConnection.java	(revision )
> @@ -27,6 +27,7 @@
>  import java.io.OutputStreamWriter;
>  import java.io.Writer;
>  import java.net.Socket;
> +import java.nio.charset.Charset;
>  import java.util.zip.DeflaterOutputStream;
>  import java.util.zip.InflaterInputStream;
>  
> @@ -171,18 +172,18 @@
>       * org.apache.ftpserver.FtpDataConnection2#transferToClient(java.lang.String
>       * )
>       */
> -    public final void transferToClient(FtpSession session, final String str)
> +    public final void transferToClient(FtpSession session, final String str, final Charset charset)
>              throws IOException {
>          OutputStream out = getDataOutputStream();
>          Writer writer = null;
>          try {
> -            writer = new OutputStreamWriter(out, "UTF-8");
> +            writer = new OutputStreamWriter(out, charset);
>              writer.write(str);
>  
>              // update session
>              if (session instanceof DefaultFtpSession) {
>                  ((DefaultFtpSession) session).increaseWrittenDataBytes(str
> -                        .getBytes("UTF-8").length);
> +                        .getBytes(charset).length);
>              }
>          } finally {
>              if (writer != null) {
> Index: org/apache/ftpserver/impl/DefaultFtpServerContext.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/impl/DefaultFtpServerContext.java	(revision )
> +++ org/apache/ftpserver/impl/DefaultFtpServerContext.java	(revision )
> @@ -19,6 +19,7 @@
>  
>  package org.apache.ftpserver.impl;
>  
> +import java.nio.charset.Charset;
>  import java.util.ArrayList;
>  import java.util.HashMap;
>  import java.util.List;
> @@ -278,5 +279,16 @@
>              threadPoolExecutor = new OrderedThreadPoolExecutor(maxThreads);
>          }
>          return threadPoolExecutor;
> +    }
> +
> +    private Charset charset = Charset.forName("UTF-8");
> +
> +    public void setCharset(Charset charset) {
> +        this.charset = charset;
> +    }
> +
> +    @Override
> +    public Charset getCharset() {
> +        return charset;
>      }
>  }
> Index: org/apache/ftpserver/ftplet/DataConnection.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/ftplet/DataConnection.java	(revision )
> +++ org/apache/ftpserver/ftplet/DataConnection.java	(revision )
> @@ -22,6 +22,7 @@
>  import java.io.IOException;
>  import java.io.InputStream;
>  import java.io.OutputStream;
> +import java.nio.charset.Charset;
>  
>  /**
>   *
> @@ -59,6 +60,6 @@
>       *            The string to transfer
>       * @throws IOException
>       */
> -    void transferToClient(FtpSession session, String str) throws IOException;
> +    void transferToClient(FtpSession session, String str, Charset charset) throws IOException;
>  
>  }
> \ No newline at end of file
> Index: org/apache/ftpserver/command/impl/LIST.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/command/impl/LIST.java	(revision )
> +++ org/apache/ftpserver/command/impl/LIST.java	(revision )
> @@ -126,7 +126,7 @@
>              try {
>                  dataConnection.transferToClient(session.getFtpletSession(), directoryLister.listFiles(
>                          parsedArg, session.getFileSystemView(),
> -                        LIST_FILE_FORMATER));
> +                        LIST_FILE_FORMATER), context.getCharset());
>              } catch (SocketException ex) {
>                  LOG.debug("Socket exception during list transfer", ex);
>                  failure = true;
> Index: org/apache/ftpserver/command/impl/MLSD.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/command/impl/MLSD.java	(revision )
> +++ org/apache/ftpserver/command/impl/MLSD.java	(revision )
> @@ -112,7 +112,7 @@
>                          .getAttribute("MLST.types"));
>  
>                  dataConnection.transferToClient(session.getFtpletSession(), directoryLister.listFiles(
> -                        parsedArg, session.getFileSystemView(), formater));
> +                        parsedArg, session.getFileSystemView(), formater), context.getCharset());
>              } catch (SocketException ex) {
>                  LOG.debug("Socket exception during data transfer", ex);
>                  failure = true;
> Index: org/apache/ftpserver/command/impl/NLST.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/command/impl/NLST.java	(revision )
> +++ org/apache/ftpserver/command/impl/NLST.java	(revision )
> @@ -121,7 +121,7 @@
>                  }
>  
>                  dataConnection.transferToClient(session.getFtpletSession(), directoryLister.listFiles(
> -                        parsedArg, session.getFileSystemView(), formater));
> +                        parsedArg, session.getFileSystemView(), formater), context.getCharset());
>              } catch (SocketException ex) {
>                  LOG.debug("Socket exception during data transfer", ex);
>                  failure = true;
> Index: org/apache/ftpserver/command/impl/OPTS_UTF8.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/command/impl/OPTS_UTF8.java	(revision )
> +++ org/apache/ftpserver/command/impl/OPTS_UTF8.java	(revision )
> @@ -20,6 +20,7 @@
>  package org.apache.ftpserver.command.impl;
>  
>  import java.io.IOException;
> +import java.nio.charset.Charset;
>  
>  import org.apache.ftpserver.command.AbstractCommand;
>  import org.apache.ftpserver.ftplet.FtpException;
> @@ -50,8 +51,7 @@
>          // reset state
>          session.resetState();
>  
> -        // send default message
>          session.write(LocalizedFtpReply.translate(session, request, context,
> -                FtpReply.REPLY_200_COMMAND_OKAY, "OPTS.UTF8", null));
> +                context.getCharset().contains(Charset.forName("UTF-8")) ? FtpReply.REPLY_200_COMMAND_OKAY : FtpReply.REPLY_502_COMMAND_NOT_IMPLEMENTED, "OPTS.UTF8", null));
>      }
>  }
> Index: org/apache/ftpserver/listener/nio/NioListener.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/listener/nio/NioListener.java	(revision )
> +++ org/apache/ftpserver/listener/nio/NioListener.java	(revision )
> @@ -146,7 +146,7 @@
>              acceptor.getFilterChain().addLast("threadPool",
>                      new ExecutorFilter(context.getThreadPoolExecutor()));
>              acceptor.getFilterChain().addLast("codec",
> -                    new ProtocolCodecFilter(new FtpServerProtocolCodecFactory()));
> +                    new ProtocolCodecFilter(new FtpServerProtocolCodecFactory(context.getCharset())));
>              acceptor.getFilterChain().addLast("mdcFilter2", mdcFilter);
>              acceptor.getFilterChain().addLast("logger", new FtpLoggingFilter());
>      
> Index: org/apache/ftpserver/listener/nio/FtpResponseEncoder.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/listener/nio/FtpResponseEncoder.java	(revision )
> +++ org/apache/ftpserver/listener/nio/FtpResponseEncoder.java	(revision )
> @@ -37,16 +37,19 @@
>   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
>   */
>  public class FtpResponseEncoder extends ProtocolEncoderAdapter {
> -    private static final CharsetEncoder ENCODER = Charset.forName("UTF-8")
> -            .newEncoder();
> +    private final CharsetEncoder encoder;
>  
> +    public FtpResponseEncoder(Charset charset) {
> +        this.encoder = charset.newEncoder();
> +    }
> +
>      public void encode(IoSession session, Object message,
>              ProtocolEncoderOutput out) throws Exception {
>          String value = message.toString();
>  
>          IoBuffer buf = IoBuffer.allocate(value.length()).setAutoExpand(true);
>  
> -        buf.putString(value, ENCODER);
> +        buf.putString(value, encoder);
>  
>          buf.flip();
>          out.write(buf);
> Index: org/apache/ftpserver/listener/nio/FtpServerProtocolCodecFactory.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/listener/nio/FtpServerProtocolCodecFactory.java	(revision )
> +++ org/apache/ftpserver/listener/nio/FtpServerProtocolCodecFactory.java	(revision )
> @@ -35,10 +35,14 @@
>   * @author <a href="http://mina.apache.org">Apache MINA Project</a>
>   */
>  public class FtpServerProtocolCodecFactory implements ProtocolCodecFactory {
> -    private ProtocolDecoder decoder = new TextLineDecoder(Charset
> -            .forName("UTF-8"));
> +    private ProtocolDecoder decoder;
>  
> -    private ProtocolEncoder encoder = new FtpResponseEncoder();
> +    private ProtocolEncoder encoder;
> +
> +    public FtpServerProtocolCodecFactory(Charset charset) {
> +        decoder = new TextLineDecoder(charset);
> +        encoder = new FtpResponseEncoder(charset);
> +    }
>  
>      public ProtocolDecoder getDecoder(IoSession session) throws Exception {
>          return decoder;
> Index: org/apache/ftpserver/FtpServerFactory.java
> IDEA additional info:
> Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
> <+>UTF-8
> ===================================================================
> --- org/apache/ftpserver/FtpServerFactory.java	(revision )
> +++ org/apache/ftpserver/FtpServerFactory.java	(revision )
> @@ -19,6 +19,7 @@
>  
>  package org.apache.ftpserver;
>  
> +import java.nio.charset.Charset;
>  import java.util.LinkedHashMap;
>  import java.util.Map;
>  
> @@ -232,5 +233,13 @@
>       */
>      public void setConnectionConfig(final ConnectionConfig connectionConfig) {
>          serverContext.setConnectionConfig(connectionConfig);
> +    }
> +
> +    public void setCharset(Charset charset) {
> +        serverContext.setCharset(charset);
> +    }
> +
> +    public Charset getCharset() {
> +        return serverContext.getCharset();
>      }
>  }
> \ No newline at end of file



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)