[ 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)