<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
	<id>tag:n2.nabble.com,2006:forum-685716</id>
	<title>Nabble - Netty Commit Logs</title>
	<updated>2009-11-07T02:00:41Z</updated>
	<link rel="self" type="application/atom+xml" href="http://n2.nabble.com/Netty-Commit-Logs-f685716.xml" />
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/Netty-Commit-Logs-f685716.html" />
	<subtitle type="html">Commit logs are archived here.
</subtitle>
	
<entry>
	<id>tag:n2.nabble.com,2006:post-3963612</id>
	<title>r1872 - in branches/httpPost/src/main/java/org/jboss/netty: channel and 13 other directories.</title>
	<published>2009-11-07T02:00:41Z</published>
	<updated>2009-11-07T02:00:41Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: fredbregier
&lt;br&gt;Date: 2009-11-07 05:00:41 -0500 (Sat, 07 Nov 2009)
&lt;br&gt;New Revision: 1872
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelDownstreamHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelEvent.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelHandlerContext.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelPipeline.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelState.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelUpstreamHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/util/HashedWheelTimer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java
&lt;br&gt;Log:
&lt;br&gt;Update to last version of trunk, notably HTTP codec and snoop example
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -19,6 +19,8 @@
&lt;br&gt;&amp;nbsp;import java.nio.ByteBuffer;
&lt;br&gt;&amp;nbsp;import java.nio.ByteOrder;
&lt;br&gt;&amp;nbsp;import java.nio.charset.UnsupportedCharsetException;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.List;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;@@ -338,16 +340,34 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer[] wrappedBuffers = new ChannelBuffer[arrays.length];
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; arrays.length; i ++) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wrappedBuffers[i] = wrappedBuffer(endianness, arrays[i]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Get the list of the component, while guessing the byte order.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; components = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(arrays.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (byte[] a: arrays) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a.length &amp;gt; 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.add(wrappedBuffer(endianness, a));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return wrappedBuffer(wrappedBuffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return compositeBuffer(endianness, components);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static ChannelBuffer compositeBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder endianness, List&amp;lt;ChannelBuffer&amp;gt; components) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (components.size()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return components.get(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(endianness, components);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new composite buffer which wraps the readable bytes of the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * specified buffers without copying them. &amp;nbsp;A modification on the content
&lt;br&gt;@@ -367,11 +387,33 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ChannelBuffer b: buffers) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (b.readable()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(buffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder order = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; components = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(buffers.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ChannelBuffer c: buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (order != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!order.equals(c.order())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;inconsistent byte order&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = c.order();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c instanceof CompositeChannelBuffer) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Expand nested composition.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.addAll(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((CompositeChannelBuffer) c).decompose(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c.readerIndex(), c.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// An ordinary buffer (non-composite)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.add(c.slice());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return compositeBuffer(order, components);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -395,11 +437,25 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer[] wrappedBuffers = new ChannelBuffer[buffers.length];
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; buffers.length; i ++) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wrappedBuffers[i] = wrappedBuffer(buffers[i]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder order = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; components = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(buffers.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ByteBuffer b: buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (b == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (b.hasRemaining()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (order != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!order.equals(b.order())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;inconsistent byte order&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = b.order();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.add(wrappedBuffer(b));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return wrappedBuffer(wrappedBuffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return compositeBuffer(order, components);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -48,44 +48,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int[] indices;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int lastAccessedComponentId;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public CompositeChannelBuffer(ChannelBuffer... buffers) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (buffers.length == 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;buffers should not be empty.&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Get the list of the component, while guessing the byte order.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder expectedEndianness = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; newComponents = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(buffers.length);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ChannelBuffer c: buffers) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c.readableBytes() &amp;gt; 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedEndianness = c.order();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c instanceof CompositeChannelBuffer) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Expand nested composition.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newComponents.addAll(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((CompositeChannelBuffer) c).slice0(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c.readerIndex(), c.readableBytes()));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// An ordinary buffer (non-composite)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newComponents.add(c.slice());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (c.capacity() != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedEndianness = c.order();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (expectedEndianness == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;buffers have only empty buffers.&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = expectedEndianness;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setComponents(newComponents);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public CompositeChannelBuffer(ByteOrder endianness, List&amp;lt;ChannelBuffer&amp;gt; buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = endianness;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setComponents(buffers);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Same with {@link #slice(int, int)} except that this method returns a list.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;- &amp;nbsp; private List&amp;lt;ChannelBuffer&amp;gt; slice0(int index, int length) {
&lt;br&gt;+ &amp;nbsp; public List&amp;lt;ChannelBuffer&amp;gt; decompose(int index, int length) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (length == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Collections.emptyList();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;@@ -556,9 +527,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; listBuffer = slice0(index, length);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer[] buffers = listBuffer.toArray(new ChannelBuffer[listBuffer.size()]);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(buffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; components = decompose(index, length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (components.size()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return components.get(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(order(), components);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ByteBuffer toByteBuffer(int index, int length) {
&lt;br&gt;@@ -667,7 +644,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int localWriterIndex = this.writerIndex();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int bytesToMove = capacity() - localReaderIndex;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; list = slice0(localReaderIndex, bytesToMove);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; list = decompose(localReaderIndex, bytesToMove);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Add a new buffer so that the capacity of this composite buffer does
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// not decrease due to the discarded components.
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -37,6 +37,10 @@
&lt;br&gt;&amp;nbsp;public class AdaptiveReceiveBufferSizePredictor implements
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int DEFAULT_MINIMUM = 64;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int DEFAULT_INITIAL = 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int DEFAULT_MAXIMUM = 65536;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int INDEX_INCREMENT = 4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int INDEX_DECREMENT = 1;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -94,10 +98,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new Error(&amp;quot;shouldn't reach here; please file a bug report.&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final int DEFAULT_MINIMUM = 64;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final int DEFAULT_INITIAL = 1024;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final int DEFAULT_MAXIMUM = 65536;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int minIndex;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxIndex;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int index;
&lt;br&gt;&lt;br&gt;Added: branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,72 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * The {@link ReceiveBufferSizePredictorFactory} that creates a new
&lt;br&gt;+ * {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ *
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public class AdaptiveReceiveBufferSizePredictorFactory implements
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int minimum;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int initial;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int maximum;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new factory with the default parameters. &amp;nbsp;With the default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * parameters, the expected buffer size starts from {@code 1024}, does not
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * go down below {@code 64}, and does not go up above {@code 65536}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AdaptiveReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(AdaptiveReceiveBufferSizePredictor.DEFAULT_MINIMUM,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AdaptiveReceiveBufferSizePredictor.DEFAULT_INITIAL,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AdaptiveReceiveBufferSizePredictor.DEFAULT_MAXIMUM);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new factory with the specified parameters.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param minimum &amp;nbsp;the inclusive lower bound of the expected buffer size
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param initial &amp;nbsp;the initial buffer size when no feed back was received
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param maximum &amp;nbsp;the inclusive upper bound of the expected buffer size
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AdaptiveReceiveBufferSizePredictorFactory(int minimum, int initial, int maximum) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (minimum &amp;lt;= 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;minimum: &amp;quot; + minimum);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (initial &amp;lt; minimum) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;initial: &amp;quot; + initial);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (maximum &amp;lt; initial) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;maximum: &amp;quot; + maximum);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.minimum = minimum;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.initial = initial;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.maximum = maximum;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getPredictor() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new AdaptiveReceiveBufferSizePredictor(minimum, initial, maximum);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httpPost/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelDownstreamHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelDownstreamHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelDownstreamHandler.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -15,72 +15,21 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import java.net.SocketAddress;
&lt;br&gt;-
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * Handles or intercepts a downstream {@link ChannelEvent}, and sends a
&lt;br&gt;&amp;nbsp; * {@link ChannelEvent} to the next handler in a {@link ChannelPipeline}.
&lt;br&gt;- *
&lt;br&gt;- * &amp;lt;h3&amp;gt;Downstream events&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * A downstream event is an event which is supposed to be processed by
&lt;br&gt;- * a series of downstream handlers in the {@link ChannelPipeline}. &amp;nbsp;It is often
&lt;br&gt;- * an I/O request made by a user application.
&lt;br&gt;- * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * The most common use case of this interface is to intercept an I/O request
&lt;br&gt;- * such as {@link Channel#write(Object)} and {@link Channel#close()}. &amp;nbsp;The
&lt;br&gt;- * received {@link ChannelEvent} object is interpreted as described in the
&lt;br&gt;- * following table:
&lt;br&gt;+ * such as {@link Channel#write(Object)} and {@link Channel#close()}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * &amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot;&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;th&amp;gt;Event name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Event type and condition&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Meaning&amp;lt;/th&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;write&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link MessageEvent}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Send a message to the {@link Channel}.&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;bind&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;Bind the {@link Channel} to the specified local address.&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;unbind&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;Unbind the {@link Channel} from the current local address.&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;connect&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;Connect the {@link Channel} to the specified remote address.&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;disconnect&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;Disconnect the {@link Channel} from the current remote address.&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;close&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#OPEN OPEN}, value = {@code false})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;Close the {@link Channel}.&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;/table&amp;gt;
&lt;br&gt;+ * &amp;lt;h3&amp;gt;{@link SimpleChannelDownstreamHandler}&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * Other event types and conditions which were not addressed here will be
&lt;br&gt;- * ignored and discarded. &amp;nbsp;Please note that there's no {@code &amp;quot;open&amp;quot;} in the
&lt;br&gt;- * table. &amp;nbsp;It is because a {@link Channel} is always open when it is created
&lt;br&gt;- * by a {@link ChannelFactory}.
&lt;br&gt;+ * In most cases, you will get to use a {@link SimpleChannelDownstreamHandler}
&lt;br&gt;+ * to implement a downstream handler because it provides an individual handler
&lt;br&gt;+ * method for each event type. &amp;nbsp;You might want to implement this interface
&lt;br&gt;+ * directly though if you want to handle various types of events in more
&lt;br&gt;+ * generic way.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * &amp;lt;h4&amp;gt;Additional resources worth reading&amp;lt;/h4&amp;gt;
&lt;br&gt;- * &amp;lt;p&amp;gt;
&lt;br&gt;- * You might want to refer to {@link ChannelUpstreamHandler} to see how a
&lt;br&gt;- * {@link ChannelEvent} is interpreted when going upstream. &amp;nbsp;Also, please refer
&lt;br&gt;- * to the {@link ChannelEvent} and {@link ChannelPipeline} documentation to find
&lt;br&gt;- * out what an upstream event and a downstream event are, what fundamental
&lt;br&gt;- * differences they have, and how they flow in a pipeline.
&lt;br&gt;- *
&lt;br&gt;&amp;nbsp; * &amp;lt;h3&amp;gt;Firing an event to the next handler&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * You can forward the received event downstream or upstream. &amp;nbsp;In most cases,
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelEvent.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelEvent.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelEvent.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -15,13 +15,19 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+import java.io.InputStream;
&lt;br&gt;+import java.io.OutputStream;
&lt;br&gt;+import java.net.Socket;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * An I/O event or I/O request associated with a {@link Channel}.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * A {@link ChannelEvent} is supposed to be handled by the
&lt;br&gt;- * {@link ChannelPipeline} which is attached to the {@link Channel} that
&lt;br&gt;- * the event belongs to. &amp;nbsp;Once an event is sent to a {@link ChannelPipeline},
&lt;br&gt;- * it is handled by a list of {@link ChannelHandler}s.
&lt;br&gt;+ * A {@link ChannelEvent} is handled by a series of {@link ChannelHandler}s in
&lt;br&gt;+ * a {@link ChannelPipeline}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * &amp;lt;h3&amp;gt;Upstream events and downstream events, and their interpretation&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;@@ -33,23 +39,143 @@
&lt;br&gt;&amp;nbsp; * downstream event and say &amp;lt;strong&amp;gt;&amp;quot;an event goes downstream.&amp;quot;&amp;lt;/strong&amp;gt;
&lt;br&gt;&amp;nbsp; * (Please refer to the diagram in {@link ChannelPipeline} for more explanation.)
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * A {@link ChannelEvent} is interpreted differently by a {@link ChannelHandler}
&lt;br&gt;- * depending on whether the event is an upstream event or a downstream event.
&lt;br&gt;- * An upstream event represents the notification of what happened in the past.
&lt;br&gt;- * By contrast, a downstream event represents the request of what should happen
&lt;br&gt;- * in the future. &amp;nbsp;For example, a {@link MessageEvent} represents the
&lt;br&gt;- * notification of a received message when it goes upstream, while it
&lt;br&gt;- * represents the request of writing a message when it goes downstream.
&lt;br&gt;+ * When your server receives a message from a client, the event associated with
&lt;br&gt;+ * the received message is an upstream event. &amp;nbsp;When your server sends a message
&lt;br&gt;+ * or reply to the client, the event associated with the write request is a
&lt;br&gt;+ * downstream event. &amp;nbsp;The same rule applies for the client side. &amp;nbsp;If your client
&lt;br&gt;+ * sent a request to the server, it means your client triggered a downstream
&lt;br&gt;+ * event. &amp;nbsp;If your client received a response from the server, it means
&lt;br&gt;+ * your client will be notified with an upstream event. &amp;nbsp;Upstream events are
&lt;br&gt;+ * often the result of inbound operations such as {@link InputStream#read(byte[])},
&lt;br&gt;+ * and downstream events are the request for outbound operations such as
&lt;br&gt;+ * {@link OutputStream#write(byte[])}, {@link Socket#connect(SocketAddress)},
&lt;br&gt;+ * and {@link Socket#close()}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * &amp;lt;h4&amp;gt;Additional resources worth reading&amp;lt;/h4&amp;gt;
&lt;br&gt;+ * &amp;lt;h4&amp;gt;Upstream events&amp;lt;/h4&amp;gt;
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot;&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;th&amp;gt;Event name&amp;lt;/th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Event type and condition&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Meaning&amp;lt;/th&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;messageReceived&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link MessageEvent}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a message object (e.g. {@link ChannelBuffer}) was received from a remote peer&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;exceptionCaught&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ExceptionEvent}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;an exception was raised by an I/O thread or a {@link ChannelHandler}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelOpen&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#OPEN OPEN}, value = {@code true})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel} is open, but not bound nor connected&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelClosed&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#OPEN OPEN}, value = {@code false})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel} was closed and all its related resources were released&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelBound&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel} is open and bound to a local address, but not connected&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelUnbound&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel} was unbound from the current local address&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelConnected&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel} is open, bound to a local address, and connected to a remote address&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;writeComplete&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link WriteCompletionEvent}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;something has been written to a remote peer&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelDisconnected&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel} was disconnected from its remote peer&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;channelInterestChanged&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#INTEREST_OPS INTEREST_OPS}, no value)&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a {@link Channel}'s {@link Channel#getInterestOps() interestOps} was changed&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * Please refer to the documentation of {@link ChannelHandler} and its sub-types
&lt;br&gt;- * ({@link ChannelUpstreamHandler} for upstream events and
&lt;br&gt;- * &amp;nbsp;{@link ChannelDownstreamHandler} for downstream events) to find out how
&lt;br&gt;- * a {@link ChannelEvent} is interpreted depending on the type of the handler
&lt;br&gt;- * more in detail. &amp;nbsp;Also, please refer to the {@link ChannelPipeline}
&lt;br&gt;- * documentation to find out how an event flows in a pipeline.
&lt;br&gt;+ * These two additional event types are used only for a parent channel which
&lt;br&gt;+ * can have a child channel (e.g. {@link ServerSocketChannel}).
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * &amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot;&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;th&amp;gt;Event name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Event type and condition&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Meaning&amp;lt;/th&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;childChannelOpen&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChildChannelStateEvent}&amp;lt;br/&amp;gt;({@code childChannel.isOpen() = true})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a child {@link Channel} was open (e.g. a server channel accepted a connection.)&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;childChannelClosed&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChildChannelStateEvent}&amp;lt;br/&amp;gt;({@code childChannel.isOpen() = false})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;a child {@link Channel} was closed (e.g. the accepted connection was closed.)&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;+ * &amp;lt;h4&amp;gt;Downstream events&amp;lt;/h4&amp;gt;
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot;&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;th&amp;gt;Event name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Event type and condition&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Meaning&amp;lt;/th&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;write&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link MessageEvent}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Send a message to the {@link Channel}.&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;bind&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;Bind the {@link Channel} to the specified local address.&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;unbind&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;Unbind the {@link Channel} from the current local address.&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;connect&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;Connect the {@link Channel} to the specified remote address.&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;disconnect&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;Disconnect the {@link Channel} from the current remote address.&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;close&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#OPEN OPEN}, value = {@code false})&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;Close the {@link Channel}.&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;/table&amp;gt;
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * Other event types and conditions which were not addressed here will be
&lt;br&gt;+ * ignored and discarded. &amp;nbsp;Please note that there's no {@code &amp;quot;open&amp;quot;} in the
&lt;br&gt;+ * table. &amp;nbsp;It is because a {@link Channel} is always open when it is created
&lt;br&gt;+ * by a {@link ChannelFactory}.
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;lt;h3&amp;gt;Additional resources worth reading&amp;lt;/h3&amp;gt;
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * Please refer to the {@link ChannelHandler} and {@link ChannelPipeline}
&lt;br&gt;+ * documentation to find out how an event flows in a pipeline and how to handle
&lt;br&gt;+ * the event in your application.
&lt;br&gt;+ *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelHandlerContext.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelHandlerContext.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelHandlerContext.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -81,8 +81,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * Please refer to the {@link ChannelHandler}, {@link ChannelEvent}, and
&lt;br&gt;&amp;nbsp; * {@link ChannelPipeline} to find out what a upstream event and a downstream
&lt;br&gt;- * event are, what fundamental differences they have, and how they flow in a
&lt;br&gt;- * pipeline.
&lt;br&gt;+ * event are, what fundamental differences they have, how they flow in a
&lt;br&gt;+ * pipeline, &amp;nbsp;and how to handle the event in your application.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelPipeline.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelPipeline.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelPipeline.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -15,6 +15,8 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+import java.io.InputStream;
&lt;br&gt;+import java.io.OutputStream;
&lt;br&gt;&amp;nbsp;import java.util.Map;
&lt;br&gt;&amp;nbsp;import java.util.NoSuchElementException;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -87,20 +89,26 @@
&lt;br&gt;&amp;nbsp; * &amp;nbsp;+-------------+--------------------------+---------------+
&lt;br&gt;&amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \|/
&lt;br&gt;&amp;nbsp; * &amp;nbsp;+-------------+--------------------------+---------------+
&lt;br&gt;+ * &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |
&lt;br&gt;+ * &amp;nbsp;| &amp;nbsp; &amp;nbsp; [ Socket.read() ] &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[ Socket.write() ] &amp;nbsp; &amp;nbsp; &amp;nbsp;|
&lt;br&gt;+ * &amp;nbsp;| &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;|
&lt;br&gt;&amp;nbsp; * &amp;nbsp;| &amp;nbsp;Netty Internal I/O Threads (Transport Implementation) |
&lt;br&gt;&amp;nbsp; * &amp;nbsp;+--------------------------------------------------------+
&lt;br&gt;&amp;nbsp; * &amp;lt;/pre&amp;gt;
&lt;br&gt;&amp;nbsp; * An upstream event is handled by the upstream handlers in the bottom-up
&lt;br&gt;&amp;nbsp; * direction as shown on the left side of the diagram. &amp;nbsp;An upstream handler
&lt;br&gt;- * usually handles the inbound data received from the I/O thread on the bottom
&lt;br&gt;- * of the diagram. &amp;nbsp;If an upstream event goes beyond the top upstream handler,
&lt;br&gt;- * it is discarded silently.
&lt;br&gt;+ * usually handles the inbound data generated by the I/O thread on the bottom
&lt;br&gt;+ * of the diagram. &amp;nbsp;The inbound data is often read from a remote peer via the
&lt;br&gt;+ * actual input operation such as {@link InputStream#read(byte[])}.
&lt;br&gt;+ * If an upstream event goes beyond the top upstream handler, it is discarded
&lt;br&gt;+ * silently.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * A downstream event is handled by the downstream handler in the top-down
&lt;br&gt;&amp;nbsp; * direction as shown on the right side of the diagram. &amp;nbsp;A downstream handler
&lt;br&gt;&amp;nbsp; * usually generates or transforms the outbound traffic such as write requests.
&lt;br&gt;&amp;nbsp; * If a downstream event goes beyond the bottom downstream handler, it is
&lt;br&gt;- * handled by an I/O thread associated with the {@link Channel}.
&lt;br&gt;+ * handled by an I/O thread associated with the {@link Channel}. The I/O thread
&lt;br&gt;+ * often performs the actual output operation such as {@link OutputStream#write(byte[])}.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * For example, let us assume that we created the following pipeline:
&lt;br&gt;&amp;nbsp; * &amp;lt;pre&amp;gt;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelState.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelState.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelState.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -72,10 +72,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * To see how a {@link ChannelEvent} is interpreted further, please refer to
&lt;br&gt;- * {@link ChannelUpstreamHandler} and {@link ChannelDownstreamHandler}.
&lt;br&gt;+ * To see how an event is interpreted further, please refer to {@link ChannelEvent}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelUpstreamHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelUpstreamHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelUpstreamHandler.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -15,11 +15,8 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import java.net.SocketAddress;
&lt;br&gt;&amp;nbsp;import java.util.concurrent.Executor;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;-import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.execution.ExecutionHandler;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -27,100 +24,14 @@
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * Handles or intercepts an upstream {@link ChannelEvent}, and sends a
&lt;br&gt;&amp;nbsp; * {@link ChannelEvent} to the next handler in a {@link ChannelPipeline}.
&lt;br&gt;- *
&lt;br&gt;- * &amp;lt;h3&amp;gt;Upstream events&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * An upstream event is an event which is supposed to be processed by
&lt;br&gt;- * a series of upstream handlers in the the {@link ChannelPipeline}.
&lt;br&gt;- * The upstream events are generated by an I/O thread, and they have the
&lt;br&gt;- * following meaning:
&lt;br&gt;- * &amp;lt;p&amp;gt;
&lt;br&gt;- * &amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot;&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;th&amp;gt;Event name&amp;lt;/th&amp;gt;&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Event type and condition&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Meaning&amp;lt;/th&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;messageReceived&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link MessageEvent}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a message object (e.g. {@link ChannelBuffer}) was received from a remote peer&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;exceptionCaught&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ExceptionEvent}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;an exception was raised by an I/O thread or a {@link ChannelHandler}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelOpen&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#OPEN OPEN}, value = {@code true})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel} is open, but not bound nor connected&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelClosed&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#OPEN OPEN}, value = {@code false})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel} was closed and all its related resources were released&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelBound&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel} is open and bound to a local address, but not connected&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelUnbound&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#BOUND BOUND}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel} was unbound from the current local address&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelConnected&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@link SocketAddress})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel} is open, bound to a local address, and connected to a remote address&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;writeComplete&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link WriteCompletionEvent}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;something has been written to a remote peer&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelDisconnected&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#CONNECTED CONNECTED}, value = {@code null})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel} was disconnected from its remote peer&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;channelInterestChanged&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChannelStateEvent}&amp;lt;br/&amp;gt;(state = {@link ChannelState#INTEREST_OPS INTEREST_OPS}, no value)&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a {@link Channel}'s {@link Channel#getInterestOps() interestOps} was changed&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;/table&amp;gt;
&lt;br&gt;- * &amp;lt;p&amp;gt;
&lt;br&gt;- * These two additional event types are used only for a parent channel which
&lt;br&gt;- * can have a child channel (e.g. {@link ServerSocketChannel}).
&lt;br&gt;- * &amp;lt;p&amp;gt;
&lt;br&gt;- * &amp;lt;table border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot;&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;th&amp;gt;Event name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Event type and condition&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Meaning&amp;lt;/th&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;childChannelOpen&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChildChannelStateEvent}&amp;lt;br/&amp;gt;({@code childChannel.isOpen() = true})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a child {@link Channel} was open (e.g. a server channel accepted a connection.)&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;childChannelClosed&amp;quot;}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@link ChildChannelStateEvent}&amp;lt;br/&amp;gt;({@code childChannel.isOpen() = false})&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;a child {@link Channel} was closed (e.g. the accepted connection was closed.)&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;
&lt;br&gt;- * &amp;lt;/table&amp;gt;
&lt;br&gt;+ * The most common use case of this interface is to intercept an I/O event
&lt;br&gt;+ * generated by I/O workers to transform the received messages or execute
&lt;br&gt;+ * the relevant business logic.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * &amp;lt;h4&amp;gt;Additional resources worth reading&amp;lt;/h4&amp;gt;
&lt;br&gt;+ * &amp;lt;h3&amp;gt;{@link SimpleChannelUpstreamHandler}&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * You might want to refer to {@link ChannelDownstreamHandler} to see how a
&lt;br&gt;- * {@link ChannelEvent} is interpreted when going downstream. &amp;nbsp;Also, please
&lt;br&gt;- * refer to the {@link ChannelEvent} and {@link ChannelPipeline} documentation
&lt;br&gt;- * to find out what an upstream event and a downstream event are, what
&lt;br&gt;- * fundamental differences they have, and how they flow in a pipeline.
&lt;br&gt;- *
&lt;br&gt;- * &amp;lt;h3&amp;gt;{@link SimpleChannelHandler}&amp;lt;/h3&amp;gt;
&lt;br&gt;- * &amp;lt;p&amp;gt;
&lt;br&gt;- * In most cases, you will get to use a {@link SimpleChannelHandler} to
&lt;br&gt;+ * In most cases, you will get to use a {@link SimpleChannelUpstreamHandler} to
&lt;br&gt;&amp;nbsp; * implement an upstream handler because it provides an individual handler
&lt;br&gt;&amp;nbsp; * method for each event type. &amp;nbsp;You might want to implement this interface
&lt;br&gt;&amp;nbsp; * directly though if you want to handle various types of events in more
&lt;br&gt;&lt;br&gt;Added: branches/httpPost/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,44 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * The {@link ReceiveBufferSizePredictorFactory} that returns a
&lt;br&gt;+ * {@link FixedReceiveBufferSizePredictor} with the pre-defined configuration.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ *
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public class FixedReceiveBufferSizePredictorFactory implements
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ReceiveBufferSizePredictor predictor;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new factory that returns a {@link FixedReceiveBufferSizePredictor}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * which always returns the same prediction of the specified buffer size.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FixedReceiveBufferSizePredictorFactory(int bufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;predictor = new FixedReceiveBufferSizePredictor(bufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getPredictor() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httpPost/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Added: branches/httpPost/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,32 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Creates a new {@link ReceiveBufferSizePredictor}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=11&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ *
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public interface ReceiveBufferSizePredictorFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns a newly created {@link ReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getPredictor() throws Exception;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httpPost/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -28,7 +28,7 @@
&lt;br&gt;&amp;nbsp; * or downstream event into more meaningful sub-type event and calls an
&lt;br&gt;&amp;nbsp; * appropriate handler method with the down-cast event. &amp;nbsp;For an upstream
&lt;br&gt;&amp;nbsp; * event, the names of the methods are identical to the upstream event names,
&lt;br&gt;- * as introduced in the {@link ChannelUpstreamHandler} documentation. &amp;nbsp;For a
&lt;br&gt;+ * as introduced in the {@link ChannelEvent} documentation. &amp;nbsp;For a
&lt;br&gt;&amp;nbsp; * downstream event, the names of the methods starts with the name of the
&lt;br&gt;&amp;nbsp; * operation and ends with {@code &amp;quot;Requested&amp;quot;}
&lt;br&gt;&amp;nbsp; * (e.g. {@link #writeRequested(ChannelHandlerContext, MessageEvent) writeRequested}.)
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -25,8 +25,7 @@
&lt;br&gt;&amp;nbsp; * for each event type. &amp;nbsp;This handler down-casts the received upstream event
&lt;br&gt;&amp;nbsp; * into more meaningful sub-type event and calls an appropriate handler method
&lt;br&gt;&amp;nbsp; * with the down-cast event. &amp;nbsp;The names of the methods are identical to the
&lt;br&gt;- * upstream event names, as introduced in the {@link ChannelUpstreamHandler}
&lt;br&gt;- * documentation.
&lt;br&gt;+ * upstream event names, as introduced in the {@link ChannelEvent} documentation.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * Please use {@link SimpleChannelHandler} if you need to implement both
&lt;br&gt;&amp;nbsp; * {@link ChannelUpstreamHandler} and {@link ChannelDownstreamHandler}.
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -21,7 +21,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.FixedReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * A {@link ChannelConfig} for a {@link DatagramChannel}.
&lt;br&gt;@@ -49,6 +51,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictorFactory&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;sendBufferSize&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setSendBufferSize(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;timeToLive&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setTimeToLive(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;@@ -176,4 +180,24 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link FixedReceiveBufferSizePredictor}(768)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictorFactory} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link FixedReceiveBufferSizePredictorFactory}(768)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link FixedReceiveBufferSizePredictorFactory}(768)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -24,8 +24,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelException;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.DefaultChannelConfig;
&lt;br&gt;-import org.jboss.netty.channel.FixedReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.util.internal.ConversionUtil;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;@@ -40,9 +41,12 @@
&lt;br&gt;&amp;nbsp;public class DefaultDatagramChannelConfig extends DefaultChannelConfig
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;implements DatagramChannelConfig {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final ReceiveBufferSizePredictorFactory DEFAULT_PREDICTOR_FACTORY =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(768);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final DatagramSocket socket;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictor(768);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictorFactory predictorFactory = DEFAULT_PREDICTOR_FACTORY;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new instance.
&lt;br&gt;@@ -263,13 +267,36 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getReceiveBufferSizePredictor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor = this.predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor = getReceiveBufferSizePredictorFactory().getPredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ChannelException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Failed to create a new &amp;quot; +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor.class.getSimpleName() + '.',
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictor(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictor&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictorFactory == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictorFactory&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictorFactory = predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -222,7 +222,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private final class OutboundConnectionHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final class OutboundConnectionHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final ServletOutputStream out;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -18,8 +18,10 @@
&lt;br&gt;&amp;nbsp;import java.net.Socket;
&lt;br&gt;&amp;nbsp;import java.util.Map;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelException;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DefaultSocketChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLoggerFactory;
&lt;br&gt;@@ -40,10 +42,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InternalLogger logger =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InternalLoggerFactory.getInstance(DefaultNioSocketChannelConfig.class);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final ReceiveBufferSizePredictorFactory DEFAULT_PREDICTOR_FACTORY =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferHighWaterMark = 64 * 1024;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferLowWaterMark &amp;nbsp;= 32 * 1024;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictorFactory predictorFactory = DEFAULT_PREDICTOR_FACTORY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeSpinCount = 16;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;DefaultNioSocketChannelConfig(Socket socket) {
&lt;br&gt;@@ -143,6 +148,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getReceiveBufferSizePredictor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor = this.predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor = getReceiveBufferSizePredictorFactory().getPredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ChannelException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Failed to create a new &amp;quot; +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor.class.getSimpleName() + '.',
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -154,6 +170,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictorFactory == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictorFactory&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictorFactory = predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public boolean isReadWriteFair() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.warn(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Detected an access to a deprecated configuration parameter: &amp;quot; +
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -18,10 +18,8 @@
&lt;br&gt;&amp;nbsp;import java.nio.ByteBuffer;
&lt;br&gt;&amp;nbsp;import java.nio.channels.WritableByteChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;-import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannelConfig;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -44,8 +42,6 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;writeSpinCount&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setWriteSpinCount(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=12&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -108,18 +104,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if the specified value is {@code 0} or less than {@code 0}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setWriteSpinCount(int writeSpinCount);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getReceiveBufferSizePredictor();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -125,6 +125,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Queue&amp;lt;Runnable&amp;gt; writeTaskQueue = new LinkedTransferQueue&amp;lt;Runnable&amp;gt;();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile int cancelledKeys; // should use AtomicInteger but we just need approximation
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sole constructor.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;@@ -216,7 +218,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int selectedKeyCount = selector.select(500);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.select(500);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 'wakenUp.compareAndSet(false, true)' is always evaluated
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// before calling 'selector.wakeup()' to reduce the wake-up
&lt;br&gt;@@ -250,13 +252,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.wakeup();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelledKeys = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processRegisterTaskQueue();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processWriteTaskQueue();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processSelectedKeys(selector.selectedKeys());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (selectedKeyCount &amp;gt; 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processSelectedKeys(selector.selectedKeys());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Exit the loop when there's nothing to handle (the registered
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// key set is empty.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// The shutdown flag is used to delay the shutdown of this
&lt;br&gt;@@ -308,7 +308,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Will go through all the {@link ChannelRegistionTask}s in the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * task queue and run them (registering them).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private void processRegisterTaskQueue() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void processRegisterTaskQueue() throws IOException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Runnable task = registerTaskQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (task == null) {
&lt;br&gt;@@ -316,13 +316,14 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;task.run();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cleanUpCancelledKeys();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Will go through all the WriteTasks and run them.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private void processWriteTaskQueue() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void processWriteTaskQueue() throws IOException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Runnable task = writeTaskQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (task == null) {
&lt;br&gt;@@ -330,16 +331,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;task.run();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cleanUpCancelledKeys();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static void processSelectedKeys(final Set&amp;lt;SelectionKey&amp;gt; selectedKeys) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void processSelectedKeys(final Set&amp;lt;SelectionKey&amp;gt; selectedKeys) throws IOException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (Iterator&amp;lt;SelectionKey&amp;gt; i = selectedKeys.iterator(); i.hasNext();) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SelectionKey k = i.next();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i.remove();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int readyOps = k.readyOps();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((readyOps &amp; SelectionKey.OP_READ) != 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((readyOps &amp; SelectionKey.OP_READ) != 0 || readyOps == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!read(k)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Connection already closed - no need to handle write.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;@@ -351,9 +353,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (CancelledKeyException e) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;close(k);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cleanUpCancelledKeys()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break; // Break the loop to avoid ConcurrentModificationException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean cleanUpCancelledKeys() throws IOException {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cancelledKeys &amp;gt;= NioWorker.CLEANUP_INTERVAL) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelledKeys = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.selectNow();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static void write(SelectionKey k) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;write((NioDatagramChannel) k.attachment(), false);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -654,6 +669,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SelectionKey key = channel.getDatagramChannel().keyFor(selector);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (key != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key.cancel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;worker.cancelledKeys ++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.getDatagramChannel().close();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -19,9 +19,11 @@
&lt;br&gt;&amp;nbsp;import java.nio.channels.WritableByteChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -46,6 +48,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictorFactory&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;readWriteFair&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReadWriteFair(boolean)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;@@ -113,18 +117,38 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getReceiveBufferSizePredictor();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictorFactory} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @deprecated This property has been replaced by the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@code writeBufferHighWaterMark} and {@code writeBufferLowWaterMark}.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -65,6 +65,8 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int CONSTRAINT_LEVEL = NioProviderMetadata.CONSTRAINT_LEVEL;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int CLEANUP_INTERVAL = 256; // XXX Hard-coded value, but won't need customization.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int bossId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int id;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Executor executor;
&lt;br&gt;@@ -76,6 +78,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Object startStopLock = new Object();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Queue&amp;lt;Runnable&amp;gt; registerTaskQueue = new LinkedTransferQueue&amp;lt;Runnable&amp;gt;();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Queue&amp;lt;Runnable&amp;gt; writeTaskQueue = new LinkedTransferQueue&amp;lt;Runnable&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile int cancelledKeys; // should use AtomicInteger but we just need approximation
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;NioWorker(int bossId, int id, Executor executor) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.bossId = bossId;
&lt;br&gt;@@ -155,7 +158,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int selectedKeyCount = selector.select(500);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.select(500);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 'wakenUp.compareAndSet(false, true)' is always evaluated
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// before calling 'selector.wakeup()' to reduce the wake-up
&lt;br&gt;@@ -189,13 +192,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.wakeup();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelledKeys = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processRegisterTaskQueue();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processWriteTaskQueue();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processSelectedKeys(selector.selectedKeys());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (selectedKeyCount &amp;gt; 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;processSelectedKeys(selector.selectedKeys());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Exit the loop when there's nothing to handle.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// The shutdown flag is used to delay the shutdown of this
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// loop to avoid excessive Selector creation when
&lt;br&gt;@@ -243,7 +244,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private void processRegisterTaskQueue() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void processRegisterTaskQueue() throws IOException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Runnable task = registerTaskQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (task == null) {
&lt;br&gt;@@ -251,10 +252,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;task.run();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cleanUpCancelledKeys();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private void processWriteTaskQueue() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void processWriteTaskQueue() throws IOException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Runnable task = writeTaskQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (task == null) {
&lt;br&gt;@@ -262,16 +264,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;task.run();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cleanUpCancelledKeys();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static void processSelectedKeys(Set&amp;lt;SelectionKey&amp;gt; selectedKeys) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void processSelectedKeys(Set&amp;lt;SelectionKey&amp;gt; selectedKeys) throws IOException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (Iterator&amp;lt;SelectionKey&amp;gt; i = selectedKeys.iterator(); i.hasNext();) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SelectionKey k = i.next();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;i.remove();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int readyOps = k.readyOps();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((readyOps &amp; SelectionKey.OP_READ) != 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((readyOps &amp; SelectionKey.OP_READ) != 0 || readyOps == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!read(k)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Connection already closed - no need to handle write.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&lt;br&gt;@@ -283,9 +286,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (CancelledKeyException e) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;close(k);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cleanUpCancelledKeys()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break; // break the loop to avoid ConcurrentModificationException
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean cleanUpCancelledKeys() throws IOException {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cancelledKeys &amp;gt;= CLEANUP_INTERVAL) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelledKeys = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.selectNow();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static boolean read(SelectionKey k) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ScatteringByteChannel ch = (ScatteringByteChannel) k.channel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioSocketChannel channel = (NioSocketChannel) k.attachment();
&lt;br&gt;@@ -362,7 +378,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final NioWorker worker = channel.worker;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Thread currentThread = Thread.currentThread();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Thread workerThread = worker.thread;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (workerThread == null || currentThread != workerThread) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (currentThread != workerThread) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (channel.writeTaskInTaskQueue.compareAndSet(false, true)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean offered = worker.writeTaskQueue.offer(channel.writeTask);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert offered;
&lt;br&gt;@@ -573,6 +589,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SelectionKey key = channel.socket.keyFor(selector);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (key != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;key.cancel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;worker.cancelledKeys ++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.socket.close();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -20,9 +20,11 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.ChannelBufferFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.HeapChannelBufferFactory;
&lt;br&gt;-import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelException;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLoggerFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.util.internal.ConversionUtil;
&lt;br&gt;@@ -41,12 +43,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InternalLogger logger =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InternalLoggerFactory.getInstance(DefaultXnioChannelConfig.class);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final ReceiveBufferSizePredictorFactory DEFAULT_PREDICTOR_FACTORY =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile ChannelBufferFactory bufferFactory = HeapChannelBufferFactory.getInstance();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile ChannelPipelineFactory pipelineFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferHighWaterMark = 64 * 1024;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferLowWaterMark &amp;nbsp;= 32 * 1024;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictorFactory predictorFactory = DEFAULT_PREDICTOR_FACTORY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeSpinCount = 16;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;DefaultXnioChannelConfig() {
&lt;br&gt;@@ -145,6 +150,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getReceiveBufferSizePredictor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor = this.predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor = getReceiveBufferSizePredictorFactory().getPredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ChannelException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Failed to create a new &amp;quot; +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor.class.getSimpleName() + '.',
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -156,6 +172,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictorFactory == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictorFactory&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictorFactory = predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelPipelineFactory getPipelineFactory() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipelineFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -19,8 +19,10 @@
&lt;br&gt;&amp;nbsp;import java.nio.channels.WritableByteChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;@@ -39,6 +41,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;writeSpinCount&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setWriteSpinCount(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictorFactory&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;@@ -79,14 +83,34 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getReceiveBufferSizePredictor();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictorFactory} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -26,6 +26,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpContentDecompressor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequestEncoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponseDecoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.stream.ChunkedWriteHandler;
&lt;br&gt;@@ -33,7 +34,7 @@
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=13&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Andy Taylor (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=14&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=15&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=16&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;@@ -42,6 +43,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Create a default pipeline implementation.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;decoder&amp;quot;, new HttpResponseDecoder());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Remove the following line if you don't want automatic content decompression.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;inflater&amp;quot;, new HttpContentDecompressor());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Uncomment the following line if you don't want to handle HttpChunks.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(1048576));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;encoder&amp;quot;, new HttpRequestEncoder());
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -26,13 +26,14 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpContentCompressor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=17&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Andy Taylor (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=18&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=19&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=20&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;@@ -50,6 +51,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Uncomment the following line if you don't want to handle HttpChunks.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(1048576));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;encoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Remove the following line if you don't want automatic content compression.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;deflater&amp;quot;, new HttpContentCompressor());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;handler&amp;quot;, new HttpRequestHandler());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -103,7 +103,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private class OutboundHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static class OutboundHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final Channel inboundChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -20,6 +20,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannelFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.oio.OioDatagramChannelFactory;
&lt;br&gt;@@ -43,12 +44,23 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new OioDatagramChannelFactory(Executors.newCachedThreadPool());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConnectionlessBootstrap b = new ConnectionlessBootstrap(f);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Configure the pipeline.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline p = b.getPipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;encoder&amp;quot;, new StringEncoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;decoder&amp;quot;, new StringDecoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;handler&amp;quot;, new QuoteOfTheMomentClientHandler());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Enable broadcast
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(&amp;quot;broadcast&amp;quot;, &amp;quot;true&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Allow packets as large as up to 1024 bytes (default is 768).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// You could increase or decrease this value to avoid truncated packets
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// or to improve memory footprint respectively.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;receiveBufferSizePredictorFactory&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(1024));
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DatagramChannel c = (DatagramChannel) b.bind(new InetSocketAddress(0));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Broadcast the QOTM request to port 8080.
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -20,6 +20,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannelFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.oio.OioDatagramChannelFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.string.StringDecoder;
&lt;br&gt;@@ -42,12 +43,24 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new OioDatagramChannelFactory(Executors.newCachedThreadPool());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConnectionlessBootstrap b = new ConnectionlessBootstrap(f);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Configure the pipeline.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline p = b.getPipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;encoder&amp;quot;, new StringEncoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;decoder&amp;quot;, new StringDecoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;handler&amp;quot;, new QuoteOfTheMomentServerHandler());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Enable broadcast
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(&amp;quot;broadcast&amp;quot;, &amp;quot;false&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Allow packets as large as up to 1024 bytes (default is 768).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// You could increase or decrease this value to avoid truncated packets
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// or to improve memory footprint respectively.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;receiveBufferSizePredictorFactory&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(1024));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Bind to the port and start the service.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.bind(new InetSocketAddress(8080));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -22,7 +22,7 @@
&lt;br&gt;&amp;nbsp; * failed.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=21&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=22&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=23&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public class CompressionException extends RuntimeException {
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -29,7 +29,7 @@
&lt;br&gt;&amp;nbsp; * Decompresses a {@link ChannelBuffer} using the deflate algorithm.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=24&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=25&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=26&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -36,7 +36,7 @@
&lt;br&gt;&amp;nbsp; * Compresses a {@link ChannelBuffer} using the deflate algorithm.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=27&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=28&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=29&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;@@ -69,7 +69,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @throws CompressionException if failed to initialize zlib
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ZlibEncoder(int compressionLevel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(compressionLevel, ZlibWrapper.ZLIB);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(ZlibWrapper.ZLIB, compressionLevel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;@@ -79,13 +79,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @throws CompressionException if failed to initialize zlib
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ZlibEncoder(ZlibWrapper wrapper) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(6, wrapper);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(wrapper, 6);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new zlib encoder with the specified {@code compressionLevel}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * and the specified wrapper.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param compressionLevel
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{@code 1} yields the fastest compression and {@code 9} yields the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;best compression. &amp;nbsp;{@code 0} means no compression. &amp;nbsp;The default
&lt;br&gt;@@ -93,7 +92,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @throws CompressionException if failed to initialize zlib
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public ZlibEncoder(int compressionLevel, ZlibWrapper wrapper) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ZlibEncoder(ZlibWrapper wrapper, int compressionLevel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (compressionLevel &amp;lt; 0 || compressionLevel &amp;gt; 9) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;compressionLevel: &amp;quot; + compressionLevel +
&lt;br&gt;@@ -242,7 +241,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (evt != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(evt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Channels.succeededFuture(evt.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Channels.succeededFuture(ctx.getChannel());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer footer;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -22,7 +22,7 @@
&lt;br&gt;&amp;nbsp; * Utility methods used by {@link ZlibEncoder} and {@link ZlibDecoder}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=30&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=31&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=32&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;final class ZlibUtil {
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -20,7 +20,7 @@
&lt;br&gt;&amp;nbsp; * algorithm.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=33&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=34&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=35&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public enum ZlibWrapper {
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -17,6 +17,8 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import static org.jboss.netty.channel.Channels.*;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+import java.lang.reflect.Array;
&lt;br&gt;+import java.util.ConcurrentModificationException;
&lt;br&gt;&amp;nbsp;import java.util.LinkedList;
&lt;br&gt;&amp;nbsp;import java.util.Queue;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -41,7 +43,7 @@
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=36&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-abstract class AbstractCodecEmbedder&amp;lt;T&amp;gt; implements CodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+abstract class AbstractCodecEmbedder&amp;lt;E&amp;gt; implements CodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Channel channel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ChannelPipeline pipeline;
&lt;br&gt;@@ -124,15 +126,61 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public final T poll() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (T) productQueue.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final E poll() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (E) productQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public final T peek() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (T) productQueue.peek();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final E peek() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (E) productQueue.peek();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final Object[] pollAll() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int size = size();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object[] a = new Object[size];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; size; i ++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;E product = poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (product == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ConcurrentModificationException();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[i] = product;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return a;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final &amp;lt;T&amp;gt; T[] pollAll(T[] a) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;a&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int size = size();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Create a new array if the specified one is too small.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a.length &amp;lt; size) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a = (T[]) Array.newInstance(a.getClass().getComponentType(), size);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0;; i ++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T product = (T) poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (product == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[i] = product;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Put the terminator if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a.length &amp;gt; size) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[size] = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return a;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final int size() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return productQueue.size();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;all&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final class EmbeddedChannelSink implements ChannelSink, ChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EmbeddedChannelSink() {
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -15,6 +15,8 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.handler.codec.embedder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * A helper that wraps an encoder or a decoder (codec) so that they can be used
&lt;br&gt;&amp;nbsp; * without doing actual I/O in unit tests or higher level codecs. &amp;nbsp;Please refer
&lt;br&gt;@@ -24,7 +26,7 @@
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=37&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-public interface CodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+public interface CodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Offers an input object to the pipeline of this embedder.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;@@ -50,7 +52,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} if and only if there is no output object left in the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; product queue.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;T poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;E poll();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Reads an encoded or decoded output from the head of the product queue.
&lt;br&gt;@@ -61,5 +63,34 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} if and only if there is no output object left in the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; product queue.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;T peek();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;E peek();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Consumes all encoded or decoded output from the product queue. &amp;nbsp;The
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * output object is generated by the offered input objects. &amp;nbsp;The behavior
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * of this method is identical with {@link Collection#toArray()} except that
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * the product queue is cleared.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return an array of all encoded or decoded objects.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; An empty array is returned if and only if there is no output
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object left in the product queue.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Object[] pollAll();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Consumes all encoded or decoded output from the product queue. &amp;nbsp;The
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * output object is generated by the offered input objects. &amp;nbsp;The behavior
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * of this method is identical with {@link Collection#toArray(Object[])}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * except that the product queue is cleared.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return an array of all encoded or decoded objects.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; An empty array is returned if and only if there is no output
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object left in the product queue.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;T&amp;gt; T[] pollAll(T[] a);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the number of encoded or decoded output in the product queue.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int size();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -49,7 +49,7 @@
&lt;br&gt;&amp;nbsp; * @apiviz.landmark
&lt;br&gt;&amp;nbsp; * @see EncoderEmbedder
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-public class DecoderEmbedder&amp;lt;T&amp;gt; extends AbstractCodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+public class DecoderEmbedder&amp;lt;E&amp;gt; extends AbstractCodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new embedder whose pipeline is composed of the specified
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -49,7 +49,7 @@
&lt;br&gt;&amp;nbsp; * @apiviz.landmark
&lt;br&gt;&amp;nbsp; * @see DecoderEmbedder
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-public class EncoderEmbedder&amp;lt;T&amp;gt; extends AbstractCodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+public class EncoderEmbedder&amp;lt;E&amp;gt; extends AbstractCodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new embedder whose pipeline is composed of the specified
&lt;br&gt;&lt;br&gt;Copied: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java (from rev 1871, trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java)
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,101 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibEncoder;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Compresses an {@link HttpMessage} and an {@link HttpChunk} in {@code gzip} or
&lt;br&gt;+ * {@code deflate} encoding while respecting the {@code &amp;quot;Accept-Encoding&amp;quot;} header.
&lt;br&gt;+ * If there is no matching encoding, no compression is done. &amp;nbsp;For more
&lt;br&gt;+ * information on how this handler modifies the message, please refer to
&lt;br&gt;+ * {@link HttpContentEncoder}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=38&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=39&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public class HttpContentCompressor extends HttpContentEncoder {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int compressionLevel;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new handler with the default compression level (&amp;lt;tt&amp;gt;6&amp;lt;/tt&amp;gt;).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpContentCompressor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(6);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new handler with the specified compression level.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param compressionLevel
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{@code 1} yields the fastest compression and {@code 9} yields the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;best compression. &amp;nbsp;{@code 0} means no compression. &amp;nbsp;The default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;compression level is {@code 6}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpContentCompressor(int compressionLevel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (compressionLevel &amp;lt; 0 || compressionLevel &amp;gt; 9) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;compressionLevel: &amp;quot; + compressionLevel +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot; (expected: 0-9)&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.compressionLevel = compressionLevel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentEncoder(String acceptEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ZlibWrapper wrapper = determineWrapper(acceptEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (wrapper == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibEncoder(wrapper, compressionLevel));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected String getTargetContentEncoding(String acceptEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ZlibWrapper wrapper = determineWrapper(acceptEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (wrapper == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (wrapper) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case GZIP:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;gzip&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ZLIB:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;deflate&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new Error();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ZlibWrapper determineWrapper(String acceptEncoding) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// FIXME: Use the Q value.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptEncoding.indexOf(&amp;quot;gzip&amp;quot;) &amp;gt;= 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ZlibWrapper.GZIP;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptEncoding.indexOf(&amp;quot;deflate&amp;quot;) &amp;gt;= 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ZlibWrapper.ZLIB;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Copied: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java (from rev 1871, trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java)
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,176 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffers;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Decodes the content of the received {@link HttpRequest} and {@link HttpChunk}.
&lt;br&gt;+ * The original content is replaced with the new content decoded by the
&lt;br&gt;+ * {@link DecoderEmbedder}, which is created by {@link #newContentDecoder(String)}.
&lt;br&gt;+ * Once decoding is finished, the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt;
&lt;br&gt;+ * header is set to the target content encoding, as returned by {@link #getTargetContentEncoding(String)}.
&lt;br&gt;+ * Also, the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;+ * decoded content. &amp;nbsp;If the content encoding of the original is not supported
&lt;br&gt;+ * by the decoder, {@link #newContentDecoder(String)} should return {@code null}
&lt;br&gt;+ * so that no decoding occurs (i.e. pass-through).
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;+ * and implement {@link #newContentDecoder(String)} properly to make this class
&lt;br&gt;+ * functional. &amp;nbsp;For example, refer to the source code of {@link HttpContentDecompressor}.
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * This handler must be placed after {@link HttpMessageDecoder} in the pipeline
&lt;br&gt;+ * so that this handler can intercept HTTP requests after {@link HttpMessageDecoder}
&lt;br&gt;+ * converts {@link ChannelBuffer}s into HTTP requests.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=40&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=41&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public abstract class HttpContentDecoder extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; decoder;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new instance.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpContentDecoder() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (msg instanceof HttpMessage) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Determine the content encoding.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String contentEncoding = m.getHeader(HttpHeaders.Names.CONTENT_ENCODING);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = contentEncoding.trim();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = HttpHeaders.Values.IDENTITY;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((decoder = newContentDecoder(contentEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content and remove or replace the existing headers
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_ENCODING,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getTargetContentEncoding(contentEncoding));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decode(content), finishDecode());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Because HttpMessage is a mutable object, we can simply forward the received event.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (msg instanceof HttpChunk) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpChunk c = (HttpChunk) msg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = c.getContent();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the chunk if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!c.isLast()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decode(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Note that HttpChunk is immutable unlike HttpMessage.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX API inconsistency? I can live with it though.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishDecode();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Generate an additional chunk if the decoder produced
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the last product on closure,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, new DefaultHttpChunk(lastProduct), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Emit the last chunk.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns a new {@link DecoderEmbedder} that decodes the HTTP message
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * content encoded in the specified &amp;lt;tt&amp;gt;contentEncoding&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param contentEncoding the value of the {@code &amp;quot;Content-Encoding&amp;quot;} header
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return a new {@link DecoderEmbedder} if the specified encoding is supported.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} otherwise (alternatively, you can throw an exception
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to block unknown encoding).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentDecoder(String contentEncoding) throws Exception;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the expected content encoding of the decoded content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * This method returns {@code &amp;quot;identity&amp;quot;} by default, which is the case for
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * most decoders.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param contentEncoding the value of the {@code &amp;quot;Content-Encoding&amp;quot;} header
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected String getTargetContentEncoding(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return HttpHeaders.Values.IDENTITY;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer decode(ChannelBuffer buf) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder.offer(buf);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.wrappedBuffer(decoder.pollAll(new ChannelBuffer[decoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer finishDecode() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder.finish()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.wrappedBuffer(decoder.pollAll(new ChannelBuffer[decoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Copied: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java (from rev 1871, trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java)
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,46 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibDecoder;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
&lt;br&gt;+ * {@code gzip} or {@code deflate} encoding. &amp;nbsp;For more information on how this
&lt;br&gt;+ * handler modifies the message, please refer to {@link HttpContentDecoder}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=42&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=43&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public class HttpContentDecompressor extends HttpContentDecoder {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentDecoder(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (&amp;quot;gzip&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-gzip&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.GZIP));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (&amp;quot;deflate&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-deflate&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.ZLIB));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 'identity' or unsupported
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Copied: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java (from rev 1871, trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java)
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -0,0 +1,197 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import java.util.Queue;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffers;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;+import org.jboss.netty.channel.SimpleChannelHandler;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
&lt;br&gt;+import org.jboss.netty.util.internal.LinkedTransferQueue;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Encodes the content of the outbound {@link HttpResponse} and {@link HttpChunk}.
&lt;br&gt;+ * The original content is replaced with the new content encoded by the
&lt;br&gt;+ * {@link EncoderEmbedder}, which is created by {@link #newContentEncoder(String)}.
&lt;br&gt;+ * Once encoding is finished, the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt; header
&lt;br&gt;+ * is set to the target content encoding, as returned by {@link #getTargetContentEncoding(String)}.
&lt;br&gt;+ * Also, the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;+ * encoded content. &amp;nbsp;If there is no supported encoding in the
&lt;br&gt;+ * corresponding {@link HttpRequest}'s {@code &amp;quot;Accept-Encoding&amp;quot;} header,
&lt;br&gt;+ * {@link #newContentEncoder(String)} should return {@code null} so that no
&lt;br&gt;+ * encoding occurs (i.e. pass-through).
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;+ * and implement {@link #newContentEncoder(String)} and {@link #getTargetContentEncoding(String)}
&lt;br&gt;+ * properly to make this class functional. &amp;nbsp;For example, refer to the source
&lt;br&gt;+ * code of {@link HttpContentCompressor}.
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * This handler must be placed after {@link HttpMessageEncoder} in the pipeline
&lt;br&gt;+ * so that this handler can intercept HTTP responses before {@link HttpMessageEncoder}
&lt;br&gt;+ * converts them into {@link ChannelBuffer}s.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=44&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=45&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public abstract class HttpContentEncoder extends SimpleChannelHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Queue&amp;lt;String&amp;gt; acceptEncodingQueue = new LinkedTransferQueue&amp;lt;String&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; encoder;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new instance.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpContentEncoder() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(msg instanceof HttpMessage)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String acceptedEncoding = m.getHeader(HttpHeaders.Names.ACCEPT_ENCODING);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptedEncoding == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptedEncoding = HttpHeaders.Values.IDENTITY;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean offered = acceptEncodingQueue.offer(acceptedEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert offered;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws Exception {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (msg instanceof HttpMessage) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder = null;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Determine the content encoding.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String acceptEncoding = acceptEncodingQueue.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptEncoding == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalStateException(&amp;quot;cannot send more responses than requests&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((encoder = newContentEncoder(acceptEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Encode the content and remove or replace the existing headers
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_ENCODING,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getTargetContentEncoding(acceptEncoding));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Encode the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encode(content), finishEncode());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Because HttpMessage is a mutable object, we can simply forward the write request.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (msg instanceof HttpChunk) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpChunk c = (HttpChunk) msg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = c.getContent();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Encode the chunk if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (encoder != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!c.isLast()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = encode(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Note that HttpChunk is immutable unlike HttpMessage.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX API inconsistency? I can live with it though.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, e.getFuture(), new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishEncode();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Generate an additional chunk if the decoder produced
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the last product on closure,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, Channels.succeededFuture(e.getChannel()), new DefaultHttpChunk(lastProduct), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Emit the last chunk.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns a new {@link EncoderEmbedder} that encodes the HTTP message
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param acceptEncoding
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the value of the {@code &amp;quot;Accept-Encoding&amp;quot;} header
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return a new {@link EncoderEmbedder} if there is a supported encoding
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; in {@code acceptEncoding}. &amp;nbsp;{@code null} otherwise.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentEncoder(String acceptEncoding) throws Exception;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the expected content encoding of the encoded content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param acceptEncoding the value of the {@code &amp;quot;Accept-Encoding&amp;quot;} header
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract String getTargetContentEncoding(String acceptEncoding) throws Exception;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer encode(ChannelBuffer buf) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.offer(buf);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.wrappedBuffer(encoder.pollAll(new ChannelBuffer[encoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer finishEncode() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (encoder.finish()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.wrappedBuffer(encoder.pollAll(new ChannelBuffer[encoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -91,7 +91,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queue.offer((MessageEvent) e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean offered = queue.offer((MessageEvent) e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert offered;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ctx.getChannel().isWritable()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flush(ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/util/HashedWheelTimer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/util/HashedWheelTimer.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/util/HashedWheelTimer.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -61,9 +61,9 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;h3&amp;gt;Implementation Details&amp;lt;/h3&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * {@link HashedWheelTimer} is based on
&lt;br&gt;- * &amp;lt;a href=&amp;quot;&lt;a href=&quot;http://cseweb.ucsd.edu/users/varghese/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://cseweb.ucsd.edu/users/varghese/&lt;/a&gt;&amp;gt;George Varghese&amp;lt;/a&amp;gt; and
&lt;br&gt;+ * &amp;lt;a href=&amp;quot;&lt;a href=&quot;http://cseweb.ucsd.edu/users/varghese/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://cseweb.ucsd.edu/users/varghese/&lt;/a&gt;&amp;quot;&amp;gt;George Varghese&amp;lt;/a&amp;gt; and
&lt;br&gt;&amp;nbsp; * Tony Lauck's paper,
&lt;br&gt;- * &amp;lt;a href=&amp;quot;&lt;a href=&quot;http://www-cse.ucsd.edu/users/varghese/PAPERS/twheel.ps.Z&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www-cse.ucsd.edu/users/varghese/PAPERS/twheel.ps.Z&lt;/a&gt;&amp;quot;&amp;gt;'Hashed
&lt;br&gt;+ * &amp;lt;a href=&amp;quot;&lt;a href=&quot;http://cseweb.ucsd.edu/users/varghese/PAPERS/twheel.ps.Z&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://cseweb.ucsd.edu/users/varghese/PAPERS/twheel.ps.Z&lt;/a&gt;&amp;quot;&amp;gt;'Hashed
&lt;br&gt;&amp;nbsp; * and Hierarchical Timing Wheels: data structures to efficiently implement a
&lt;br&gt;&amp;nbsp; * timer facility'&amp;lt;/a&amp;gt;. &amp;nbsp;More comprehensive slides are located
&lt;br&gt;&amp;nbsp; * &amp;lt;a href=&amp;quot;&lt;a href=&quot;http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.cse.wustl.edu/~cdgill/courses/cs6874/TimingWheels.ppt&lt;/a&gt;&amp;quot;&amp;gt;here&amp;lt;/a&amp;gt;.
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -138,7 +138,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;WrapperType wrapperType;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean wroteTrailer;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;byte data_type; // UNKNOWN, BINARY or ASCII
&lt;br&gt;- &amp;nbsp; &amp;nbsp;byte method; // STORED (for zip only) or DEFLATED
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int last_flush; // value of flush param for previous deflate call
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int w_size; // LZ77 window size (32K by default)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int w_bits; // log2(w_size) &amp;nbsp;(8..16)
&lt;br&gt;@@ -1196,7 +1195,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (match_available != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bflush = _tr_tally(0, window[strstart - 1] &amp; 0xff);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_tr_tally(0, window[strstart - 1] &amp; 0xff);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;match_available = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flush_block_only(flush == JZlib.Z_FINISH);
&lt;br&gt;@@ -1363,7 +1362,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//System.out.println(&amp;quot;level=&amp;quot;+level);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.strategy = strategy;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.method = (byte) method;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return deflateReset(strm);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -1371,7 +1369,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int deflateReset(ZStream strm) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strm.total_in = strm.total_out = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strm.msg = null; //
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strm.data_type = Z_UNKNOWN;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pending = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pending_out = 0;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -566,7 +566,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;write = q;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = inflate_flush(z, r);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;q = write;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m = q &amp;lt; read? read - q - 1 : end - q;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (read != write) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitb = b;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitk = k;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -409,7 +409,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s.write = q;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = s.inflate_flush(z, r);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;q = s.write;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m = q &amp;lt; s.read? s.read - q - 1 : s.end - q;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (s.read != s.write) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s.bitb = b;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -252,7 +252,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (z.avail_in == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return r;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = f;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;z.avail_in --;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;z.total_in ++;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java	2009-11-07 10:00:41 UTC (rev 1872)
&lt;br&gt;@@ -63,7 +63,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public String msg;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Deflate dstate;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Inflate istate;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;int data_type; // best guess about the data type: ascii or binary
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;long adler;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int crc32;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3963612&amp;i=46&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1872-in-branches-httpPost-src-main-java-org-jboss-netty-channel-and-13-other-directories-tp3963612p3963612.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936982</id>
	<title>r1871 - in trunk/src/main/java/org/jboss/netty: example/proxy and 4 other directories.</title>
	<published>2009-11-02T23:44:06Z</published>
	<updated>2009-11-02T23:44:06Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-03 02:44:06 -0500 (Tue, 03 Nov 2009)
&lt;br&gt;New Revision: 1871
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java
&lt;br&gt;Log:
&lt;br&gt;Fixed some non-sense code as advised by FindBugs
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingServlet.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -222,7 +222,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private final class OutboundConnectionHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final class OutboundConnectionHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final ServletOutputStream out;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -103,7 +103,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private class OutboundHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static class OutboundHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final Channel inboundChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -241,7 +241,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (evt != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(evt);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Channels.succeededFuture(evt.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Channels.succeededFuture(ctx.getChannel());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer footer;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -77,7 +77,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptedEncoding == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptedEncoding = HttpHeaders.Values.IDENTITY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptEncodingQueue.offer(acceptedEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean offered = acceptEncodingQueue.offer(acceptedEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert offered;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/stream/ChunkedWriteHandler.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -91,7 +91,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queue.offer((MessageEvent) e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean offered = queue.offer((MessageEvent) e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert offered;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ctx.getChannel().isWritable()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flush(ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -138,7 +138,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;WrapperType wrapperType;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean wroteTrailer;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;byte data_type; // UNKNOWN, BINARY or ASCII
&lt;br&gt;- &amp;nbsp; &amp;nbsp;byte method; // STORED (for zip only) or DEFLATED
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int last_flush; // value of flush param for previous deflate call
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int w_size; // LZ77 window size (32K by default)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int w_bits; // log2(w_size) &amp;nbsp;(8..16)
&lt;br&gt;@@ -1196,7 +1195,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (match_available != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bflush = _tr_tally(0, window[strstart - 1] &amp; 0xff);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;_tr_tally(0, window[strstart - 1] &amp; 0xff);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;match_available = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;flush_block_only(flush == JZlib.Z_FINISH);
&lt;br&gt;@@ -1363,7 +1362,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//System.out.println(&amp;quot;level=&amp;quot;+level);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.strategy = strategy;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.method = (byte) method;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return deflateReset(strm);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -1371,7 +1369,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int deflateReset(ZStream strm) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strm.total_in = strm.total_out = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strm.msg = null; //
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;strm.data_type = Z_UNKNOWN;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pending = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pending_out = 0;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfBlocks.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -566,7 +566,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;write = q;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = inflate_flush(z, r);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;q = write;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m = q &amp;lt; read? read - q - 1 : end - q;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (read != write) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitb = b;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bitk = k;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/util/internal/jzlib/InfCodes.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -409,7 +409,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s.write = q;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = s.inflate_flush(z, r);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;q = s.write;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m = q &amp;lt; s.read? s.read - q - 1 : s.end - q;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (s.read != s.write) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;s.bitb = b;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Inflate.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -252,7 +252,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (z.avail_in == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return r;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;r = f;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;z.avail_in --;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;z.total_in ++;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/util/internal/jzlib/ZStream.java	2009-11-03 07:44:06 UTC (rev 1871)
&lt;br&gt;@@ -63,7 +63,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public String msg;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Deflate dstate;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;Inflate istate;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;int data_type; // best guess about the data type: ascii or binary
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;long adler;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int crc32;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936982&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1871-in-trunk-src-main-java-org-jboss-netty-example-proxy-and-4-other-directories-tp3936982p3936982.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936901</id>
	<title>r1870 - trunk/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-02T23:11:52Z</published>
	<updated>2009-11-02T23:11:52Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-03 02:11:52 -0500 (Tue, 03 Nov 2009)
&lt;br&gt;New Revision: 1870
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;Log:
&lt;br&gt;Improved Javadoc
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;@@ -16,25 +16,17 @@
&lt;br&gt;&amp;nbsp;package org.jboss.netty.handler.codec.http;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;-import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.compression.ZlibEncoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;- * Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
&lt;br&gt;- * {@code gzip} or {@code deflate} encoding. &amp;nbsp;Insert this handler after
&lt;br&gt;- * {@link HttpMessageDecoder} in the {@link ChannelPipeline}:
&lt;br&gt;- * &amp;lt;pre&amp;gt;
&lt;br&gt;- * ChannelPipeline p = ...;
&lt;br&gt;- * ...
&lt;br&gt;- * p.addLast(&amp;quot;decoder&amp;quot;, new HttpRequestDecoder());
&lt;br&gt;- * p.addLast(&amp;quot;inflater&amp;quot;, &amp;lt;b&amp;gt;new HttpContentDecomperssor()&amp;lt;/b&amp;gt;);
&lt;br&gt;- * ...
&lt;br&gt;- * p.addLast(&amp;quot;encoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;- * p.addLast(&amp;quot;handler&amp;quot;, new HttpRequestHandler());
&lt;br&gt;- * &amp;lt;/pre&amp;gt;
&lt;br&gt;+ * Compresses an {@link HttpMessage} and an {@link HttpChunk} in {@code gzip} or
&lt;br&gt;+ * {@code deflate} encoding while respecting the {@code &amp;quot;Accept-Encoding&amp;quot;} header.
&lt;br&gt;+ * If there is no matching encoding, no compression is done. &amp;nbsp;For more
&lt;br&gt;+ * information on how this handler modifies the message, please refer to
&lt;br&gt;+ * {@link HttpContentEncoder}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -45,10 +37,21 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int compressionLevel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new handler with the default compression level (&amp;lt;tt&amp;gt;6&amp;lt;/tt&amp;gt;).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpContentCompressor() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(6);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new handler with the specified compression level.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param compressionLevel
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{@code 1} yields the fastest compression and {@code 9} yields the
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;best compression. &amp;nbsp;{@code 0} means no compression. &amp;nbsp;The default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;compression level is {@code 6}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpContentCompressor(int compressionLevel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (compressionLevel &amp;lt; 0 || compressionLevel &amp;gt; 9) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;@@ -25,19 +25,23 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;- * Decodes the content of the received {@link HttpMessage} and {@link HttpChunk}.
&lt;br&gt;- * The original content ({@link HttpMessage#getContent()} or {@link HttpChunk#getContent()})
&lt;br&gt;- * is replaced with the new content decoded by the {@link DecoderEmbedder},
&lt;br&gt;- * which is created by {@link #newContentDecoder(String)}. &amp;nbsp;Once decoding is finished,
&lt;br&gt;- * the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt; header is set to &amp;lt;tt&amp;gt;'identity'&amp;lt;/tt&amp;gt;
&lt;br&gt;- * and the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;+ * Decodes the content of the received {@link HttpRequest} and {@link HttpChunk}.
&lt;br&gt;+ * The original content is replaced with the new content decoded by the
&lt;br&gt;+ * {@link DecoderEmbedder}, which is created by {@link #newContentDecoder(String)}.
&lt;br&gt;+ * Once decoding is finished, the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt;
&lt;br&gt;+ * header is set to the target content encoding, as returned by {@link #getTargetContentEncoding(String)}.
&lt;br&gt;+ * Also, the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;&amp;nbsp; * decoded content. &amp;nbsp;If the content encoding of the original is not supported
&lt;br&gt;- * by the decoder, {@link #newContentDecoder(String)} returns {@code null} and no
&lt;br&gt;- * decoding occurs (i.e. pass-through).
&lt;br&gt;+ * by the decoder, {@link #newContentDecoder(String)} should return {@code null}
&lt;br&gt;+ * so that no decoding occurs (i.e. pass-through).
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;&amp;nbsp; * and implement {@link #newContentDecoder(String)} properly to make this class
&lt;br&gt;&amp;nbsp; * functional. &amp;nbsp;For example, refer to the source code of {@link HttpContentDecompressor}.
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * This handler must be placed after {@link HttpMessageDecoder} in the pipeline
&lt;br&gt;+ * so that this handler can intercept HTTP requests after {@link HttpMessageDecoder}
&lt;br&gt;+ * converts {@link ChannelBuffer}s into HTTP requests.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -147,7 +151,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * This method returns {@code &amp;quot;identity&amp;quot;} by default, which is the case for
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * most decoders.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param contentEncoding the content encoding of the original content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param contentEncoding the value of the {@code &amp;quot;Content-Encoding&amp;quot;} header
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected String getTargetContentEncoding(String contentEncoding) throws Exception {
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;@@ -16,7 +16,6 @@
&lt;br&gt;&amp;nbsp;package org.jboss.netty.handler.codec.http;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;-import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.compression.ZlibDecoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;@@ -24,17 +23,8 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
&lt;br&gt;- * {@code gzip} or {@code deflate} encoding. &amp;nbsp;Insert this handler after
&lt;br&gt;- * {@link HttpMessageDecoder} in the {@link ChannelPipeline}:
&lt;br&gt;- * &amp;lt;pre&amp;gt;
&lt;br&gt;- * ChannelPipeline p = ...;
&lt;br&gt;- * ...
&lt;br&gt;- * p.addLast(&amp;quot;decoder&amp;quot;, new HttpRequestDecoder());
&lt;br&gt;- * p.addLast(&amp;quot;inflater&amp;quot;, &amp;lt;b&amp;gt;new HttpContentDecomperssor()&amp;lt;/b&amp;gt;);
&lt;br&gt;- * ...
&lt;br&gt;- * p.addLast(&amp;quot;encoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;- * p.addLast(&amp;quot;handler&amp;quot;, new HttpRequestHandler());
&lt;br&gt;- * &amp;lt;/pre&amp;gt;
&lt;br&gt;+ * {@code gzip} or {@code deflate} encoding. &amp;nbsp;For more information on how this
&lt;br&gt;+ * handler modifies the message, please refer to {@link HttpContentDecoder}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 07:11:52 UTC (rev 1870)
&lt;br&gt;@@ -23,11 +23,29 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channels;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.SimpleChannelHandler;
&lt;br&gt;-import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.util.internal.LinkedTransferQueue;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;+ * Encodes the content of the outbound {@link HttpResponse} and {@link HttpChunk}.
&lt;br&gt;+ * The original content is replaced with the new content encoded by the
&lt;br&gt;+ * {@link EncoderEmbedder}, which is created by {@link #newContentEncoder(String)}.
&lt;br&gt;+ * Once encoding is finished, the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt; header
&lt;br&gt;+ * is set to the target content encoding, as returned by {@link #getTargetContentEncoding(String)}.
&lt;br&gt;+ * Also, the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;+ * encoded content. &amp;nbsp;If there is no supported encoding in the
&lt;br&gt;+ * corresponding {@link HttpRequest}'s {@code &amp;quot;Accept-Encoding&amp;quot;} header,
&lt;br&gt;+ * {@link #newContentEncoder(String)} should return {@code null} so that no
&lt;br&gt;+ * encoding occurs (i.e. pass-through).
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;+ * and implement {@link #newContentEncoder(String)} and {@link #getTargetContentEncoding(String)}
&lt;br&gt;+ * properly to make this class functional. &amp;nbsp;For example, refer to the source
&lt;br&gt;+ * code of {@link HttpContentCompressor}.
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * This handler must be placed after {@link HttpMessageEncoder} in the pipeline
&lt;br&gt;+ * so that this handler can intercept HTTP responses before {@link HttpMessageEncoder}
&lt;br&gt;+ * converts them into {@link ChannelBuffer}s.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -145,18 +163,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * content.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param acceptEncoding
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the value of the {@code &amp;quot;Accept-Encoding&amp;quot;} header.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the value of the {@code &amp;quot;Accept-Encoding&amp;quot;} header
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @return a new {@link DecoderEmbedder} if the specified encoding is supported.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} otherwise (alternatively, you can throw an exception
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to block unknown encoding).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return a new {@link EncoderEmbedder} if there is a supported encoding
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; in {@code acceptEncoding}. &amp;nbsp;{@code null} otherwise.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected abstract EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentEncoder(String acceptEncoding) throws Exception;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Returns the expected content encoding of the encoded content.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param contentEncoding the content encoding of the original content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param acceptEncoding the value of the {@code &amp;quot;Accept-Encoding&amp;quot;} header
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected abstract String getTargetContentEncoding(String acceptEncoding) throws Exception;
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936901&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1870-trunk-src-main-java-org-jboss-netty-handler-codec-http-tp3936901p3936901.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936841</id>
	<title>r1869 - in trunk/src/main/java/org/jboss/netty/handler/codec: http and 1 other directory.</title>
	<published>2009-11-02T22:49:47Z</published>
	<updated>2009-11-02T22:49:47Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-03 01:49:47 -0500 (Tue, 03 Nov 2009)
&lt;br&gt;New Revision: 1869
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;Log:
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt; -&amp;gt; &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/CompressionException.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -22,7 +22,7 @@
&lt;br&gt;&amp;nbsp; * failed.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public class CompressionException extends RuntimeException {
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibDecoder.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -29,7 +29,7 @@
&lt;br&gt;&amp;nbsp; * Decompresses a {@link ChannelBuffer} using the deflate algorithm.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -36,7 +36,7 @@
&lt;br&gt;&amp;nbsp; * Compresses a {@link ChannelBuffer} using the deflate algorithm.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=9&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibUtil.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -22,7 +22,7 @@
&lt;br&gt;&amp;nbsp; * Utility methods used by {@link ZlibEncoder} and {@link ZlibDecoder}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=11&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=12&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=13&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;final class ZlibUtil {
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibWrapper.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -20,7 +20,7 @@
&lt;br&gt;&amp;nbsp; * algorithm.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=14&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=15&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=16&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public enum ZlibWrapper {
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -37,7 +37,7 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/pre&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=17&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=18&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=19&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -40,7 +40,7 @@
&lt;br&gt;&amp;nbsp; * functional. &amp;nbsp;For example, refer to the source code of {@link HttpContentDecompressor}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=20&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=21&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=22&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -37,7 +37,7 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/pre&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=23&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=24&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=25&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 06:49:47 UTC (rev 1869)
&lt;br&gt;@@ -30,7 +30,7 @@
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=26&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=27&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=28&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public abstract class HttpContentEncoder extends SimpleChannelHandler {
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936841&amp;i=29&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1869-in-trunk-src-main-java-org-jboss-netty-handler-codec-http-and-1-other-directory-tp3936841p3936841.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936838</id>
	<title>r1868 - trunk/src/main/java/org/jboss/netty/example/http/snoop.</title>
	<published>2009-11-02T22:48:40Z</published>
	<updated>2009-11-02T22:48:40Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-03 01:48:39 -0500 (Tue, 03 Nov 2009)
&lt;br&gt;New Revision: 1868
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java
&lt;br&gt;Log:
&lt;br&gt;Updated the HTTP snoop example to fully utilize the compression handlers
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java	2009-11-03 06:47:30 UTC (rev 1867)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpServerPipelineFactory.java	2009-11-03 06:48:39 UTC (rev 1868)
&lt;br&gt;@@ -19,6 +19,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpContentCompressor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -43,6 +44,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Uncomment the following line if you don't want to handle HttpChunks.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(1048576));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;encoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Remove the following line if you don't want automatic content compression.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;deflater&amp;quot;, new HttpContentCompressor());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;handler&amp;quot;, new HttpRequestHandler());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936838&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1868-trunk-src-main-java-org-jboss-netty-example-http-snoop-tp3936838p3936838.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936833</id>
	<title>r1867 - trunk/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-02T22:47:30Z</published>
	<updated>2009-11-02T22:47:30Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-03 01:47:30 -0500 (Tue, 03 Nov 2009)
&lt;br&gt;New Revision: 1867
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;Log:
&lt;br&gt;* Better method naming
&lt;br&gt;* Added HttpContentEncoder and HttpContentCompressor (needs javadoc update)
&lt;br&gt;&lt;br&gt;&lt;br&gt;Added: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java	2009-11-03 06:47:30 UTC (rev 1867)
&lt;br&gt;@@ -0,0 +1,98 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibEncoder;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
&lt;br&gt;+ * {@code gzip} or {@code deflate} encoding. &amp;nbsp;Insert this handler after
&lt;br&gt;+ * {@link HttpMessageDecoder} in the {@link ChannelPipeline}:
&lt;br&gt;+ * &amp;lt;pre&amp;gt;
&lt;br&gt;+ * ChannelPipeline p = ...;
&lt;br&gt;+ * ...
&lt;br&gt;+ * p.addLast(&amp;quot;decoder&amp;quot;, new HttpRequestDecoder());
&lt;br&gt;+ * p.addLast(&amp;quot;inflater&amp;quot;, &amp;lt;b&amp;gt;new HttpContentDecomperssor()&amp;lt;/b&amp;gt;);
&lt;br&gt;+ * ...
&lt;br&gt;+ * p.addLast(&amp;quot;encoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;+ * p.addLast(&amp;quot;handler&amp;quot;, new HttpRequestHandler());
&lt;br&gt;+ * &amp;lt;/pre&amp;gt;
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936833&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936833&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public class HttpContentCompressor extends HttpContentEncoder {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int compressionLevel;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpContentCompressor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(6);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpContentCompressor(int compressionLevel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (compressionLevel &amp;lt; 0 || compressionLevel &amp;gt; 9) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;compressionLevel: &amp;quot; + compressionLevel +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot; (expected: 0-9)&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.compressionLevel = compressionLevel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentEncoder(String acceptEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ZlibWrapper wrapper = determineWrapper(acceptEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (wrapper == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibEncoder(wrapper, compressionLevel));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected String getTargetContentEncoding(String acceptEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ZlibWrapper wrapper = determineWrapper(acceptEncoding);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (wrapper == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (wrapper) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case GZIP:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;gzip&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case ZLIB:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;deflate&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new Error();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ZlibWrapper determineWrapper(String acceptEncoding) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// FIXME: Use the Q value.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptEncoding.indexOf(&amp;quot;gzip&amp;quot;) &amp;gt;= 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ZlibWrapper.GZIP;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptEncoding.indexOf(&amp;quot;deflate&amp;quot;) &amp;gt;= 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ZlibWrapper.ZLIB;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentCompressor.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 06:46:30 UTC (rev 1866)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 06:47:30 UTC (rev 1867)
&lt;br&gt;@@ -28,15 +28,15 @@
&lt;br&gt;&amp;nbsp; * Decodes the content of the received {@link HttpMessage} and {@link HttpChunk}.
&lt;br&gt;&amp;nbsp; * The original content ({@link HttpMessage#getContent()} or {@link HttpChunk#getContent()})
&lt;br&gt;&amp;nbsp; * is replaced with the new content decoded by the {@link DecoderEmbedder},
&lt;br&gt;- * which is created by {@link #newDecoder(String)}. &amp;nbsp;Once decoding is finished,
&lt;br&gt;+ * which is created by {@link #newContentDecoder(String)}. &amp;nbsp;Once decoding is finished,
&lt;br&gt;&amp;nbsp; * the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt; header is set to &amp;lt;tt&amp;gt;'identity'&amp;lt;/tt&amp;gt;
&lt;br&gt;&amp;nbsp; * and the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;&amp;nbsp; * decoded content. &amp;nbsp;If the content encoding of the original is not supported
&lt;br&gt;- * by the decoder, {@link #newDecoder(String)} returns {@code null} and no
&lt;br&gt;+ * by the decoder, {@link #newContentDecoder(String)} returns {@code null} and no
&lt;br&gt;&amp;nbsp; * decoding occurs (i.e. pass-through).
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;- * and implement {@link #newDecoder(String)} properly to make this class
&lt;br&gt;+ * and implement {@link #newContentDecoder(String)} properly to make this class
&lt;br&gt;&amp;nbsp; * functional. &amp;nbsp;For example, refer to the source code of {@link HttpContentDecompressor}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936833&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -46,7 +46,6 @@
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp;public abstract class HttpContentDecoder extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile HttpMessage previous;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; decoder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;@@ -63,11 +62,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.isChunked()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = m;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Determine the content encoding.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String contentEncoding = m.getHeader(HttpHeaders.Names.CONTENT_ENCODING);
&lt;br&gt;@@ -77,29 +71,25 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = HttpHeaders.Values.IDENTITY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((decoder = newDecoder(contentEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((decoder = newContentDecoder(contentEncoding)) != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content and remove or replace the existing headers
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_ENCODING,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getTargetEncoding(contentEncoding));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getTargetContentEncoding(contentEncoding));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decode(content), finishDecode());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decode(content), finishDecode());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content if necessary.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content != null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -107,8 +97,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Because HttpMessage is a mutable object, we can simply forward the received event.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (msg instanceof HttpChunk) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert previous != null;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpChunk c = (HttpChunk) msg;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = c.getContent();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -124,8 +112,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishDecode();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Generate an additional chunk if the decoder produced
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the last product on closure,
&lt;br&gt;@@ -154,7 +140,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} otherwise (alternatively, you can throw an exception
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to block unknown encoding).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newDecoder(String contentEncoding) throws Exception;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentDecoder(String contentEncoding) throws Exception;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Returns the expected content encoding of the decoded content.
&lt;br&gt;@@ -164,7 +150,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param contentEncoding the content encoding of the original content
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected String getTargetEncoding(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected String getTargetContentEncoding(String contentEncoding) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return HttpHeaders.Values.IDENTITY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -174,10 +160,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelBuffer finishDecode() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer result;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder.finish()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.wrappedBuffer(decoder.pollAll(new ChannelBuffer[decoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.wrappedBuffer(decoder.pollAll(new ChannelBuffer[decoder.size()]));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-03 06:46:30 UTC (rev 1866)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-03 06:47:30 UTC (rev 1867)
&lt;br&gt;@@ -43,7 +43,7 @@
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp;public class HttpContentDecompressor extends HttpContentDecoder {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newDecoder(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentDecoder(String contentEncoding) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (&amp;quot;gzip&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-gzip&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.GZIP));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (&amp;quot;deflate&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-deflate&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;&lt;br&gt;Added: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java	2009-11-03 06:47:30 UTC (rev 1867)
&lt;br&gt;@@ -0,0 +1,179 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import java.util.Queue;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffers;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;+import org.jboss.netty.channel.SimpleChannelHandler;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.EncoderEmbedder;
&lt;br&gt;+import org.jboss.netty.util.internal.LinkedTransferQueue;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936833&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936833&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public abstract class HttpContentEncoder extends SimpleChannelHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final Queue&amp;lt;String&amp;gt; acceptEncodingQueue = new LinkedTransferQueue&amp;lt;String&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; encoder;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new instance.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpContentEncoder() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(msg instanceof HttpMessage)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String acceptedEncoding = m.getHeader(HttpHeaders.Names.ACCEPT_ENCODING);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptedEncoding == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptedEncoding = HttpHeaders.Values.IDENTITY;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptEncodingQueue.offer(acceptedEncoding);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throws Exception {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (msg instanceof HttpMessage) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder = null;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Determine the content encoding.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String acceptEncoding = acceptEncodingQueue.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (acceptEncoding == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalStateException(&amp;quot;cannot send more responses than requests&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((encoder = newContentEncoder(acceptEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Encode the content and remove or replace the existing headers
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_ENCODING,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getTargetContentEncoding(acceptEncoding));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Encode the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encode(content), finishEncode());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Because HttpMessage is a mutable object, we can simply forward the write request.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (msg instanceof HttpChunk) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpChunk c = (HttpChunk) msg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = c.getContent();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Encode the chunk if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (encoder != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!c.isLast()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = encode(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Note that HttpChunk is immutable unlike HttpMessage.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX API inconsistency? I can live with it though.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, e.getFuture(), new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishEncode();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Generate an additional chunk if the decoder produced
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the last product on closure,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, Channels.succeededFuture(e.getChannel()), new DefaultHttpChunk(lastProduct), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Emit the last chunk.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns a new {@link EncoderEmbedder} that encodes the HTTP message
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param acceptEncoding
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the value of the {@code &amp;quot;Accept-Encoding&amp;quot;} header.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return a new {@link DecoderEmbedder} if the specified encoding is supported.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} otherwise (alternatively, you can throw an exception
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to block unknown encoding).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract EncoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newContentEncoder(String acceptEncoding) throws Exception;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the expected content encoding of the encoded content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param contentEncoding the content encoding of the original content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract String getTargetContentEncoding(String acceptEncoding) throws Exception;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer encode(ChannelBuffer buf) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.offer(buf);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.wrappedBuffer(encoder.pollAll(new ChannelBuffer[encoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer finishEncode() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (encoder.finish()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.wrappedBuffer(encoder.pollAll(new ChannelBuffer[encoder.size()]));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentEncoder.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936833&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1867-trunk-src-main-java-org-jboss-netty-handler-codec-http-tp3936833p3936833.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936830</id>
	<title>r1866 - trunk/src/main/java/org/jboss/netty/handler/codec/compression.</title>
	<published>2009-11-02T22:46:30Z</published>
	<updated>2009-11-02T22:46:30Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-03 01:46:30 -0500 (Tue, 03 Nov 2009)
&lt;br&gt;New Revision: 1866
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;Log:
&lt;br&gt;Changed constructor parameter order
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 02:59:18 UTC (rev 1865)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/compression/ZlibEncoder.java	2009-11-03 06:46:30 UTC (rev 1866)
&lt;br&gt;@@ -69,7 +69,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @throws CompressionException if failed to initialize zlib
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ZlibEncoder(int compressionLevel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(compressionLevel, ZlibWrapper.ZLIB);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(ZlibWrapper.ZLIB, compressionLevel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;@@ -79,13 +79,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @throws CompressionException if failed to initialize zlib
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ZlibEncoder(ZlibWrapper wrapper) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(6, wrapper);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(wrapper, 6);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new zlib encoder with the specified {@code compressionLevel}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * and the specified wrapper.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param compressionLevel
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{@code 1} yields the fastest compression and {@code 9} yields the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;best compression. &amp;nbsp;{@code 0} means no compression. &amp;nbsp;The default
&lt;br&gt;@@ -93,7 +92,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @throws CompressionException if failed to initialize zlib
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public ZlibEncoder(int compressionLevel, ZlibWrapper wrapper) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ZlibEncoder(ZlibWrapper wrapper, int compressionLevel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (compressionLevel &amp;lt; 0 || compressionLevel &amp;gt; 9) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;compressionLevel: &amp;quot; + compressionLevel +
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936830&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1866-trunk-src-main-java-org-jboss-netty-handler-codec-compression-tp3936830p3936830.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936282</id>
	<title>r1865 - trunk/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-02T18:59:18Z</published>
	<updated>2009-11-02T18:59:18Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 21:59:18 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1865
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;Log:
&lt;br&gt;Simplified HttpContentDecoder using the new methods in CodecEmbedder
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 02:34:54 UTC (rev 1864)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-03 02:59:18 UTC (rev 1865)
&lt;br&gt;@@ -73,9 +73,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String contentEncoding = m.getHeader(HttpHeaders.Names.CONTENT_ENCODING);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = contentEncoding.trim();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = HttpHeaders.Values.IDENTITY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null &amp;&amp; (decoder = newDecoder(contentEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if ((decoder = newDecoder(contentEncoding)) != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content and remove or replace the existing headers
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;@@ -85,22 +87,10 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decode(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decode(content), finishDecode());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Finish decoding.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishDecode();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Merge the last product into the content.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct != null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = lastProduct;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct != null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(content, lastProduct);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content if necessary.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;@@ -126,10 +116,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!c.isLast()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decode(content);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Note that HttpChunk is immutable unlike HttpMessage.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX API inconsistency? I can live with it though.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(ctx, new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishDecode();
&lt;br&gt;@@ -138,11 +129,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Generate an additional chunk if the decoder produced
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the last product on closure,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct.readable()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new DefaultHttpChunk(lastProduct),
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx, new DefaultHttpChunk(lastProduct), e.getRemoteAddress());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Emit the last chunk.
&lt;br&gt;@@ -181,33 +170,14 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelBuffer decode(ChannelBuffer buf) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder.offer(buf);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollDecodeResult();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.wrappedBuffer(decoder.pollAll(new ChannelBuffer[decoder.size()]));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelBuffer finishDecode() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder.finish()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollDecodeResult();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.wrappedBuffer(decoder.pollAll(new ChannelBuffer[decoder.size()]));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelBuffer pollDecodeResult() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer result = decoder.poll();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result != null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer moreResult = decoder.poll();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (moreResult == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.wrappedBuffer(result, moreResult);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result.readable()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936282&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1865-trunk-src-main-java-org-jboss-netty-handler-codec-http-tp3936282p3936282.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3936209</id>
	<title>r1864 - trunk/src/main/java/org/jboss/netty/buffer.</title>
	<published>2009-11-02T18:34:54Z</published>
	<updated>2009-11-02T18:34:54Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 21:34:54 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1864
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java
&lt;br&gt;Log:
&lt;br&gt;Optimized CompositeChannelBuffer creation
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java	2009-11-02 12:03:14 UTC (rev 1863)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/buffer/ChannelBuffers.java	2009-11-03 02:34:54 UTC (rev 1864)
&lt;br&gt;@@ -19,6 +19,8 @@
&lt;br&gt;&amp;nbsp;import java.nio.ByteBuffer;
&lt;br&gt;&amp;nbsp;import java.nio.ByteOrder;
&lt;br&gt;&amp;nbsp;import java.nio.charset.UnsupportedCharsetException;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.List;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;@@ -338,16 +340,34 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer[] wrappedBuffers = new ChannelBuffer[arrays.length];
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; arrays.length; i ++) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wrappedBuffers[i] = wrappedBuffer(endianness, arrays[i]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Get the list of the component, while guessing the byte order.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; components = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(arrays.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (byte[] a: arrays) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a.length &amp;gt; 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.add(wrappedBuffer(endianness, a));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return wrappedBuffer(wrappedBuffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return compositeBuffer(endianness, components);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static ChannelBuffer compositeBuffer(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder endianness, List&amp;lt;ChannelBuffer&amp;gt; components) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (components.size()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return components.get(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(endianness, components);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new composite buffer which wraps the readable bytes of the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * specified buffers without copying them. &amp;nbsp;A modification on the content
&lt;br&gt;@@ -367,11 +387,33 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ChannelBuffer b: buffers) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (b.readable()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(buffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder order = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; components = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(buffers.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ChannelBuffer c: buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (order != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!order.equals(c.order())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;inconsistent byte order&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = c.order();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c instanceof CompositeChannelBuffer) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Expand nested composition.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.addAll(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((CompositeChannelBuffer) c).decompose(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c.readerIndex(), c.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// An ordinary buffer (non-composite)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.add(c.slice());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return compositeBuffer(order, components);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -395,11 +437,25 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer[] wrappedBuffers = new ChannelBuffer[buffers.length];
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; buffers.length; i ++) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;wrappedBuffers[i] = wrappedBuffer(buffers[i]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder order = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; components = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(buffers.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ByteBuffer b: buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (b == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (b.hasRemaining()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (order != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!order.equals(b.order())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;inconsistent byte order&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = b.order();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;components.add(wrappedBuffer(b));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return wrappedBuffer(wrappedBuffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return compositeBuffer(order, components);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return EMPTY_BUFFER;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java	2009-11-02 12:03:14 UTC (rev 1863)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/buffer/CompositeChannelBuffer.java	2009-11-03 02:34:54 UTC (rev 1864)
&lt;br&gt;@@ -48,44 +48,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int[] indices;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int lastAccessedComponentId;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public CompositeChannelBuffer(ChannelBuffer... buffers) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (buffers.length == 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;buffers should not be empty.&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Get the list of the component, while guessing the byte order.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteOrder expectedEndianness = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final List&amp;lt;ChannelBuffer&amp;gt; newComponents = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(buffers.length);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (ChannelBuffer c: buffers) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c.readableBytes() &amp;gt; 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedEndianness = c.order();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (c instanceof CompositeChannelBuffer) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Expand nested composition.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newComponents.addAll(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((CompositeChannelBuffer) c).slice0(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c.readerIndex(), c.readableBytes()));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// An ordinary buffer (non-composite)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newComponents.add(c.slice());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (c.capacity() != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedEndianness = c.order();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (expectedEndianness == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;buffers have only empty buffers.&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = expectedEndianness;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setComponents(newComponents);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public CompositeChannelBuffer(ByteOrder endianness, List&amp;lt;ChannelBuffer&amp;gt; buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;order = endianness;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setComponents(buffers);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;* Same with {@link #slice(int, int)} except that this method returns a list.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;*/
&lt;br&gt;- &amp;nbsp; private List&amp;lt;ChannelBuffer&amp;gt; slice0(int index, int length) {
&lt;br&gt;+ &amp;nbsp; public List&amp;lt;ChannelBuffer&amp;gt; decompose(int index, int length) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (length == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return Collections.emptyList();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;@@ -556,9 +527,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; listBuffer = slice0(index, length);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer[] buffers = listBuffer.toArray(new ChannelBuffer[listBuffer.size()]);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(buffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; components = decompose(index, length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (components.size()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 0:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return components.get(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new CompositeChannelBuffer(order(), components);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ByteBuffer toByteBuffer(int index, int length) {
&lt;br&gt;@@ -667,7 +644,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int localWriterIndex = this.writerIndex();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int bytesToMove = capacity() - localReaderIndex;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; list = slice0(localReaderIndex, bytesToMove);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; list = decompose(localReaderIndex, bytesToMove);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Add a new buffer so that the capacity of this composite buffer does
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// not decrease due to the discarded components.
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3936209&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1864-trunk-src-main-java-org-jboss-netty-buffer-tp3936209p3936209.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3931397</id>
	<title>r1863 - trunk/src/main/java/org/jboss/netty/handler/codec/embedder.</title>
	<published>2009-11-02T04:03:15Z</published>
	<updated>2009-11-02T04:03:15Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 07:03:14 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1863
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java
&lt;br&gt;Log:
&lt;br&gt;Better pollAll implementation 
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java	2009-11-02 12:01:19 UTC (rev 1862)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java	2009-11-02 12:03:14 UTC (rev 1863)
&lt;br&gt;@@ -18,6 +18,7 @@
&lt;br&gt;&amp;nbsp;import static org.jboss.netty.channel.Channels.*;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import java.lang.reflect.Array;
&lt;br&gt;+import java.util.ConcurrentModificationException;
&lt;br&gt;&amp;nbsp;import java.util.LinkedList;
&lt;br&gt;&amp;nbsp;import java.util.Queue;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -135,7 +136,16 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public final Object[] pollAll() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollAll(new Object[size()]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int size = size();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object[] a = new Object[size];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0; i &amp;lt; size; i ++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;E product = poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (product == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ConcurrentModificationException();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[i] = product;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return a;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3931397&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1863-trunk-src-main-java-org-jboss-netty-handler-codec-embedder-tp3931397p3931397.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3931385</id>
	<title>r1862 - trunk/src/main/java/org/jboss/netty/handler/codec/embedder.</title>
	<published>2009-11-02T04:01:19Z</published>
	<updated>2009-11-02T04:01:19Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 07:01:19 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1862
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java
&lt;br&gt;Log:
&lt;br&gt;Resolved issue: NETTY-245 More convenience methods in CodecEmbedder
&lt;br&gt;* Added CodecEmbedder.size()
&lt;br&gt;* Added CodecEmbedder.pollAll()
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java	2009-11-02 09:58:30 UTC (rev 1861)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/embedder/AbstractCodecEmbedder.java	2009-11-02 12:01:19 UTC (rev 1862)
&lt;br&gt;@@ -17,6 +17,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import static org.jboss.netty.channel.Channels.*;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+import java.lang.reflect.Array;
&lt;br&gt;&amp;nbsp;import java.util.LinkedList;
&lt;br&gt;&amp;nbsp;import java.util.Queue;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -41,7 +42,7 @@
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3931385&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-abstract class AbstractCodecEmbedder&amp;lt;T&amp;gt; implements CodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+abstract class AbstractCodecEmbedder&amp;lt;E&amp;gt; implements CodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Channel channel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ChannelPipeline pipeline;
&lt;br&gt;@@ -124,15 +125,52 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public final T poll() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (T) productQueue.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final E poll() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (E) productQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public final T peek() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (T) productQueue.peek();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final E peek() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (E) productQueue.peek();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final Object[] pollAll() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollAll(new Object[size()]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final &amp;lt;T&amp;gt; T[] pollAll(T[] a) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;a&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final int size = size();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Create a new array if the specified one is too small.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a.length &amp;lt; size) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a = (T[]) Array.newInstance(a.getClass().getComponentType(), size);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (int i = 0;; i ++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;T product = (T) poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (product == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[i] = product;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Put the terminator if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (a.length &amp;gt; size) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a[size] = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return a;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public final int size() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return productQueue.size();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;all&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final class EmbeddedChannelSink implements ChannelSink, ChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EmbeddedChannelSink() {
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java	2009-11-02 09:58:30 UTC (rev 1861)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/embedder/CodecEmbedder.java	2009-11-02 12:01:19 UTC (rev 1862)
&lt;br&gt;@@ -15,6 +15,8 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.handler.codec.embedder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+import java.util.Collection;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * A helper that wraps an encoder or a decoder (codec) so that they can be used
&lt;br&gt;&amp;nbsp; * without doing actual I/O in unit tests or higher level codecs. &amp;nbsp;Please refer
&lt;br&gt;@@ -24,7 +26,7 @@
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3931385&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-public interface CodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+public interface CodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Offers an input object to the pipeline of this embedder.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;@@ -50,7 +52,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} if and only if there is no output object left in the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; product queue.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;T poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;E poll();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Reads an encoded or decoded output from the head of the product queue.
&lt;br&gt;@@ -61,5 +63,34 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} if and only if there is no output object left in the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; product queue.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;T peek();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;E peek();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Consumes all encoded or decoded output from the product queue. &amp;nbsp;The
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * output object is generated by the offered input objects. &amp;nbsp;The behavior
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * of this method is identical with {@link Collection#toArray()} except that
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * the product queue is cleared.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return an array of all encoded or decoded objects.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; An empty array is returned if and only if there is no output
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object left in the product queue.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Object[] pollAll();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Consumes all encoded or decoded output from the product queue. &amp;nbsp;The
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * output object is generated by the offered input objects. &amp;nbsp;The behavior
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * of this method is identical with {@link Collection#toArray(Object[])}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * except that the product queue is cleared.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return an array of all encoded or decoded objects.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; An empty array is returned if and only if there is no output
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; object left in the product queue.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;T&amp;gt; T[] pollAll(T[] a);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the number of encoded or decoded output in the product queue.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int size();
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java	2009-11-02 09:58:30 UTC (rev 1861)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/embedder/DecoderEmbedder.java	2009-11-02 12:01:19 UTC (rev 1862)
&lt;br&gt;@@ -49,7 +49,7 @@
&lt;br&gt;&amp;nbsp; * @apiviz.landmark
&lt;br&gt;&amp;nbsp; * @see EncoderEmbedder
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-public class DecoderEmbedder&amp;lt;T&amp;gt; extends AbstractCodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+public class DecoderEmbedder&amp;lt;E&amp;gt; extends AbstractCodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new embedder whose pipeline is composed of the specified
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java	2009-11-02 09:58:30 UTC (rev 1861)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/embedder/EncoderEmbedder.java	2009-11-02 12:01:19 UTC (rev 1862)
&lt;br&gt;@@ -49,7 +49,7 @@
&lt;br&gt;&amp;nbsp; * @apiviz.landmark
&lt;br&gt;&amp;nbsp; * @see DecoderEmbedder
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;-public class EncoderEmbedder&amp;lt;T&amp;gt; extends AbstractCodecEmbedder&amp;lt;T&amp;gt; {
&lt;br&gt;+public class EncoderEmbedder&amp;lt;E&amp;gt; extends AbstractCodecEmbedder&amp;lt;E&amp;gt; {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new embedder whose pipeline is composed of the specified
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3931385&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1862-trunk-src-main-java-org-jboss-netty-handler-codec-embedder-tp3931385p3931385.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930831</id>
	<title>r1861 - trunk/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-02T01:58:30Z</published>
	<updated>2009-11-02T01:58:30Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 04:58:30 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1861
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;Log:
&lt;br&gt;Added HttpContentDecoder.getTargetEncoding
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-02 09:35:33 UTC (rev 1860)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-02 09:58:30 UTC (rev 1861)
&lt;br&gt;@@ -78,7 +78,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null &amp;&amp; (decoder = newDecoder(contentEncoding)) != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content and remove or replace the existing headers
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(HttpHeaders.Names.CONTENT_ENCODING, HttpHeaders.Values.IDENTITY);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_ENCODING,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getTargetEncoding(contentEncoding));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;@@ -165,6 +167,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newDecoder(String contentEncoding) throws Exception;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the expected content encoding of the decoded content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * This method returns {@code &amp;quot;identity&amp;quot;} by default, which is the case for
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * most decoders.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param contentEncoding the content encoding of the original content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the expected content encoding of the new content
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected String getTargetEncoding(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return HttpHeaders.Values.IDENTITY;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelBuffer decode(ChannelBuffer buf) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder.offer(buf);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollDecodeResult();
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930831&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1861-trunk-src-main-java-org-jboss-netty-handler-codec-http-tp3930831p3930831.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930731</id>
	<title>r1860 - trunk/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-02T01:35:33Z</published>
	<updated>2009-11-02T01:35:33Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 04:35:33 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1860
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;Log:
&lt;br&gt;Renamed beginDecode() to newDecoder()
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-02 09:21:41 UTC (rev 1859)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-02 09:35:33 UTC (rev 1860)
&lt;br&gt;@@ -28,15 +28,15 @@
&lt;br&gt;&amp;nbsp; * Decodes the content of the received {@link HttpMessage} and {@link HttpChunk}.
&lt;br&gt;&amp;nbsp; * The original content ({@link HttpMessage#getContent()} or {@link HttpChunk#getContent()})
&lt;br&gt;&amp;nbsp; * is replaced with the new content decoded by the {@link DecoderEmbedder},
&lt;br&gt;- * which is created by {@link #beginDecode(String)}. &amp;nbsp;Once decoding is finished,
&lt;br&gt;+ * which is created by {@link #newDecoder(String)}. &amp;nbsp;Once decoding is finished,
&lt;br&gt;&amp;nbsp; * the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt; header is set to &amp;lt;tt&amp;gt;'identity'&amp;lt;/tt&amp;gt;
&lt;br&gt;&amp;nbsp; * and the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;&amp;nbsp; * decoded content. &amp;nbsp;If the content encoding of the original is not supported
&lt;br&gt;- * by the decoder, {@link #beginDecode(String)} returns {@code null} and no
&lt;br&gt;+ * by the decoder, {@link #newDecoder(String)} returns {@code null} and no
&lt;br&gt;&amp;nbsp; * decoding occurs (i.e. pass-through).
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;- * and implement {@link #beginDecode(String)} properly to make this class
&lt;br&gt;+ * and implement {@link #newDecoder(String)} properly to make this class
&lt;br&gt;&amp;nbsp; * functional. &amp;nbsp;For example, refer to the source code of {@link HttpContentDecompressor}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930731&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -75,7 +75,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = contentEncoding.trim();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null &amp;&amp; (decoder = beginDecode(contentEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null &amp;&amp; (decoder = newDecoder(contentEncoding)) != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content and remove or replace the existing headers
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(HttpHeaders.Names.CONTENT_ENCODING, HttpHeaders.Values.IDENTITY);
&lt;br&gt;@@ -163,7 +163,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} otherwise (alternatively, you can throw an exception
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to block unknown encoding).
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; beginDecode(String contentEncoding) throws Exception;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newDecoder(String contentEncoding) throws Exception;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelBuffer decode(ChannelBuffer buf) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder.offer(buf);
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-02 09:21:41 UTC (rev 1859)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-02 09:35:33 UTC (rev 1860)
&lt;br&gt;@@ -43,7 +43,7 @@
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp;public class HttpContentDecompressor extends HttpContentDecoder {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; beginDecode(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; newDecoder(String contentEncoding) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (&amp;quot;gzip&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-gzip&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.GZIP));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (&amp;quot;deflate&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-deflate&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930731&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1860-trunk-src-main-java-org-jboss-netty-handler-codec-http-tp3930731p3930731.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930666</id>
	<title>r1859 - trunk/src/main/java/org/jboss/netty/channel/socket/nio.</title>
	<published>2009-11-02T01:21:41Z</published>
	<updated>2009-11-02T01:21:41Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 04:21:41 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1859
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java
&lt;br&gt;Log:
&lt;br&gt;* Slight code clean up
&lt;br&gt;* Raised the default cancelled key clean up interval from 128 to 256
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java	2009-11-02 09:21:13 UTC (rev 1858)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java	2009-11-02 09:21:41 UTC (rev 1859)
&lt;br&gt;@@ -361,7 +361,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean cleanUpCancelledKeys() throws IOException {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cancelledKeys &amp;gt;= 128) { // FIXME hardcoded value
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cancelledKeys &amp;gt;= NioWorker.CLEANUP_INTERVAL) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelledKeys = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.selectNow();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java	2009-11-02 09:21:13 UTC (rev 1858)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java	2009-11-02 09:21:41 UTC (rev 1859)
&lt;br&gt;@@ -65,6 +65,8 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int CONSTRAINT_LEVEL = NioProviderMetadata.CONSTRAINT_LEVEL;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int CLEANUP_INTERVAL = 256; // XXX Hard-coded value, but won't need customization.
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int bossId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int id;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final Executor executor;
&lt;br&gt;@@ -292,7 +294,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean cleanUpCancelledKeys() throws IOException {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cancelledKeys &amp;gt;= 128) { // FIXME hardcoded value
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (cancelledKeys &amp;gt;= CLEANUP_INTERVAL) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cancelledKeys = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;selector.selectNow();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930666&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1859-trunk-src-main-java-org-jboss-netty-channel-socket-nio-tp3930666p3930666.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930663</id>
	<title>r1858 - in trunk/src/main/java/org/jboss/netty: handler/codec/http and 1 other directory.</title>
	<published>2009-11-02T01:21:13Z</published>
	<updated>2009-11-02T01:21:13Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 04:21:13 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1858
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;Removed:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpDecompressionHandler.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java
&lt;br&gt;Log:
&lt;br&gt;Split HttpDecompressionHandler into HttpContentDecoder and HttpContentDecompressor
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java	2009-11-02 06:38:53 UTC (rev 1857)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java	2009-11-02 09:21:13 UTC (rev 1858)
&lt;br&gt;@@ -19,7 +19,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpDecompressionHandler;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpContentDecompressor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequestEncoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponseDecoder;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -36,7 +36,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;decoder&amp;quot;, new HttpResponseDecoder());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Remove the following line if you don't want automatic content decompression.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;inflater&amp;quot;, new HttpDecompressionHandler());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;inflater&amp;quot;, new HttpContentDecompressor());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Uncomment the following line if you don't want to handle HttpChunks.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(1048576));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;encoder&amp;quot;, new HttpRequestEncoder());
&lt;br&gt;&lt;br&gt;Copied: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java (from rev 1854, trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpDecompressionHandler.java)
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecoder.java	2009-11-02 09:21:13 UTC (rev 1858)
&lt;br&gt;@@ -0,0 +1,199 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffers;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Decodes the content of the received {@link HttpMessage} and {@link HttpChunk}.
&lt;br&gt;+ * The original content ({@link HttpMessage#getContent()} or {@link HttpChunk#getContent()})
&lt;br&gt;+ * is replaced with the new content decoded by the {@link DecoderEmbedder},
&lt;br&gt;+ * which is created by {@link #beginDecode(String)}. &amp;nbsp;Once decoding is finished,
&lt;br&gt;+ * the value of the &amp;lt;tt&amp;gt;'Content-Encoding'&amp;lt;/tt&amp;gt; header is set to &amp;lt;tt&amp;gt;'identity'&amp;lt;/tt&amp;gt;
&lt;br&gt;+ * and the &amp;lt;tt&amp;gt;'Content-Length'&amp;lt;/tt&amp;gt; header is updated to the length of the
&lt;br&gt;+ * decoded content. &amp;nbsp;If the content encoding of the original is not supported
&lt;br&gt;+ * by the decoder, {@link #beginDecode(String)} returns {@code null} and no
&lt;br&gt;+ * decoding occurs (i.e. pass-through).
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * Please note that this is an abstract class. &amp;nbsp;You have to extend this class
&lt;br&gt;+ * and implement {@link #beginDecode(String)} properly to make this class
&lt;br&gt;+ * functional. &amp;nbsp;For example, refer to the source code of {@link HttpContentDecompressor}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public abstract class HttpContentDecoder extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile HttpMessage previous;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; decoder;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new instance.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpContentDecoder() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (msg instanceof HttpMessage) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.isChunked()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = m;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Determine the content encoding.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String contentEncoding = m.getHeader(HttpHeaders.Names.CONTENT_ENCODING);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = contentEncoding.trim();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null &amp;&amp; (decoder = beginDecode(contentEncoding)) != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the content and remove or replace the existing headers
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like a decoded message.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(HttpHeaders.Names.CONTENT_ENCODING, HttpHeaders.Values.IDENTITY);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!m.isChunked()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decode(content);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Finish decoding.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishDecode();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Merge the last product into the content.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = lastProduct;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = ChannelBuffers.wrappedBuffer(content, lastProduct);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Replace the content if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Because HttpMessage is a mutable object, we can simply forward the received event.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (msg instanceof HttpChunk) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert previous != null;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpChunk c = (HttpChunk) msg;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = c.getContent();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decode the chunk if necessary.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!c.isLast()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decode(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Note that HttpChunk is immutable unlike HttpMessage.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX API inconsistency? I can live with it though.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(ctx, new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer lastProduct = finishDecode();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder = null;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Generate an additional chunk if the decoder produced
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// the last product on closure,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lastProduct != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new DefaultHttpChunk(lastProduct),
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Emit the last chunk.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns a new {@link DecoderEmbedder} that decodes the HTTP message
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * content encoded in the specified &amp;lt;tt&amp;gt;contentEncoding&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param contentEncoding the value of the {@code &amp;quot;Content-Encoding&amp;quot;} header
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return a new {@link DecoderEmbedder} if the specified encoding is supported.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {@code null} otherwise (alternatively, you can throw an exception
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; to block unknown encoding).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected abstract DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; beginDecode(String contentEncoding) throws Exception;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer decode(ChannelBuffer buf) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decoder.offer(buf);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollDecodeResult();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer finishDecode() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (decoder.finish()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollDecodeResult();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer pollDecodeResult() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer result = decoder.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (;;) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer moreResult = decoder.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (moreResult == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;result = ChannelBuffers.wrappedBuffer(result, moreResult);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (result.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return result;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java	2009-11-02 09:21:13 UTC (rev 1858)
&lt;br&gt;@@ -0,0 +1,56 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.handler.codec.http;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibDecoder;
&lt;br&gt;+import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;+import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
&lt;br&gt;+ * {@code gzip} or {@code deflate} encoding. &amp;nbsp;Insert this handler after
&lt;br&gt;+ * {@link HttpMessageDecoder} in the {@link ChannelPipeline}:
&lt;br&gt;+ * &amp;lt;pre&amp;gt;
&lt;br&gt;+ * ChannelPipeline p = ...;
&lt;br&gt;+ * ...
&lt;br&gt;+ * p.addLast(&amp;quot;decoder&amp;quot;, new HttpRequestDecoder());
&lt;br&gt;+ * p.addLast(&amp;quot;inflater&amp;quot;, &amp;lt;b&amp;gt;new HttpContentDecomperssor()&amp;lt;/b&amp;gt;);
&lt;br&gt;+ * ...
&lt;br&gt;+ * p.addLast(&amp;quot;encoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;+ * p.addLast(&amp;quot;handler&amp;quot;, new HttpRequestHandler());
&lt;br&gt;+ * &amp;lt;/pre&amp;gt;
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public class HttpContentDecompressor extends HttpContentDecoder {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; beginDecode(String contentEncoding) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (&amp;quot;gzip&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-gzip&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.GZIP));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (&amp;quot;deflate&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-deflate&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.ZLIB));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 'identity' or unsupported
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpContentDecompressor.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Deleted: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpDecompressionHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpDecompressionHandler.java	2009-11-02 06:38:53 UTC (rev 1857)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpDecompressionHandler.java	2009-11-02 09:21:13 UTC (rev 1858)
&lt;br&gt;@@ -1,154 +0,0 @@
&lt;br&gt;-/*
&lt;br&gt;- * Copyright 2009 Red Hat, Inc.
&lt;br&gt;- *
&lt;br&gt;- * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;- * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;- * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;- *
&lt;br&gt;- * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;- *
&lt;br&gt;- * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;- * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;- * License for the specific language governing permissions and limitations
&lt;br&gt;- * under the License.
&lt;br&gt;- */
&lt;br&gt;-package org.jboss.netty.handler.codec.http;
&lt;br&gt;-
&lt;br&gt;-import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;-import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;-import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;-import org.jboss.netty.channel.Channels;
&lt;br&gt;-import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;-import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
&lt;br&gt;-import org.jboss.netty.handler.codec.compression.ZlibDecoder;
&lt;br&gt;-import org.jboss.netty.handler.codec.compression.ZlibWrapper;
&lt;br&gt;-import org.jboss.netty.handler.codec.embedder.DecoderEmbedder;
&lt;br&gt;-
&lt;br&gt;-/**
&lt;br&gt;- * Decompresses an {@link HttpMessage} and an {@link HttpChunk} compressed in
&lt;br&gt;- * {@code gzip}, {@code deflate}, and {@code compress} encoding. &amp;nbsp;During the
&lt;br&gt;- * decompression, the {@code &amp;quot;Content-Encoding&amp;quot;} header is removed and the
&lt;br&gt;- * value of the {@code &amp;quot;Content-Length&amp;quot;} header is updated with the length
&lt;br&gt;- * of the decompressed content. &amp;nbsp;If the received message is not compressed,
&lt;br&gt;- * no modification is made. &amp;nbsp;To use this handler, place it after
&lt;br&gt;- * {@link HttpMessageDecoder} in the pipeline.
&lt;br&gt;- *
&lt;br&gt;- * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @version $Rev$, $Date$
&lt;br&gt;- */
&lt;br&gt;-@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;-public class HttpDecompressionHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile HttpMessage previous;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile int previousEncoding; // 0 - no compression, 1 - gzip, 2 - deflate, 3 - lzw
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt; inflater;
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object msg = e.getMessage();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (msg instanceof HttpMessage) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpMessage m = (HttpMessage) msg;
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Determine the content encoding.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String contentEncoding = m.getHeader(HttpHeaders.Names.CONTENT_ENCODING);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contentEncoding = contentEncoding.trim();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int encoding;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (&amp;quot;gzip&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-gzip&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoding = 1;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (&amp;quot;deflate&amp;quot;.equalsIgnoreCase(contentEncoding) || &amp;quot;x-deflate&amp;quot;.equalsIgnoreCase(contentEncoding)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoding = 2;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// FIXME Implement 'compress' encoding (lzw)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoding = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.isChunked()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = m;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previousEncoding = encoding;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previousEncoding = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decompress the content and remove or replace the existing headers
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// so that the message looks like an uncompressed message.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (encoding != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (contentEncoding != null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(HttpHeaders.Names.CONTENT_ENCODING, HttpHeaders.Values.IDENTITY);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = m.getContent();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (content.readable()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;beginDecompression(encoding);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decompress(content);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setContent(content);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (m.containsHeader(HttpHeaders.Names.CONTENT_LENGTH)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;m.setHeader(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpHeaders.Names.CONTENT_LENGTH,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Integer.toString(content.readableBytes()));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Because HttpMessage is a mutable object, we can simply forward the received event.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (msg instanceof HttpChunk) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assert previous != null;
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpChunk c = (HttpChunk) msg;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = c.getContent();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Decompress the chunk if necessary.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (previousEncoding != 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!c.isLast()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;content = decompress(content);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// HttpChunk is immutable unlike HttpMessage.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX API inconsistency? I can live with it though.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(ctx, new DefaultHttpChunk(content), e.getRemoteAddress());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;finishDecompression();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previous = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;previousEncoding = 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// No need to
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(e);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private void beginDecompression(int encoding) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (encoding) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 1:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflater = new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.GZIP));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case 2:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflater = new DecoderEmbedder&amp;lt;ChannelBuffer&amp;gt;(new ZlibDecoder(ZlibWrapper.ZLIB));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;break;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;default:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new Error();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelBuffer decompress(ChannelBuffer buf) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inflater.offer(buf);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// FIXME Some inflater might produce either an empty buffer or many buffers.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; Empty buffer should not generate an event and many buffers should generate many events.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return inflater.poll();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private void finishDecompression() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (inflater.finish()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalStateException(&amp;quot;trailing data produced by inflater&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO Make sure ZlibDecoder.isClosed() is true.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp;The compressed stream ended prematurely if false.
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-}
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930663&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1858-in-trunk-src-main-java-org-jboss-netty-handler-codec-http-and-1-other-directory-tp3930663p3930663.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930205</id>
	<title>r1857 - trunk/src/main/java/org/jboss/netty/example/qotm.</title>
	<published>2009-11-01T22:38:53Z</published>
	<updated>2009-11-01T22:38:53Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 01:38:53 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1857
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java
&lt;br&gt;Log:
&lt;br&gt;Updated the QOTM example so that people do not ask questions about truncated packets
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java	2009-11-02 06:34:16 UTC (rev 1856)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java	2009-11-02 06:38:53 UTC (rev 1857)
&lt;br&gt;@@ -55,6 +55,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(&amp;quot;broadcast&amp;quot;, &amp;quot;true&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Allow packets as large as up to 1024 bytes (default is 768).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// You could increase or decrease this value to avoid truncated packets
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// or to improve memory footprint respectively.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;receiveBufferSizePredictorFactory&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(1024));
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java	2009-11-02 06:34:16 UTC (rev 1856)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java	2009-11-02 06:38:53 UTC (rev 1857)
&lt;br&gt;@@ -54,6 +54,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(&amp;quot;broadcast&amp;quot;, &amp;quot;false&amp;quot;);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Allow packets as large as up to 1024 bytes (default is 768).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// You could increase or decrease this value to avoid truncated packets
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// or to improve memory footprint respectively.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;receiveBufferSizePredictorFactory&amp;quot;,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(1024));
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930205&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1857-trunk-src-main-java-org-jboss-netty-example-qotm-tp3930205p3930205.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930190</id>
	<title>r1856 - trunk/src/main/java/org/jboss/netty/example/qotm.</title>
	<published>2009-11-01T22:34:16Z</published>
	<updated>2009-11-01T22:34:16Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 01:34:16 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1856
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java
&lt;br&gt;Log:
&lt;br&gt;Updated the QOTM example so that people do not ask questions about truncated packets
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentClient.java	2009-11-02 06:34:16 UTC (rev 1856)
&lt;br&gt;@@ -20,6 +20,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannelFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.oio.OioDatagramChannelFactory;
&lt;br&gt;@@ -43,12 +44,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new OioDatagramChannelFactory(Executors.newCachedThreadPool());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConnectionlessBootstrap b = new ConnectionlessBootstrap(f);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Configure the pipeline.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline p = b.getPipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;encoder&amp;quot;, new StringEncoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;decoder&amp;quot;, new StringDecoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;handler&amp;quot;, new QuoteOfTheMomentClientHandler());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Enable broadcast
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(&amp;quot;broadcast&amp;quot;, &amp;quot;true&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Allow packets as large as up to 1024 bytes (default is 768).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;receiveBufferSizePredictorFactory&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(1024));
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DatagramChannel c = (DatagramChannel) b.bind(new InetSocketAddress(0));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Broadcast the QOTM request to port 8080.
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/qotm/QuoteOfTheMomentServer.java	2009-11-02 06:34:16 UTC (rev 1856)
&lt;br&gt;@@ -20,6 +20,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.bootstrap.ConnectionlessBootstrap;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannelFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.oio.OioDatagramChannelFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.string.StringDecoder;
&lt;br&gt;@@ -42,12 +43,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new OioDatagramChannelFactory(Executors.newCachedThreadPool());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConnectionlessBootstrap b = new ConnectionlessBootstrap(f);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Configure the pipeline.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline p = b.getPipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;encoder&amp;quot;, new StringEncoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;decoder&amp;quot;, new StringDecoder(&amp;quot;UTF-8&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;p.addLast(&amp;quot;handler&amp;quot;, new QuoteOfTheMomentServerHandler());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Enable broadcast
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(&amp;quot;broadcast&amp;quot;, &amp;quot;false&amp;quot;);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Allow packets as large as up to 1024 bytes (default is 768).
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.setOption(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;receiveBufferSizePredictorFactory&amp;quot;,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(1024));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Bind to the port and start the service.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.bind(new InetSocketAddress(8080));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930190&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1856-trunk-src-main-java-org-jboss-netty-example-qotm-tp3930190p3930190.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3930176</id>
	<title>r1855 - in trunk/src/main/java/org/jboss/netty/channel: socket and 2 other directories.</title>
	<published>2009-11-01T22:30:10Z</published>
	<updated>2009-11-01T22:30:10Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-02 01:30:10 -0500 (Mon, 02 Nov 2009)
&lt;br&gt;New Revision: 1855
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java
&lt;br&gt;Log:
&lt;br&gt;Resolved issue: NETTY-244 ReceiveBufferSizePredictorFactory
&lt;br&gt;* Added ReceiveBufferSizePredictorFactory
&lt;br&gt;* Added AdaptiveReceiveBufferSizePredictorFactory
&lt;br&gt;* Added FixedReceiveBufferSizePredictorFactory
&lt;br&gt;* Added get/setReceiveBufferSizePredictorFactory() to all related ChannelConfig interfaces and implementations
&lt;br&gt;* More accurate documentation on the default predictors
&lt;br&gt;* the default predictors are null internally and created lazily on demand to reduce footprint
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictor.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -37,8 +37,9 @@
&lt;br&gt;&amp;nbsp;public class AdaptiveReceiveBufferSizePredictor implements
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;// FIXME There's no easy way to configure receiveBufferSizePredictor
&lt;br&gt;- &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; via Bootstrap.setOption() because it works for only one channel.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int DEFAULT_MINIMUM = 64;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int DEFAULT_INITIAL = 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final int DEFAULT_MAXIMUM = 65536;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int INDEX_INCREMENT = 4;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int INDEX_DECREMENT = 1;
&lt;br&gt;@@ -97,10 +98,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new Error(&amp;quot;shouldn't reach here; please file a bug report.&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final int DEFAULT_MINIMUM = 64;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final int DEFAULT_INITIAL = 1024;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final int DEFAULT_MAXIMUM = 65536;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int minIndex;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxIndex;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int index;
&lt;br&gt;&lt;br&gt;Added: trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -0,0 +1,72 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * The {@link ReceiveBufferSizePredictorFactory} that creates a new
&lt;br&gt;+ * {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ *
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public class AdaptiveReceiveBufferSizePredictorFactory implements
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int minimum;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int initial;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final int maximum;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new factory with the default parameters. &amp;nbsp;With the default
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * parameters, the expected buffer size starts from {@code 1024}, does not
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * go down below {@code 64}, and does not go up above {@code 65536}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AdaptiveReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(AdaptiveReceiveBufferSizePredictor.DEFAULT_MINIMUM,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AdaptiveReceiveBufferSizePredictor.DEFAULT_INITIAL,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AdaptiveReceiveBufferSizePredictor.DEFAULT_MAXIMUM);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new factory with the specified parameters.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; *
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param minimum &amp;nbsp;the inclusive lower bound of the expected buffer size
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param initial &amp;nbsp;the initial buffer size when no feed back was received
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param maximum &amp;nbsp;the inclusive upper bound of the expected buffer size
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AdaptiveReceiveBufferSizePredictorFactory(int minimum, int initial, int maximum) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (minimum &amp;lt;= 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;minimum: &amp;quot; + minimum);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (initial &amp;lt; minimum) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;initial: &amp;quot; + initial);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (maximum &amp;lt; initial) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;maximum: &amp;quot; + maximum);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.minimum = minimum;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.initial = initial;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.maximum = maximum;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getPredictor() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new AdaptiveReceiveBufferSizePredictor(minimum, initial, maximum);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/channel/AdaptiveReceiveBufferSizePredictorFactory.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Added: trunk/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -0,0 +1,44 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * The {@link ReceiveBufferSizePredictorFactory} that returns a
&lt;br&gt;+ * {@link FixedReceiveBufferSizePredictor} with the pre-defined configuration.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ *
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public class FixedReceiveBufferSizePredictorFactory implements
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ReceiveBufferSizePredictor predictor;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Creates a new factory that returns a {@link FixedReceiveBufferSizePredictor}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * which always returns the same prediction of the specified buffer size.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FixedReceiveBufferSizePredictorFactory(int bufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;predictor = new FixedReceiveBufferSizePredictor(bufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getPredictor() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/channel/FixedReceiveBufferSizePredictorFactory.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Added: trunk/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java	 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(rev 0)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -0,0 +1,32 @@
&lt;br&gt;+/*
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;+ *
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, version 2.0
&lt;br&gt;+ * (the &amp;quot;License&amp;quot;); you may not use this file except in compliance with the
&lt;br&gt;+ * License. &amp;nbsp;You may obtain a copy of the License at:
&lt;br&gt;+ *
&lt;br&gt;+ * &amp;nbsp; &amp;nbsp;&lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;&lt;br&gt;+ *
&lt;br&gt;+ * Unless required by applicable law or agreed to in writing, software
&lt;br&gt;+ * distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS, WITHOUT
&lt;br&gt;+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. &amp;nbsp;See the
&lt;br&gt;+ * License for the specific language governing permissions and limitations
&lt;br&gt;+ * under the License.
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Creates a new {@link ReceiveBufferSizePredictor}.
&lt;br&gt;+ *
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ *
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;+ */
&lt;br&gt;+public interface ReceiveBufferSizePredictorFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns a newly created {@link ReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getPredictor() throws Exception;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/channel/ReceiveBufferSizePredictorFactory.java
&lt;br&gt;___________________________________________________________________
&lt;br&gt;Name: svn:keywords
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ Rev Date
&lt;br&gt;Name: svn:eol-style
&lt;br&gt;&amp;nbsp; &amp;nbsp;+ native
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/DatagramChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -21,7 +21,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.FixedReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * A {@link ChannelConfig} for a {@link DatagramChannel}.
&lt;br&gt;@@ -49,6 +51,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictorFactory&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;sendBufferSize&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setSendBufferSize(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;timeToLive&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setTimeToLive(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;@@ -176,4 +180,24 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link FixedReceiveBufferSizePredictor}(768)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictorFactory} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link FixedReceiveBufferSizePredictorFactory}(768)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link FixedReceiveBufferSizePredictorFactory}(768)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/DefaultDatagramChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -24,8 +24,9 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelException;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.DefaultChannelConfig;
&lt;br&gt;-import org.jboss.netty.channel.FixedReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.FixedReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.util.internal.ConversionUtil;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;@@ -40,9 +41,12 @@
&lt;br&gt;&amp;nbsp;public class DefaultDatagramChannelConfig extends DefaultChannelConfig
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;implements DatagramChannelConfig {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final ReceiveBufferSizePredictorFactory DEFAULT_PREDICTOR_FACTORY =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictorFactory(768);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final DatagramSocket socket;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new FixedReceiveBufferSizePredictor(768);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictorFactory predictorFactory = DEFAULT_PREDICTOR_FACTORY;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Creates a new instance.
&lt;br&gt;@@ -263,13 +267,36 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getReceiveBufferSizePredictor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor = this.predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor = getReceiveBufferSizePredictorFactory().getPredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ChannelException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Failed to create a new &amp;quot; +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor.class.getSimpleName() + '.',
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictor(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictor&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictorFactory == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictorFactory&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictorFactory = predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -18,8 +18,10 @@
&lt;br&gt;&amp;nbsp;import java.net.Socket;
&lt;br&gt;&amp;nbsp;import java.util.Map;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelException;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DefaultSocketChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLoggerFactory;
&lt;br&gt;@@ -40,10 +42,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InternalLogger logger =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InternalLoggerFactory.getInstance(DefaultNioSocketChannelConfig.class);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final ReceiveBufferSizePredictorFactory DEFAULT_PREDICTOR_FACTORY =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferHighWaterMark = 64 * 1024;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferLowWaterMark &amp;nbsp;= 32 * 1024;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictorFactory predictorFactory = DEFAULT_PREDICTOR_FACTORY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeSpinCount = 16;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;DefaultNioSocketChannelConfig(Socket socket) {
&lt;br&gt;@@ -143,6 +148,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getReceiveBufferSizePredictor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor = this.predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor = getReceiveBufferSizePredictorFactory().getPredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ChannelException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Failed to create a new &amp;quot; +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor.class.getSimpleName() + '.',
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -154,6 +170,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictorFactory == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictorFactory&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictorFactory = predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public boolean isReadWriteFair() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;logger.warn(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Detected an access to a deprecated configuration parameter: &amp;quot; +
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -18,10 +18,8 @@
&lt;br&gt;&amp;nbsp;import java.nio.ByteBuffer;
&lt;br&gt;&amp;nbsp;import java.nio.channels.WritableByteChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;-import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.DatagramChannelConfig;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -44,8 +42,6 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;writeSpinCount&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setWriteSpinCount(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;- * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;- * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -108,18 +104,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if the specified value is {@code 0} or less than {@code 0}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setWriteSpinCount(int writeSpinCount);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getReceiveBufferSizePredictor();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -19,9 +19,11 @@
&lt;br&gt;&amp;nbsp;import java.nio.channels.WritableByteChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -46,6 +48,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictorFactory&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;readWriteFair&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReadWriteFair(boolean)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;@@ -113,18 +117,38 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getReceiveBufferSizePredictor();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictorFactory} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @deprecated This property has been replaced by the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@code writeBufferHighWaterMark} and {@code writeBufferLowWaterMark}.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -20,9 +20,11 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.ChannelBufferFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.HeapChannelBufferFactory;
&lt;br&gt;-import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelException;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.logging.InternalLoggerFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.util.internal.ConversionUtil;
&lt;br&gt;@@ -41,12 +43,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InternalLogger logger =
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InternalLoggerFactory.getInstance(DefaultXnioChannelConfig.class);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final ReceiveBufferSizePredictorFactory DEFAULT_PREDICTOR_FACTORY =
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile ChannelBufferFactory bufferFactory = HeapChannelBufferFactory.getInstance();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile ChannelPipelineFactory pipelineFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferHighWaterMark = 64 * 1024;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeBufferLowWaterMark &amp;nbsp;= 32 * 1024;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;new AdaptiveReceiveBufferSizePredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictor predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile ReceiveBufferSizePredictorFactory predictorFactory = DEFAULT_PREDICTOR_FACTORY;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile int writeSpinCount = 16;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;DefaultXnioChannelConfig() {
&lt;br&gt;@@ -145,6 +150,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictor getReceiveBufferSizePredictor() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor predictor = this.predictor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictor == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor = getReceiveBufferSizePredictorFactory().getPredictor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Exception e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new ChannelException(
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;Failed to create a new &amp;quot; +
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor.class.getSimpleName() + '.',
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -156,6 +172,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictor = predictor;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (predictorFactory == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;predictorFactory&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.predictorFactory = predictorFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelPipelineFactory getPipelineFactory() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipelineFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/xnio/XnioChannelConfig.java	2009-11-02 06:30:10 UTC (rev 1855)
&lt;br&gt;@@ -19,8 +19,10 @@
&lt;br&gt;&amp;nbsp;import java.nio.channels.WritableByteChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.AdaptiveReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ReceiveBufferSizePredictor;
&lt;br&gt;+import org.jboss.netty.channel.ReceiveBufferSizePredictorFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;@@ -39,6 +41,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;writeSpinCount&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setWriteSpinCount(int)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictor&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;receiveBufferSizePredictorFactory&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory)}&amp;lt;/td&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;@@ -79,14 +83,34 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictor getReceiveBufferSizePredictor();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which predicts the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * number of readable bytes in the socket receive buffer. &amp;nbsp;The default
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * predictor is {@link AdaptiveReceiveBufferSizePredictor}.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * predictor is &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictor}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictor(ReceiveBufferSizePredictor predictor);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Returns the {@link ReceiveBufferSizePredictorFactory} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ReceiveBufferSizePredictorFactory getReceiveBufferSizePredictorFactory();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Sets the {@link ReceiveBufferSizePredictor} which creates a new
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * {@link ReceiveBufferSizePredictor} when a new channel is created and
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no {@link ReceiveBufferSizePredictor} was set. &amp;nbsp;If no predictor was set
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * for the channel, {@link #setReceiveBufferSizePredictor(ReceiveBufferSizePredictor)}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * will be called with the new predictor. &amp;nbsp;The default factory is
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * &amp;lt;tt&amp;gt;{@link AdaptiveReceiveBufferSizePredictorFactory}(64, 1024, 65536)&amp;lt;/tt&amp;gt;.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;void setReceiveBufferSizePredictorFactory(ReceiveBufferSizePredictorFactory predictorFactory);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3930176&amp;i=7&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1855-in-trunk-src-main-java-org-jboss-netty-channel-socket-and-2-other-directories-tp3930176p3930176.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3917604</id>
	<title>r1854 - trunk/src/main/java/org/jboss/netty/channel.</title>
	<published>2009-10-30T01:02:55Z</published>
	<updated>2009-10-30T01:02:55Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-10-30 04:02:53 -0400 (Fri, 30 Oct 2009)
&lt;br&gt;New Revision: 1854
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java
&lt;br&gt;Log:
&lt;br&gt;Wrong pointer - those tables were moved to ChannelEvent
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java	2009-10-30 08:00:44 UTC (rev 1853)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/SimpleChannelHandler.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;@@ -28,7 +28,7 @@
&lt;br&gt;&amp;nbsp; * or downstream event into more meaningful sub-type event and calls an
&lt;br&gt;&amp;nbsp; * appropriate handler method with the down-cast event. &amp;nbsp;For an upstream
&lt;br&gt;&amp;nbsp; * event, the names of the methods are identical to the upstream event names,
&lt;br&gt;- * as introduced in the {@link ChannelUpstreamHandler} documentation. &amp;nbsp;For a
&lt;br&gt;+ * as introduced in the {@link ChannelEvent} documentation. &amp;nbsp;For a
&lt;br&gt;&amp;nbsp; * downstream event, the names of the methods starts with the name of the
&lt;br&gt;&amp;nbsp; * operation and ends with {@code &amp;quot;Requested&amp;quot;}
&lt;br&gt;&amp;nbsp; * (e.g. {@link #writeRequested(ChannelHandlerContext, MessageEvent) writeRequested}.)
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java	2009-10-30 08:00:44 UTC (rev 1853)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/SimpleChannelUpstreamHandler.java	2009-10-30 08:02:53 UTC (rev 1854)
&lt;br&gt;@@ -25,8 +25,7 @@
&lt;br&gt;&amp;nbsp; * for each event type. &amp;nbsp;This handler down-casts the received upstream event
&lt;br&gt;&amp;nbsp; * into more meaningful sub-type event and calls an appropriate handler method
&lt;br&gt;&amp;nbsp; * with the down-cast event. &amp;nbsp;The names of the methods are identical to the
&lt;br&gt;- * upstream event names, as introduced in the {@link ChannelUpstreamHandler}
&lt;br&gt;- * documentation.
&lt;br&gt;+ * upstream event names, as introduced in the {@link ChannelEvent} documentation.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * Please use {@link SimpleChannelHandler} if you need to implement both
&lt;br&gt;&amp;nbsp; * {@link ChannelUpstreamHandler} and {@link ChannelDownstreamHandler}.
&lt;br&gt;&lt;br&gt;_______________________________________________
&lt;br&gt;netty-commits mailing list
&lt;br&gt;&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3917604&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;&lt;a href=&quot;https://lists.jboss.org/mailman/listinfo/netty-commits&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;https://lists.jboss.org/mailman/listinfo/netty-commits&lt;/a&gt;&lt;br&gt;</content>
	<link rel="alternate" type="text/html" href="http://n2.nabble.com/r1854-trunk-src-main-java-org-jboss-netty-channel-tp3917604p3917604.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-3917596</id>
	<title>r1853 - trunk/src/main/java/org/jboss/netty/channel.</title>
	<published>2009-10-30T01:00:45Z</published>
	<updated>2009-10-30T01:00:45Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-10-30 04:00:44 -0400 (Fri, 30 Oct 2009)
&lt;br&gt;New Revision: 1853
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/ChannelState.java
&lt;br&gt;Log:
&lt;br&gt;Wrong pointer - those tables were moved to ChannelEvent
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/ChannelState.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/ChannelState.java	2009-10-30 07:51:33 UTC (rev 1852)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/ChannelState.java	2009-10-30 08:00:44 UTC (rev 1853)
&lt;br&gt;@@ -72,10 +72,8 @@
&lt;br&gt;&amp;nbsp; * &amp;lt;/tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;/table&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- * To see how a {@link ChannelEvent} is interpreted further, please refer to
&lt;br&gt;- * {@link ChannelUpstreamHandler} and {@link ChannelDownstreamHandler}.
&lt;br&gt;+ * To see how an event is interpreted further, please refer to {@link ChannelEvent}.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- *
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3917596&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Trustin Lee (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=3917596&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;&lt;br&gt;_________