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)