You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by no...@apache.org on 2012/02/05 14:39:45 UTC
svn commit: r1240727 -
/james/server/trunk/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
Author: norman
Date: Sun Feb 5 13:39:45 2012
New Revision: 1240727
URL: http://svn.apache.org/viewvc?rev=1240727&view=rev
Log:
ImapRequestFrameDecoder should handle big literals more efficient. See JAMES-1370
Modified:
james/server/trunk/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
Modified: james/server/trunk/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java
URL: http://svn.apache.org/viewvc/james/server/trunk/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java?rev=1240727&r1=1240726&r2=1240727&view=diff
==============================================================================
--- james/server/trunk/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java (original)
+++ james/server/trunk/protocols-imap4/src/main/java/org/apache/james/imapserver/netty/ImapRequestFrameDecoder.java Sun Feb 5 13:39:45 2012
@@ -37,6 +37,7 @@ import org.jboss.netty.buffer.ChannelBuf
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFutureListener;
+import org.jboss.netty.channel.ChannelHandler;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ChannelStateEvent;
import org.jboss.netty.handler.codec.frame.FrameDecoder;
@@ -54,7 +55,6 @@ public class ImapRequestFrameDecoder ext
private final static String WRITTEN_DATA = "WRITTEN_DATA";
private final static String OUTPUT_STREAM = "OUTPUT_STREAM";
-
public ImapRequestFrameDecoder(ImapDecoder decoder, int inMemorySizeLimit, int literalSizeLimit) {
this.decoder = decoder;
this.inMemorySizeLimit = inMemorySizeLimit;
@@ -173,6 +173,11 @@ public class ImapRequestFrameDecoder ext
if (size == -1) {
reader.consumeLine();
}
+
+ ChannelHandler handler = (ChannelHandler) attachment.remove(FRAMER);
+ if (handler != null) {
+ channel.getPipeline().addFirst(FRAMER, handler);
+ }
attachment.clear();
return message;
} catch (NettyImapRequestLineReader.NotEnoughDataException e) {
@@ -181,6 +186,11 @@ public class ImapRequestFrameDecoder ext
int neededData = e.getNeededSize();
// store the needed data size for later usage
attachment.put(NEEDED_DATA, neededData);
+
+
+ ChannelHandler handler = channel.getPipeline().remove(FRAMER);
+ attachment.put(FRAMER, handler);
+
buffer.resetReaderIndex();
return null;
}
@@ -194,4 +204,19 @@ public class ImapRequestFrameDecoder ext
}
}
+ @SuppressWarnings("unchecked")
+ @Override
+ protected ChannelBuffer createCumulationDynamicBuffer(ChannelHandlerContext ctx) {
+ if (inMemorySizeLimit > 0) {
+ return ChannelBuffers.dynamicBuffer(inMemorySizeLimit, ctx.getChannel().getConfig().getBufferFactory());
+ } else {
+ Map<String, Object> attachment = (Map<String, Object>) ctx.getAttachment();
+ int size = (Integer) attachment.get(NEEDED_DATA);
+ if (size > 0) {
+ return ChannelBuffers.dynamicBuffer(size, ctx.getChannel().getConfig().getBufferFactory());
+ }
+ return super.createCumulationDynamicBuffer(ctx);
+ }
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org