<?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-23T23:52:11Z</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-4056326</id>
	<title>r1920 - branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel.</title>
	<published>2009-11-23T23:52:11Z</published>
	<updated>2009-11-23T23:52:11Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-24 02:52:10 -0500 (Tue, 24 Nov 2009)
&lt;br&gt;New Revision: 1920
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java
&lt;br&gt;Log:
&lt;br&gt;* if( -&amp;gt; if (
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -51,13 +51,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = (HttpRequest)e.getMessage();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOpenTunnelRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (HttpTunnelMessageUtils.isOpenTunnelRequest(request)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleOpenTunnel(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isSendDataRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (HttpTunnelMessageUtils.isSendDataRequest(request)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleSendData(ctx, request);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isReceiveDataRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (HttpTunnelMessageUtils.isReceiveDataRequest(request)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleReceiveData(ctx, request);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isCloseTunnelRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (HttpTunnelMessageUtils.isCloseTunnelRequest(request)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleCloseTunnel(ctx, request);
&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; &amp;nbsp;LOG.warn(&amp;quot;Invalid request received on http tunnel channel&amp;quot;);
&lt;br&gt;@@ -79,7 +79,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void handleCloseTunnel(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnelId == null) {
&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;@@ -92,14 +92,14 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void handleSendData(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnelId == null) {
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;send data request received for tunnel &amp;quot; + tunnelId);
&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;if(request.getContentLength() == 0 || request.getContent() == null || request.getContent().readableBytes() == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (request.getContentLength() == 0 || request.getContent() == null || request.getContent().readableBytes() == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;send data request contained no data on tunnel &amp;quot; + tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -113,7 +113,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void handleReceiveData(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnelId == null) {
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;@@ -124,10 +124,10 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String checkTunnelId(HttpRequest request, ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = HttpTunnelMessageUtils.extractTunnelId(request);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnelId == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;request without a tunnel id received - rejecting&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), HttpTunnelMessageUtils.createRejection(request, &amp;quot;no tunnel id specified in send data request&amp;quot;));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(!messageSwitch.isOpenTunnel(tunnelId)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (!messageSwitch.isOpenTunnel(tunnelId)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;request for unknown tunnel id &amp;quot; + tunnelId + &amp;quot; received - rejecting&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), HttpTunnelMessageUtils.createRejection(request, &amp;quot;tunnel id \&amp;quot;&amp;quot; + tunnelId + &amp;quot;\&amp;quot; is either closed or does not exist&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -25,14 +25,14 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public synchronized void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isCancelled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (future.isCancelled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO: what should the correct behaviour be when a fragment is cancelled?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// cancel all outstanding fragments and cancel the aggregate?
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFutures.remove(future);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!future.isSuccess()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setFailure(future.getCause());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelFuture pendingFuture : pendingFutures) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFuture.cancel();
&lt;br&gt;@@ -40,7 +40,7 @@
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingFutures.isEmpty()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (pendingFutures.isEmpty()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setSuccess();
&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;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -45,15 +45,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof MessageEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (e instanceof MessageEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleMessageEvent((MessageEvent)e);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(e instanceof ChannelStateEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (e instanceof ChannelStateEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleStateEvent((ChannelStateEvent)e);
&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;private void handleMessageEvent(MessageEvent ev) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!(ev.getMessage() instanceof ChannelBuffer)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!(ev.getMessage() instanceof ChannelBuffer)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;Attempt to send data which is not a ChannelBuffer:&amp;quot; + ev.getMessage());
&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;messageSwitch.routeOutboundData(tunnelId, (ChannelBuffer)ev.getMessage(), ev.getFuture());
&lt;br&gt;@@ -63,20 +63,20 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel owner = ev.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(ev.getState()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case OPEN:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(ev.getValue())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Boolean.FALSE.equals(ev.getValue())) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelClosed(owner);
&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;case BOUND:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ev.getValue() == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelUnbound(owner);
&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;case CONNECTED:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ev.getValue() == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelDisconnected(owner);
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -106,7 +106,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverAddress = remoteAddress;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress connectTarget;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(config.getProxyAddress() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (config.getProxyAddress() != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectTarget = config.getProxyAddress();
&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; &amp;nbsp;connectTarget = remoteAddress;
&lt;br&gt;@@ -180,7 +180,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void fullyEstablished() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!bound) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!bound) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bound = true;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelBound(this, getLocalAddress());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -195,7 +195,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(sendChannel, e.getMessage()).addListener(new ChannelFutureListener() {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (future.isSuccess()) {
&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;originalFuture.setSuccess();
&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;originalFuture.setFailure(future.getCause());
&lt;br&gt;@@ -205,7 +205,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public String getServerHostName() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(serverHostName == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (serverHostName == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverHostName = HttpTunnelMessageUtils.convertToHostString(serverAddress);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -223,9 +223,9 @@
&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;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!future.isSuccess()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;completionFuture.setFailure(future.getCause());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(eventsLeft.decrementAndGet() == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (eventsLeft.decrementAndGet() == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;completionFuture.setSuccess();
&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;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -57,11 +57,11 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public boolean setOption(String key, Object value) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(super.setOption(key, value)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (super.setOption(key, value)) {
&lt;br&gt;&amp;nbsp; &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; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(PROXY_ADDRESS_OPTION.equals(key)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (PROXY_ADDRESS_OPTION.equals(key)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setProxyAddress((SocketAddress) value);
&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; &amp;nbsp;return false;
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -32,9 +32,9 @@
&lt;br&gt;&amp;nbsp;class HttpTunnelClientChannelSink extends AbstractChannelSink {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof ChannelStateEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (e instanceof ChannelStateEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleChannelStateEvent((ChannelStateEvent)e);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(e instanceof MessageEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (e instanceof MessageEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleMessageEvent((MessageEvent)e);
&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;@@ -49,21 +49,21 @@
&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;switch(e.getState()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case CONNECTED:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e.getValue() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (e.getValue() != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.onConnectRequest(e.getFuture(), (InetSocketAddress) e.getValue());
&lt;br&gt;&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;channel.onDisconnectRequest(e.getFuture());
&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;case BOUND:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e.getValue() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (e.getValue() != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.onBindRequest((SocketAddress)e.getValue(), e.getFuture());
&lt;br&gt;&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;channel.onUnbindRequest(e.getFuture());
&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;case OPEN:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(e.getValue())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Boolean.FALSE.equals(e.getValue())) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.onCloseRequest(e.getFuture());
&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;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -65,7 +65,7 @@
&lt;br&gt;&amp;nbsp; &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; &amp;nbsp;HttpResponse response = (HttpResponse) e.getMessage();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;OK response received for poll on tunnel &amp;quot; + tunnelId + &amp;quot; after &amp;quot; + rtTime + &amp;quot; ns&amp;quot;);
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -67,7 +67,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnelId == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;connection to &amp;quot; + e.getValue() + &amp;quot; succeeded - sending open tunnel request&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -84,22 +84,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = (HttpResponse)e.getMessage();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long roundTripTime = System.nanoTime() - sendRequestTime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;OK response received for tunnel &amp;quot; + tunnelId + &amp;quot;, after &amp;quot; + roundTripTime + &amp;quot; ns&amp;quot;);
&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;sendNextAfterResponse(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelOpenResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (HttpTunnelMessageUtils.isTunnelOpenResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelId = HttpTunnelMessageUtils.extractCookie(response);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;tunnel open request accepted - id &amp;quot; + tunnelId);
&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;tunnelChannel.onTunnelOpened(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelCloseResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (HttpTunnelMessageUtils.isTunnelCloseResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (disconnecting.get()) {
&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;LOG.info(&amp;quot;server acknowledged disconnect for tunnel &amp;quot; + tunnelId);
&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;LOG.info(&amp;quot;server closed tunnel &amp;quot; + tunnelId);
&lt;br&gt;@@ -116,7 +116,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 void sendNextAfterResponse(ChannelHandlerContext ctx) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.decrementAndGet() &amp;gt; 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (pendingRequestCount.decrementAndGet() &amp;gt; 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;Immediately sending next send request for tunnel &amp;quot; + tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -125,7 +125,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 synchronized void sendQueuedData(ChannelHandlerContext ctx) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (disconnecting.get()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;sending close request for tunnel &amp;quot; + tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -185,7 +185,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;tunnel shutdown requested for send channel of tunnel &amp;quot; + tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!ctx.getChannel().isConnected()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!ctx.getChannel().isConnected()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;send channel of tunnel &amp;quot; + tunnelId + &amp;quot; is already disconnected&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -193,7 +193,7 @@
&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;if(!disconnecting.compareAndSet(false, true)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!disconnecting.compareAndSet(false, true)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;tunnel shutdown process already initiated for tunnel &amp;quot; + tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -203,7 +203,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.postShutdownEvent = postShutdownEvent;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if the channel is idle, send a close request immediately
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&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;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -136,7 +136,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringWriter host = new StringWriter();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetSocketAddress inetSocketAddr = (InetSocketAddress) hostAddress;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetAddress addr = inetSocketAddr.getAddress();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(addr instanceof Inet6Address) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (addr instanceof Inet6Address) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append('[');
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append(addr.getHostAddress());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append(']');
&lt;br&gt;@@ -153,7 +153,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, createCompleteUri(host, uri));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.HOST, host);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.USER_AGENT, USER_AGENT);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnelId != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.COOKIE, tunnelId);
&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;
&lt;br&gt;@@ -216,7 +216,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static boolean hasContents(HttpResponse response, byte[] expectedContents) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(response.getContent() != null 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (response.getContent() != null 
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; response.getContentLength() == expectedContents.length
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; response.getContent().readableBytes() == expectedContents.length) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] compareBytes = new byte[expectedContents.length];
&lt;br&gt;@@ -237,7 +237,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static String extractCookie(HttpResponse response) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(response.containsHeader(HttpHeaders.Names.SET_COOKIE)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (response.containsHeader(HttpHeaders.Names.SET_COOKIE)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response.getHeader(HttpHeaders.Names.SET_COOKIE);
&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;
&lt;br&gt;@@ -267,7 +267,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static Object extractErrorMessage(HttpResponse response) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(response.getContent() == null || response.getContentLength() == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (response.getContent() == null || response.getContentLength() == 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;&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;
&lt;br&gt;@@ -291,7 +291,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static HttpResponse createResponseTemplate(HttpResponseStatus status, ChannelBuffer data) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(data != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (data != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, Integer.toString(data.readableBytes()));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.CONTENT_TYPE, &amp;quot;application/octet-stream&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setContent(data);
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -36,16 +36,16 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof ChannelStateEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (e instanceof ChannelStateEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelStateEvent ev = (ChannelStateEvent) e;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(ev.getState()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case OPEN:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(ev.getValue())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (Boolean.FALSE.equals(ev.getValue())) {
&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;realChannel.close().addListener(new ChannelFutureProxy(e.getFuture()));
&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;break;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case BOUND:
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (ev.getValue() != 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;realChannel.bind((SocketAddress)ev.getValue()).addListener(new ChannelFutureProxy(e.getFuture()));
&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;realChannel.unbind().addListener(new ChannelFutureProxy(e.getFuture()));
&lt;br&gt;@@ -63,7 +63,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;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (future.isSuccess()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamFuture.setSuccess();
&lt;br&gt;&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;upstreamFuture.setFailure(future.getCause());
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -70,7 +70,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void pollOutboundData(String tunnelId, Channel channel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnel == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;Poll request for tunnel &amp;quot; + tunnelId + &amp;quot; which does not exist or already closed&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -78,7 +78,7 @@
&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;if(!tunnel.responseChannel.compareAndSet(null, channel)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!tunnel.responseChannel.compareAndSet(null, channel)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;Duplicate poll request detected for tunnel &amp;quot; + tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -91,13 +91,13 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void sendQueuedData(TunnelInfo state) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConcurrentLinkedQueue&amp;lt;QueuedResponse&amp;gt; queuedData = state.queuedResponses;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(queuedData.peek() == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (queuedData.peek() == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// no data to send, or it has already been dealt with by another thread
&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; &amp;nbsp;Channel responseChannel = state.responseChannel.getAndSet(null);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(responseChannel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (responseChannel == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// no response channel, or another thread has already used it
&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;@@ -110,7 +110,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelFuture originalFuture = messageToSend.writeFuture;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(responseChannel, response).addListener(new ChannelFutureListener() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (future.isSuccess()) {
&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;originalFuture.setSuccess();
&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;originalFuture.setFailure(future.getCause());
&lt;br&gt;@@ -121,7 +121,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void routeInboundData(String tunnelId, ChannelBuffer inboundData) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnel == null) {
&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;@@ -137,7 +137,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void routeOutboundData(String tunnelId, ChannelBuffer data, ChannelFuture writeFuture) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (tunnel == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// tunnel is closed
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;attempt made to send data out on tunnel id &amp;quot; + tunnelId + &amp;quot; which is unknown or closed&amp;quot;);
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -57,7 +57,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = (ChannelBuffer)e.getMessage();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(data.readableBytes() &amp;lt;= splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (data.readableBytes() &amp;lt;= splitThreshold) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.writeRequested(ctx, e);
&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; &amp;nbsp;WriteSplitter splitter = new WriteSplitter(splitThreshold);
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java	2009-11-24 07:52:10 UTC (rev 1920)
&lt;br&gt;@@ -43,7 +43,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int startReadIndex = buffer.readerIndex();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(buffer.readableBytes() &amp;gt; splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (buffer.readableBytes() &amp;gt; splitThreshold) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(buffer.readable()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer chunk = ChannelBuffers.buffer(Math.min(splitThreshold, buffer.readableBytes()));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.readBytes(chunk);
&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=4056326&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/r1920-branches-httptunnel-src-main-java-org-jboss-netty-channel-socket-httptunnel-tp4056326p4056326.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4056318</id>
	<title>r1919 - branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel.</title>
	<published>2009-11-23T23:49:25Z</published>
	<updated>2009-11-23T23:49:25Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-24 02:49:24 -0500 (Tue, 24 Nov 2009)
&lt;br&gt;New Revision: 1919
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;Log:
&lt;br&gt;Switched from java.util.logging to Netty's internal loggers
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;@@ -15,9 +15,6 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import java.util.logging.Level;
&lt;br&gt;-import java.util.logging.Logger;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channels;
&lt;br&gt;@@ -25,25 +22,27 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;+import org.jboss.netty.logging.InternalLoggerFactory;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * Upstream handler which is responsible for determining whether a received HTTP request is a legal
&lt;br&gt;- * tunnel request, and if so, invoking the appropriate request method on the 
&lt;br&gt;+ * tunnel request, and if so, invoking the appropriate request method on the
&lt;br&gt;&amp;nbsp; * {@link ServerMessageSwitch} to service the request.
&lt;br&gt;- * 
&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=4056318&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4056318&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;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp;class AcceptedServerChannelRequestDispatch extends SimpleChannelUpstreamHandler {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;AcceptedServerChannelRequestDispatch&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(AcceptedServerChannelRequestDispatch.class.getName());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerMessageSwitchUpstreamInterface messageSwitch;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InternalLogger LOG = InternalLoggerFactory.getInstance(AcceptedServerChannelRequestDispatch.class);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ServerMessageSwitchUpstreamInterface messageSwitch;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public AcceptedServerChannelRequestDispatch(ServerMessageSwitchUpstreamInterface messageSwitch) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.messageSwitch = messageSwitch;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -51,7 +50,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = (HttpRequest)e.getMessage();
&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; &amp;nbsp;if(HttpTunnelMessageUtils.isOpenTunnelRequest(request)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleOpenTunnel(ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isSendDataRequest(request)) {
&lt;br&gt;@@ -61,7 +60,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isCloseTunnelRequest(request)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleCloseTunnel(ctx, request);
&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;LOG.warning(&amp;quot;Invalid request received on http tunnel channel&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;Invalid request received on http tunnel channel&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createRejection(request, &amp;quot;invalid request to netty HTTP tunnel gateway&amp;quot;));
&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;@@ -72,18 +71,21 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void handleOpenTunnel(ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(ctx.getChannel().getRemoteAddress());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;open tunnel request received from {0} - allocated ID {1}&amp;quot;, new Object[] { ctx.getChannel().getRemoteAddress(), tunnelId });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;open tunnel request received from &amp;quot; + ctx.getChannel().getRemoteAddress() + &amp;quot; - allocated ID &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createTunnelOpenResponse(tunnelId));
&lt;br&gt;&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;private void handleCloseTunnel(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;close tunnel request received for tunnel {0}&amp;quot;, tunnelId);
&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 (LOG.isInfoEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;close tunnel request received for tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createTunnelCloseResponse());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -93,39 +95,44 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;send data request received for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;send data request received for tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;if(request.getContentLength() == 0 || request.getContent() == null || request.getContent().readableBytes() == 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;send data request contained no data on tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;send data request contained no data on tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createRejection(request, &amp;quot;Send data requests must contain data&amp;quot;));
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeInboundData(tunnelId, request.getContent());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;&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;private void handleReceiveData(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;poll data request received for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;poll data request received for tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.pollOutboundData(tunnelId, ctx.getChannel());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String checkTunnelId(HttpRequest request, ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = HttpTunnelMessageUtils.extractTunnelId(request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warning(&amp;quot;request without a tunnel id received - rejecting&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;request without a tunnel id received - rejecting&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), HttpTunnelMessageUtils.createRejection(request, &amp;quot;no tunnel id specified in send data request&amp;quot;));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(!messageSwitch.isOpenTunnel(tunnelId)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;request for unknown tunnel id {0} received - rejecting&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;request for unknown tunnel id &amp;quot; + tunnelId + &amp;quot; received - rejecting&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), HttpTunnelMessageUtils.createRejection(request, &amp;quot;tunnel id \&amp;quot;&amp;quot; + tunnelId + &amp;quot;\&amp;quot; is either closed or does not exist&amp;quot;));
&lt;br&gt;&amp;nbsp; &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;}
&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; &amp;nbsp;return tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;@@ -15,9 +15,6 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import java.util.logging.Level;
&lt;br&gt;-import java.util.logging.Logger;
&lt;br&gt;-
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelPipelineCoverage;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelStateEvent;
&lt;br&gt;@@ -26,6 +23,8 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.SimpleChannelHandler;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;+import org.jboss.netty.logging.InternalLoggerFactory;
&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=4056318&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -36,47 +35,55 @@
&lt;br&gt;&amp;nbsp;class HttpTunnelClientPollHandler extends SimpleChannelHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;server2client&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientPollHandler.class.getName());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InternalLogger LOG = InternalLoggerFactory.getInstance(HttpTunnelClientPollHandler.class);
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private long pollTime;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpTunnelClientPollHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;&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;public void setTunnelId(String tunnelId) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Poll channel for tunnel {0} established&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;Poll channel for tunnel &amp;quot; + tunnelId + &amp;quot; established&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.fullyEstablished();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&lt;br&gt;&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;@Override
&lt;br&gt;&amp;nbsp; &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; &amp;nbsp;throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = (HttpResponse) e.getMessage();
&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; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for poll on tunnel {0} after {1}ns&amp;quot;, new Object[] { tunnelId, rtTime });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;OK response received for poll on tunnel &amp;quot; + tunnelId + &amp;quot; after &amp;quot; + rtTime + &amp;quot; ns&amp;quot;);
&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; &amp;nbsp;tunnelChannel.onMessageReceived(response.getContent());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&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;LOG.log(Level.WARNING, &amp;quot;non-OK response received for poll on tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;non-OK response received for poll on tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;private void sendPoll(ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollTime = System.nanoTime();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending poll request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;sending poll request for tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;@@ -18,8 +18,6 @@
&lt;br&gt;&amp;nbsp;import java.util.concurrent.ConcurrentLinkedQueue;
&lt;br&gt;&amp;nbsp;import java.util.concurrent.atomic.AtomicBoolean;
&lt;br&gt;&amp;nbsp;import java.util.concurrent.atomic.AtomicInteger;
&lt;br&gt;-import java.util.logging.Level;
&lt;br&gt;-import java.util.logging.Logger;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;@@ -32,6 +30,8 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.SimpleChannelHandler;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;+import org.jboss.netty.logging.InternalLoggerFactory;
&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=4056318&amp;i=3&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -43,7 +43,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;client2server&amp;quot;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientSendHandler.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InternalLogger LOG = InternalLoggerFactory.getInstance(HttpTunnelClientSendHandler.class);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -68,7 +68,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;connection to {0} succeeded - sending open tunnel request&amp;quot;, e.getValue());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;connection to &amp;quot; + e.getValue() + &amp;quot; succeeded - sending open tunnel request&amp;quot;);
&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; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createOpenTunnelRequest(tunnelChannel.getServerHostName());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel thisChannel = ctx.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent event = new DownstreamMessageEvent(thisChannel, Channels.future(thisChannel), request, thisChannel.getRemoteAddress());
&lt;br&gt;@@ -84,41 +86,55 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long roundTripTime = System.nanoTime() - sendRequestTime;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for tunnel {0}, after {1}ns&amp;quot;, new Object[] { tunnelId, roundTripTime });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;OK response received for tunnel &amp;quot; + tunnelId + &amp;quot;, after &amp;quot; + roundTripTime + &amp;quot; ns&amp;quot;);
&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; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelOpenResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelId = HttpTunnelMessageUtils.extractCookie(response);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;tunnel open request accepted - id {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;tunnel open request accepted - id &amp;quot; + tunnelId);
&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; &amp;nbsp;tunnelChannel.onTunnelOpened(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelCloseResponse(response)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;server acknowledged disconnect for tunnel {0}&amp;quot;, tunnelId);
&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;LOG.log(Level.INFO, &amp;quot;server closed tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;server acknowledged disconnect for tunnel &amp;quot; + tunnelId);
&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;LOG.info(&amp;quot;server closed tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;ctx.sendDownstream(postShutdownEvent);
&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; &amp;nbsp;// TODO: kill connection
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;unknown response received for tunnel {0}, closing connection&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;unknown response received for tunnel &amp;quot; + tunnelId + &amp;quot;, closing connection&amp;quot;);
&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; &amp;nbsp;Channels.close(ctx, ctx.getChannel().getCloseFuture());
&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;private void sendNextAfterResponse(ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.decrementAndGet() &amp;gt; 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Immediately sending next send request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;Immediately sending next send request for tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;sendQueuedData(ctx);
&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;private synchronized void sendQueuedData(ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending close request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;sending close request for tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;HttpRequest closeRequest = HttpTunnelMessageUtils.createCloseTunnelRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), closeRequest);
&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;LOG.log(Level.FINE, &amp;quot;sending next request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;sending next request for tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;MessageEvent nextWrite = queuedWrites.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendRequestTime = System.nanoTime();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(nextWrite);
&lt;br&gt;@@ -127,9 +143,13 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINER, &amp;quot;request to send data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;rejecting write request for tunnel {0} received after disconnect requested&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;request to send data for tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;rejecting write request for tunnel &amp;quot; + tunnelId + &amp;quot; received after disconnect requested&amp;quot;);
&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; &amp;nbsp;e.getFuture().setFailure(new IllegalStateException(&amp;quot;tunnel is closing&amp;quot;));
&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;@@ -137,10 +157,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(tunnelChannel.getServerHostName(), tunnelId, data);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent translatedEvent = new DownstreamMessageEvent(ctx.getChannel(), e.getFuture(), request, ctx.getChannel().getRemoteAddress());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queuedWrites.offer(translatedEvent);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&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;LOG.log(Level.FINE, &amp;quot;write request for tunnel {0} queued&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;write request for tunnel &amp;quot; + tunnelId + &amp;quot; queued&amp;quot;);
&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;@@ -160,15 +182,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void shutdownTunnel(ChannelHandlerContext ctx, ChannelStateEvent postShutdownEvent) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;tunnel shutdown requested for send channel of tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isInfoEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;tunnel shutdown requested for send channel of tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!ctx.getChannel().isConnected()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;send channel of tunnel {0} is already disconnected&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;send channel of tunnel &amp;quot; + tunnelId + &amp;quot; is already disconnected&amp;quot;);
&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; &amp;nbsp;ctx.sendDownstream(postShutdownEvent);
&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; &amp;nbsp;if(!disconnecting.compareAndSet(false, true)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;tunnel shutdown process already initiated for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;tunnel shutdown process already initiated for tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-24 07:49:24 UTC (rev 1919)
&lt;br&gt;@@ -22,8 +22,6 @@
&lt;br&gt;&amp;nbsp;import java.util.concurrent.ConcurrentLinkedQueue;
&lt;br&gt;&amp;nbsp;import java.util.concurrent.atomic.AtomicInteger;
&lt;br&gt;&amp;nbsp;import java.util.concurrent.atomic.AtomicReference;
&lt;br&gt;-import java.util.logging.Level;
&lt;br&gt;-import java.util.logging.Logger;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;@@ -31,6 +29,8 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channels;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jboss.netty.logging.InternalLogger;
&lt;br&gt;+import org.jboss.netty.logging.InternalLoggerFactory;
&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=4056318&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -39,7 +39,7 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;class ServerMessageSwitch implements ServerMessageSwitchUpstreamInterface, ServerMessageSwitchDownstreamInterface {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(ServerMessageSwitch.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InternalLogger LOG = InternalLoggerFactory.getInstance(ServerMessageSwitch.class.getName());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final String tunnelIdPrefix;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final AtomicInteger tunnelIdSequence;
&lt;br&gt;@@ -71,13 +71,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void pollOutboundData(String tunnelId, Channel channel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;Poll request for tunnel {0} which does not exist or already closed&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;Poll request for tunnel &amp;quot; + tunnelId + &amp;quot; which does not exist or already closed&amp;quot;);
&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; &amp;nbsp;Channels.write(channel, HttpTunnelMessageUtils.createRejection(null, &amp;quot;Unknown tunnel, possibly already closed&amp;quot;));
&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; &amp;nbsp;if(!tunnel.responseChannel.compareAndSet(null, channel)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;Duplicate poll request detected for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;Duplicate poll request detected for tunnel &amp;quot; + tunnelId);
&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; &amp;nbsp;Channels.write(channel, HttpTunnelMessageUtils.createRejection(null, &amp;quot;Only one poll request at a time per tunnel allowed&amp;quot;));
&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;@@ -98,7 +102,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;LOG.log(Level.FINE, &amp;quot;sending response for tunnel id {0} to {1}&amp;quot;, new Object[] { state.tunnelId, responseChannel.getRemoteAddress() });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;sending response for tunnel id &amp;quot; + state.tunnelId + &amp;quot; to &amp;quot; + responseChannel.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QueuedResponse messageToSend = queuedData.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(messageToSend.data);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelFuture originalFuture = messageToSend.writeFuture;
&lt;br&gt;@@ -119,7 +125,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;LOG.log(Level.FINE, &amp;quot;routing inbound data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;routing inbound data for tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(tunnel.localChannel, inboundData);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -131,7 +139,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// tunnel is closed
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;attempt made to send data out on tunnel id {0} which is unknown or closed&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isWarnEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warn(&amp;quot;attempt made to send data out on tunnel id &amp;quot; + tunnelId + &amp;quot; which is unknown or closed&amp;quot;);
&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; &amp;nbsp;return;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -140,7 +150,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureAggregator aggregator = new ChannelFutureAggregator(writeFuture);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(data);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;routing outbound data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (LOG.isDebugEnabled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.debug(&amp;quot;routing outbound data for tunnel &amp;quot; + tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelBuffer fragment : fragments) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture fragmentFuture = Channels.future(writeFuture.getChannel());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregator.addFuture(fragmentFuture);
&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=4056318&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/r1919-branches-httptunnel-src-main-java-org-jboss-netty-channel-socket-httptunnel-tp4056318p4056318.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4055742</id>
	<title>r1918 - in branches/httptunnel/src: test/java/org/jboss/netty/channel/socket/httptunnel and 1 other directory.</title>
	<published>2009-11-23T20:07:12Z</published>
	<updated>2009-11-23T20:07:12Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 23:07:10 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1918
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelPipelineFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientWorkerOwner.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchDownstreamInterface.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchUpstreamInterface.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/TunnelWrappedServerChannelHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeClientSocketChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeSocketChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/MockChannelStateListener.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtilsTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NullChannelHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/UpstreamEventCatcher.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenterTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitterTest.java
&lt;br&gt;Log:
&lt;br&gt;* Set SVN properties for Java source code files
&lt;br&gt;** svn:eol-style = native
&lt;br&gt;** svn:keywords = Rev Date
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelPipelineFactory.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;@@ -1,47 +1,47 @@
&lt;br&gt;-/**
&lt;br&gt;- * 
&lt;br&gt;- */
&lt;br&gt;-package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;-
&lt;br&gt;-import java.util.HashSet;
&lt;br&gt;-import java.util.Set;
&lt;br&gt;-
&lt;br&gt;-import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;-import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;-
&lt;br&gt;-class ChannelFutureAggregator implements ChannelFutureListener {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelFuture aggregateFuture;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private Set&amp;lt;ChannelFuture&amp;gt; pendingFutures;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public ChannelFutureAggregator(ChannelFuture aggregateFuture) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.aggregateFuture = aggregateFuture;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pendingFutures = new HashSet&amp;lt;ChannelFuture&amp;gt;();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void addFuture(ChannelFuture future) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pendingFutures.add(future);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.addListener(this);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public synchronized void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isCancelled()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO: what should the correct behaviour be when a fragment is cancelled?
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// cancel all outstanding fragments and cancel the aggregate?
&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;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFutures.remove(future);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setFailure(future.getCause());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelFuture pendingFuture : pendingFutures) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFuture.cancel();
&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;return;
&lt;br&gt;- &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;if(pendingFutures.isEmpty()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setSuccess();
&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;+ */
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.HashSet;
&lt;br&gt;+import java.util.Set;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;+
&lt;br&gt;+class ChannelFutureAggregator implements ChannelFutureListener {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelFuture aggregateFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Set&amp;lt;ChannelFuture&amp;gt; pendingFutures;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelFutureAggregator(ChannelFuture aggregateFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.aggregateFuture = aggregateFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pendingFutures = new HashSet&amp;lt;ChannelFuture&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void addFuture(ChannelFuture future) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pendingFutures.add(future);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.addListener(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public synchronized void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isCancelled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO: what should the correct behaviour be when a fragment is cancelled?
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// cancel all outstanding fragments and cancel the aggregate?
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFutures.remove(future);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setFailure(future.getCause());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelFuture pendingFuture : pendingFutures) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFuture.cancel();
&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;return;
&lt;br&gt;+ &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;if(pendingFutures.isEmpty()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setSuccess();
&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;\ No newline at end of file
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannel.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelFactory.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelFactory.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;@@ -1,83 +1,83 @@
&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.socket.httptunnel;
&lt;br&gt;-
&lt;br&gt;-import java.util.logging.Level;
&lt;br&gt;-import java.util.logging.Logger;
&lt;br&gt;-
&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.ChannelStateEvent;
&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.http.HttpRequest;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpResponse;
&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=4055742&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055742&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;-class HttpTunnelClientPollHandler extends SimpleChannelHandler {
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;server2client&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientPollHandler.class.getName());
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private long pollTime;
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public HttpTunnelClientPollHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setTunnelId(String tunnelId) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&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 channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Poll channel for tunnel {0} established&amp;quot;, tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.fullyEstablished();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&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;HttpResponse response = (HttpResponse) e.getMessage();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for poll on tunnel {0} after {1}ns&amp;quot;, new Object[] { tunnelId, rtTime });
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.onMessageReceived(response.getContent());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&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;LOG.log(Level.WARNING, &amp;quot;non-OK response received for poll on tunnel {0}&amp;quot;, tunnelId);
&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 sendPoll(ChannelHandlerContext ctx) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollTime = System.nanoTime();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending poll request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), request);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-}
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.logging.Level;
&lt;br&gt;+import java.util.logging.Logger;
&lt;br&gt;+
&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.ChannelStateEvent;
&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.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&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=4055742&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055742&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;+class HttpTunnelClientPollHandler extends SimpleChannelHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;server2client&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientPollHandler.class.getName());
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private long pollTime;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientPollHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setTunnelId(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&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 channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Poll channel for tunnel {0} established&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.fullyEstablished();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&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;HttpResponse response = (HttpResponse) e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for poll on tunnel {0} after {1}ns&amp;quot;, new Object[] { tunnelId, rtTime });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.onMessageReceived(response.getContent());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&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;LOG.log(Level.WARNING, &amp;quot;non-OK response received for poll on tunnel {0}&amp;quot;, tunnelId);
&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 sendPoll(ChannelHandlerContext ctx) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollTime = System.nanoTime();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending poll request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientWorkerOwner.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannel.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelConfig.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactory.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchDownstreamInterface.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchUpstreamInterface.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/TunnelWrappedServerChannelHandler.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.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;Property changes on: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelConfig.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelSink.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeClientSocketChannelFactory.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannel.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelConfig.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelFactory.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeSocketChannel.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java	2009-11-24 04:07:10 UTC (rev 1918)
&lt;br&gt;@@ -1,91 +1,91 @@
&lt;br&gt;-package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;-
&lt;br&gt;-
&lt;br&gt;-import static org.junit.Assert.*;
&lt;br&gt;-
&lt;br&gt;-import java.net.InetAddress;
&lt;br&gt;-import java.net.InetSocketAddress;
&lt;br&gt;-import java.net.UnknownHostException;
&lt;br&gt;-
&lt;br&gt;-import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;-import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;-import org.jboss.netty.channel.Channels;
&lt;br&gt;-import org.jboss.netty.channel.DownstreamMessageEvent;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;-import org.junit.Before;
&lt;br&gt;-import org.junit.Test;
&lt;br&gt;-
&lt;br&gt;-/**
&lt;br&gt;- * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055742&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;- */
&lt;br&gt;-public class HttpTunnelClientPollHandlerTest {
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3}, 12345);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final InetSocketAddress PROXY_ADDRESS = createAddress(new byte[] { 10, 0, 0, 2 }, 8888);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final InetSocketAddress LOCAL_ADDRESS = createAddress(new byte[] { 10, 0, 0, 1 }, 54321);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private FakeChannelSink sink;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelClientPollHandler handler;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private MockChannelStateListener listener;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static InetSocketAddress createAddress(byte[] addr, int port) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new InetSocketAddress(InetAddress.getByAddress(addr), port);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnknownHostException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;Bad address in test&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener = new MockChannelStateListener();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener.serverHostName = HttpTunnelMessageUtils.convertToHostString(SERVER_ADDRESS);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler = new HttpTunnelClientPollHandler(listener);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler.setTunnelId(TUNNEL_ID);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(HttpTunnelClientPollHandler.NAME, handler);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = PROXY_ADDRESS;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.localAddress = LOCAL_ADDRESS;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void testSendsRequestOnConnect() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isServerToClientRequest(request));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(listener.fullyEstablished);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void testSendsReceivedDataSentUpstream() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, response);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, listener.messages.size());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1234L, listener.messages.get(0).readLong());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void testSendsAnotherRequestAfterResponse() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, response);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpRequest checkIsMessageEventContainingHttpRequest(ChannelEvent event) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (HttpRequest) messageEvent.getMessage();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-}
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.UnknownHostException;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.DownstreamMessageEvent;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055742&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class HttpTunnelClientPollHandlerTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3}, 12345);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress PROXY_ADDRESS = createAddress(new byte[] { 10, 0, 0, 2 }, 8888);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress LOCAL_ADDRESS = createAddress(new byte[] { 10, 0, 0, 1 }, 54321);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientPollHandler handler;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private MockChannelStateListener listener;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static InetSocketAddress createAddress(byte[] addr, int port) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new InetSocketAddress(InetAddress.getByAddress(addr), port);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnknownHostException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;Bad address in test&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener = new MockChannelStateListener();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener.serverHostName = HttpTunnelMessageUtils.convertToHostString(SERVER_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler = new HttpTunnelClientPollHandler(listener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler.setTunnelId(TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(HttpTunnelClientPollHandler.NAME, handler);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = PROXY_ADDRESS;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.localAddress = LOCAL_ADDRESS;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsRequestOnConnect() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isServerToClientRequest(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(listener.fullyEstablished);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsReceivedDataSentUpstream() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, listener.messages.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1234L, listener.messages.get(0).readLong());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsAnotherRequestAfterResponse() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpRequest checkIsMessageEventContainingHttpRequest(ChannelEvent event) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (HttpRequest) messageEvent.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/MockChannelStateListener.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtilsTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NullChannelHandler.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/UpstreamEventCatcher.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenterTest.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;Property changes on: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitterTest.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=4055742&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/r1918-in-branches-httptunnel-src-test-java-org-jboss-netty-channel-socket-httptunnel-and-1-other-dir-tp4055742p4055742.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4055714</id>
	<title>r1917 - in branches/httptunnel/src: test/java/org/jboss/netty/channel/socket/httptunnel and 1 other directory.</title>
	<published>2009-11-23T20:00:02Z</published>
	<updated>2009-11-23T20:00:02Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 23:00:01 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1917
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java
&lt;br&gt;Log:
&lt;br&gt;Replaced tabs with spaces
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -143,17 +143,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 void setSoLinger(int soLinger) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	pollChannelConfig.setSoLinger(soLinger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setSoLinger(soLinger);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setSoLinger(soLinger);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setTcpNoDelay(boolean tcpNoDelay) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	pollChannelConfig.setTcpNoDelay(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setTcpNoDelay(true);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setTcpNoDelay(true);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setTrafficClass(int trafficClass) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	pollChannelConfig.setTrafficClass(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setTrafficClass(1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setTrafficClass(1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -35,49 +35,49 @@
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp;class HttpTunnelClientPollHandler extends SimpleChannelHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	public static final String NAME = &amp;quot;server2client&amp;quot;;
&lt;br&gt;-	
&lt;br&gt;-	private static final Logger LOG = Logger.getLogger(HttpTunnelClientPollHandler.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;server2client&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientPollHandler.class.getName());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	private String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private long pollTime;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	public HttpTunnelClientPollHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientPollHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-	
&lt;br&gt;-	public void setTunnelId(String tunnelId) {
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setTunnelId(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;-	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Poll channel for tunnel {0} established&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.fullyEstablished();
&lt;br&gt;-		sendPoll(ctx);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Override
&lt;br&gt;-	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
&lt;br&gt;-			throws Exception {
&lt;br&gt;-		HttpResponse response = (HttpResponse) e.getMessage();
&lt;br&gt;-		
&lt;br&gt;-		if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for poll on tunnel {0} after {1}ns&amp;quot;, new Object[] { tunnelId, rtTime });
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;tunnelChannel.onMessageReceived(response.getContent());
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&lt;br&gt;-		} else {
&lt;br&gt;-		 &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;non-OK response received for poll on tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;-		}
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&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;HttpResponse response = (HttpResponse) e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for poll on tunnel {0} after {1}ns&amp;quot;, new Object[] { tunnelId, rtTime });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.onMessageReceived(response.getContent());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&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;LOG.log(Level.WARNING, &amp;quot;non-OK response received for poll on tunnel {0}&amp;quot;, tunnelId);
&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;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void sendPoll(ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollTime = System.nanoTime();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending poll request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;-		Channels.write(ctx, Channels.future(ctx.getChannel()), request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -70,11 +70,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static HttpRequest createOpenTunnelRequest(SocketAddress host) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	return createOpenTunnelRequest(convertToHostString(host));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createOpenTunnelRequest(convertToHostString(host));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static HttpRequest createOpenTunnelRequest(String host) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	HttpRequest request = createRequestTemplate(host, null, OPEN_TUNNEL_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = createRequestTemplate(host, null, OPEN_TUNNEL_REQUEST_URI);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setNoData(request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -89,7 +89,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static HttpRequest createSendDataRequest(SocketAddress host, String cookie, ChannelBuffer data) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	return createSendDataRequest(convertToHostString(host), cookie, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createSendDataRequest(convertToHostString(host), cookie, data);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static HttpRequest createSendDataRequest(String host, String cookie, ChannelBuffer data) {
&lt;br&gt;@@ -105,13 +105,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static HttpRequest createReceiveDataRequest(SocketAddress host, String tunnelId) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	return createReceiveDataRequest(convertToHostString(host), tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createReceiveDataRequest(convertToHostString(host), tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static HttpRequest createReceiveDataRequest(String host, String tunnelId) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	HttpRequest request = createRequestTemplate(host, tunnelId, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	setNoData(request);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	return request;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = createRequestTemplate(host, tunnelId, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setNoData(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static boolean isReceiveDataRequest(HttpRequest request) {
&lt;br&gt;@@ -129,24 +129,24 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static boolean isServerToClientRequest(HttpRequest request) {
&lt;br&gt;-		return isRequestTo(request, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isRequestTo(request, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static String convertToHostString(SocketAddress hostAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	StringWriter host = new StringWriter();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	InetSocketAddress inetSocketAddr = (InetSocketAddress) hostAddress;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	InetAddress addr = inetSocketAddr.getAddress();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	if(addr instanceof Inet6Address) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;		host.append('[');
&lt;br&gt;- &amp;nbsp; &amp;nbsp;		host.append(addr.getHostAddress());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;		host.append(']');
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	} else {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;		host.append(addr.getHostAddress());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	host.append(':');
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	host.append(Integer.toString(inetSocketAddr.getPort()));
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	return host.toString();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringWriter host = new StringWriter();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetSocketAddress inetSocketAddr = (InetSocketAddress) hostAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetAddress addr = inetSocketAddr.getAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(addr instanceof Inet6Address) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append('[');
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append(addr.getHostAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append(']');
&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;host.append(addr.getHostAddress());
&lt;br&gt;+ &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;host.append(':');
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;host.append(Integer.toString(inetSocketAddr.getPort()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return host.toString();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static HttpRequest createRequestTemplate(String host, String tunnelId, String uri) {
&lt;br&gt;@@ -183,10 +183,10 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;&amp; uri.equals(decodedUri.getPath());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	private static void setNoData(HttpRequest request) {
&lt;br&gt;-		request.setHeader(HttpHeaders.Names.CONTENT_LENGTH, &amp;quot;0&amp;quot;);
&lt;br&gt;-		request.setContent(null);
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static void setNoData(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.CONTENT_LENGTH, &amp;quot;0&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setContent(null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static String extractTunnelId(HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request.getHeader(HttpHeaders.Names.COOKIE);
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -13,162 +13,162 @@
&lt;br&gt;&amp;nbsp;@RunWith(JMock.class)
&lt;br&gt;&amp;nbsp;public class HttpTunnelClientChannelConfigTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;-	
&lt;br&gt;-	SocketChannelConfig sendChannelConfig;
&lt;br&gt;-	SocketChannelConfig pollChannelConfig;
&lt;br&gt;-	
&lt;br&gt;-	HttpTunnelClientChannelConfig config;
&lt;br&gt;-	
&lt;br&gt;-	@Before
&lt;br&gt;-	public void setUp() {
&lt;br&gt;-		sendChannelConfig = mockContext.mock(SocketChannelConfig.class, &amp;quot;sendChannelConfig&amp;quot;);
&lt;br&gt;-		pollChannelConfig = mockContext.mock(SocketChannelConfig.class, &amp;quot;pollChannelConfig&amp;quot;);
&lt;br&gt;-		
&lt;br&gt;-		config = new HttpTunnelClientChannelConfig(sendChannelConfig, pollChannelConfig);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testGetReceiveBufferSize() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).getReceiveBufferSize(); will(returnValue(100));
&lt;br&gt;-		}});
&lt;br&gt;-		
&lt;br&gt;-		assertEquals(100, config.getReceiveBufferSize());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testGetSendBufferSize() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).getSendBufferSize(); will(returnValue(100));
&lt;br&gt;-		}});
&lt;br&gt;-		
&lt;br&gt;-		assertEquals(100, config.getSendBufferSize());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testGetSoLinger() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).getSoLinger(); will(returnValue(100));
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		assertEquals(100, config.getSoLinger());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testTrafficClass() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).getTrafficClass(); will(returnValue(1));
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		assertEquals(1, config.getTrafficClass());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testIsKeepAlive() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).isKeepAlive(); will(returnValue(true));
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		assertTrue(config.isKeepAlive());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testIsReuseAddress() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).isReuseAddress(); will(returnValue(true));
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		assertTrue(config.isReuseAddress());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testIsTcpNoDelay() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).isTcpNoDelay(); will(returnValue(true));
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		assertTrue(config.isTcpNoDelay());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetKeepAlive() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setKeepAlive(true);
&lt;br&gt;-			one(sendChannelConfig).setKeepAlive(true);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setKeepAlive(true);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetPerformancePreferences() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;-			one(sendChannelConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setPerformancePreferences(100, 200, 300);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetReceiveBufferSize() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setReceiveBufferSize(100);
&lt;br&gt;-			one(sendChannelConfig).setReceiveBufferSize(100);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setReceiveBufferSize(100);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetReuseAddress() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setReuseAddress(true);
&lt;br&gt;-			one(sendChannelConfig).setReuseAddress(true);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setReuseAddress(true);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetSendBufferSize() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setSendBufferSize(100);
&lt;br&gt;-			one(sendChannelConfig).setSendBufferSize(100);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setSendBufferSize(100);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetSoLinger() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setSoLinger(100);
&lt;br&gt;-			one(sendChannelConfig).setSoLinger(100);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setSoLinger(100);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testTcpNoDelay() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setTcpNoDelay(true);
&lt;br&gt;-			one(sendChannelConfig).setTcpNoDelay(true);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setTcpNoDelay(true);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSetTrafficClass() {
&lt;br&gt;-		mockContext.checking(new Expectations() {{
&lt;br&gt;-			one(pollChannelConfig).setTrafficClass(1);
&lt;br&gt;-			one(sendChannelConfig).setTrafficClass(1);
&lt;br&gt;-		}}); 
&lt;br&gt;-		
&lt;br&gt;-		config.setTrafficClass(1);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;SocketChannelConfig sendChannelConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;SocketChannelConfig pollChannelConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;HttpTunnelClientChannelConfig config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig = mockContext.mock(SocketChannelConfig.class, &amp;quot;sendChannelConfig&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig = mockContext.mock(SocketChannelConfig.class, &amp;quot;pollChannelConfig&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = new HttpTunnelClientChannelConfig(sendChannelConfig, pollChannelConfig);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testGetReceiveBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).getReceiveBufferSize(); will(returnValue(100));
&lt;br&gt;+ &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;assertEquals(100, config.getReceiveBufferSize());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testGetSendBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).getSendBufferSize(); will(returnValue(100));
&lt;br&gt;+ &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;assertEquals(100, config.getSendBufferSize());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testGetSoLinger() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).getSoLinger(); will(returnValue(100));
&lt;br&gt;+ &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;assertEquals(100, config.getSoLinger());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testTrafficClass() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).getTrafficClass(); will(returnValue(1));
&lt;br&gt;+ &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;assertEquals(1, config.getTrafficClass());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testIsKeepAlive() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).isKeepAlive(); will(returnValue(true));
&lt;br&gt;+ &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;assertTrue(config.isKeepAlive());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testIsReuseAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).isReuseAddress(); will(returnValue(true));
&lt;br&gt;+ &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;assertTrue(config.isReuseAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testIsTcpNoDelay() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).isTcpNoDelay(); will(returnValue(true));
&lt;br&gt;+ &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;assertTrue(config.isTcpNoDelay());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetKeepAlive() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setKeepAlive(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setKeepAlive(true);
&lt;br&gt;+ &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;config.setKeepAlive(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetPerformancePreferences() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;+ &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;config.setPerformancePreferences(100, 200, 300);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetReceiveBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setReceiveBufferSize(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setReceiveBufferSize(100);
&lt;br&gt;+ &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;config.setReceiveBufferSize(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetReuseAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setReuseAddress(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setReuseAddress(true);
&lt;br&gt;+ &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;config.setReuseAddress(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetSendBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setSendBufferSize(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setSendBufferSize(100);
&lt;br&gt;+ &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;config.setSendBufferSize(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetSoLinger() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setSoLinger(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setSoLinger(100);
&lt;br&gt;+ &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;config.setSoLinger(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testTcpNoDelay() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setTcpNoDelay(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setTcpNoDelay(true);
&lt;br&gt;+ &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;config.setTcpNoDelay(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetTrafficClass() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(pollChannelConfig).setTrafficClass(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(sendChannelConfig).setTrafficClass(1);
&lt;br&gt;+ &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;config.setTrafficClass(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -21,8 +21,8 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public class HttpTunnelClientPollHandlerTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;-	private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3}, 12345);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3}, 12345);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InetSocketAddress PROXY_ADDRESS = createAddress(new byte[] { 10, 0, 0, 2 }, 8888);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InetSocketAddress LOCAL_ADDRESS = createAddress(new byte[] { 10, 0, 0, 1 }, 54321);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;@@ -40,11 +40,11 @@
&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; &amp;nbsp; &amp;nbsp;
&lt;br&gt;-	@Before
&lt;br&gt;-	public void setUp() throws Exception {
&lt;br&gt;-		sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;-		ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener = new MockChannelStateListener();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener.serverHostName = HttpTunnelMessageUtils.convertToHostString(SERVER_ADDRESS);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler = new HttpTunnelClientPollHandler(listener);
&lt;br&gt;@@ -54,38 +54,38 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = PROXY_ADDRESS;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.localAddress = LOCAL_ADDRESS;
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSendsRequestOnConnect() {
&lt;br&gt;-		Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;-		assertEquals(1, sink.events.size());
&lt;br&gt;-		HttpRequest request = checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;-		assertTrue(HttpTunnelMessageUtils.isServerToClientRequest(request));
&lt;br&gt;-		assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;-		assertTrue(listener.fullyEstablished);
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSendsReceivedDataSentUpstream() {
&lt;br&gt;-		HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;-		Channels.fireMessageReceived(channel, response);
&lt;br&gt;-		assertEquals(1, listener.messages.size());
&lt;br&gt;-		assertEquals(1234L, listener.messages.get(0).readLong());
&lt;br&gt;-	}
&lt;br&gt;-	
&lt;br&gt;-	@Test
&lt;br&gt;-	public void testSendsAnotherRequestAfterResponse() {
&lt;br&gt;-		HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;-		Channels.fireMessageReceived(channel, response);
&lt;br&gt;-		assertEquals(1, sink.events.size());
&lt;br&gt;-		checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsRequestOnConnect() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isServerToClientRequest(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(listener.fullyEstablished);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsReceivedDataSentUpstream() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, listener.messages.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1234L, listener.messages.get(0).readLong());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsAnotherRequestAfterResponse() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	private HttpRequest checkIsMessageEventContainingHttpRequest(ChannelEvent event) {
&lt;br&gt;-		assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;-		DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;-		assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;-		return (HttpRequest) messageEvent.getMessage();
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpRequest checkIsMessageEventContainingHttpRequest(ChannelEvent event) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return (HttpRequest) messageEvent.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -90,18 +90,18 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testOnlyOneRequestAtATime() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	emulateConnectAndOpen();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	assertEquals(1, sink.events.size());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	channel.write(NettyTestUtils.createData(5678L));
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	assertEquals(0, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(NettyTestUtils.createData(5678L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, sink.events.size());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	assertEquals(1, sink.events.size());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(5678L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(5678L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;@@ -148,19 +148,19 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// FIXME expectedHost is unused. &amp;nbsp;Safe to remove?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void checkIsSendDataRequestWithData(ChannelEvent event, String expectedHost, ChannelBuffer data) {
&lt;br&gt;-		assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;-		DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;-		assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;-		HttpRequest request = (HttpRequest) messageEvent.getMessage();
&lt;br&gt;-		assertTrue(HttpTunnelMessageUtils.isSendDataRequest(request));
&lt;br&gt;-		assertEquals(data.readableBytes(), request.getContentLength());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = (HttpRequest) messageEvent.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isSendDataRequest(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(data.readableBytes(), request.getContentLength());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-		ChannelBuffer content = request.getContent();
&lt;br&gt;-		NettyTestUtils.assertEquals(data, content);
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer content = request.getContent();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.assertEquals(data, content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-	private void emulateConnect() {
&lt;br&gt;-	 &amp;nbsp; &amp;nbsp;channel.emulateConnected(LOCAL_ADDRESS, PROXY_ADDRESS, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void emulateConnect() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.emulateConnected(LOCAL_ADDRESS, PROXY_ADDRESS, null);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink.events.clear();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java	2009-11-24 04:00:01 UTC (rev 1917)
&lt;br&gt;@@ -108,14 +108,14 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static ChannelBuffer createData(long containedNumber) {
&lt;br&gt;-		ChannelBuffer data = ChannelBuffers.dynamicBuffer();
&lt;br&gt;-		data.writeLong(containedNumber);
&lt;br&gt;-		return data;
&lt;br&gt;-	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;data.writeLong(containedNumber);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return data;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static void checkIsUpstreamMessageEventContainingData(ChannelEvent event, ChannelBuffer expectedData) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = checkIsUpstreamMessageEvent(event, ChannelBuffer.class);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	assertEquals(expectedData, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(expectedData, data);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static &amp;lt;T&amp;gt; T checkIsUpstreamMessageEvent(ChannelEvent event, Class&amp;lt;T&amp;gt; expectedMessageType) {
&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=4055714&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/r1917-in-branches-httptunnel-src-test-java-org-jboss-netty-channel-socket-httptunnel-and-1-other-dir-tp4055714p4055714.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4055707</id>
	<title>r1916 - in branches/httptunnel/src: test/java/org/jboss/netty/channel/socket/httptunnel and 1 other directory.</title>
	<published>2009-11-23T19:58:04Z</published>
	<updated>2009-11-23T19:58:04Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 22:58:04 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1916
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java
&lt;br&gt;Log:
&lt;br&gt;* Changed the access modifier of the private fields which are accessed by other inner classes
&lt;br&gt;* Added the FIXME markers for unused fields and parameters
&lt;br&gt;* Fixed Javadoc errors
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -28,22 +28,22 @@
&lt;br&gt;&amp;nbsp; * Sink for the server end of an http tunnel. Data sent down through the server end is dispatched
&lt;br&gt;&amp;nbsp; * from here to the ServerMessageSwitch, which queues the data awaiting a poll request from the
&lt;br&gt;&amp;nbsp; * client end of the tunnel.
&lt;br&gt;- * 
&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=4055707&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055707&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;&amp;nbsp;class HttpTunnelAcceptedChannelSink extends AbstractChannelSink {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerMessageSwitchDownstreamInterface messageSwitch;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ServerMessageSwitchDownstreamInterface messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final String tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean active;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpTunnelAcceptedChannelSink(ServerMessageSwitchDownstreamInterface messageSwitch, String tunnelId) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.messageSwitch = messageSwitch;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;&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;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof MessageEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleMessageEvent((MessageEvent)e);
&lt;br&gt;@@ -60,30 +60,30 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void handleStateEvent(ChannelStateEvent ev) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel owner = (Channel) ev.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel owner = ev.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(ev.getState()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case OPEN:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(ev.getValue())) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.active = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelClosed(owner);
&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;case BOUND:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.active = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelUnbound(owner);
&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;case CONNECTED:
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.active = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;active = false;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelDisconnected(owner);
&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;}
&lt;br&gt;&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;public boolean isActive() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return active;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -38,38 +38,38 @@
&lt;br&gt;&amp;nbsp; * The client end of an HTTP tunnel, created by an {@link HttpTunnelClientChannelFactory}. Channels of
&lt;br&gt;&amp;nbsp; * this type are designed to emulate a normal TCP based socket channel as far as is feasible within the limitations
&lt;br&gt;&amp;nbsp; * of the HTTP 1.1 protocol, and the usage patterns permitted by commonly used HTTP proxies and firewalls.
&lt;br&gt;- * 
&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=4055707&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055707&amp;i=3&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 HttpTunnelClientChannel extends AbstractChannel implements SocketChannel, HttpTunnelClientWorkerOwner {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelClientChannelConfig config;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private SocketChannel sendChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private SocketChannel pollChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final HttpTunnelClientChannelConfig config;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final SocketChannel sendChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final SocketChannel pollChannel;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelFuture connectFuture;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean connected;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private boolean bound;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private InetSocketAddress serverAddress;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;InetSocketAddress serverAddress;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String serverHostName;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected HttpTunnelClientChannel(ChannelFactory factory, ChannelPipeline pipeline, HttpTunnelClientChannelSink sink, ClientSocketChannelFactory outboundFactory, ChannelGroup realConnections) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(null, factory, pipeline, sink);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sendChannel = outboundFactory.newChannel(createSendPipeline());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pollChannel = outboundFactory.newChannel(createPollPipeline());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.config = new HttpTunnelClientChannelConfig(sendChannel.getConfig(), pollChannel.getConfig());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.serverAddress = 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;sendChannel = outboundFactory.newChannel(createSendPipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel = outboundFactory.newChannel(createPollPipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = new HttpTunnelClientChannelConfig(sendChannel.getConfig(), pollChannel.getConfig());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverAddress = null;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.add(sendChannel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.add(pollChannel);
&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; &amp;nbsp;Channels.fireChannelOpen(this);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -92,7 +92,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public InetSocketAddress getRemoteAddress() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return serverAddress;
&lt;br&gt;&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;public void onMessageReceived(ChannelBuffer content) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(this, content);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -103,18 +103,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * The send and poll channels can later ask for the correct server address using
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * getServerHostName().
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.serverAddress = remoteAddress;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverAddress = remoteAddress;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress connectTarget;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(config.getProxyAddress() != null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectTarget = config.getProxyAddress();
&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; &amp;nbsp;connectTarget = remoteAddress;
&lt;br&gt;&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; &amp;nbsp;Channels.connect(sendChannel, connectTarget);
&lt;br&gt;&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;public void onDisconnectRequest(final ChannelFuture disconnectFuture) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener disconnectListener = new ConsolidatingFutureListener(disconnectFuture, 2);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.disconnect().addListener(disconnectListener);
&lt;br&gt;@@ -126,13 +126,13 @@
&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;});
&lt;br&gt;&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;public void onBindRequest(SocketAddress localAddress, final ChannelFuture bindFuture) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener bindListener = new ConsolidatingFutureListener(bindFuture, 2);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.bind(localAddress).addListener(bindListener);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.bind(localAddress).addListener(bindListener);
&lt;br&gt;&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;public void onUnbindRequest(final ChannelFuture unbindFuture) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener unbindListener = new ConsolidatingFutureListener(unbindFuture, 2);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.unbind().addListener(unbindListener);
&lt;br&gt;@@ -144,7 +144,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.close().addListener(closeListener);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.close().addListener(closeListener);
&lt;br&gt;&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;public void onTunnelOpened(String tunnelId) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setTunnelIdForPollChannel();
&lt;br&gt;@@ -153,27 +153,27 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelPipeline createSendPipeline() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&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; &amp;nbsp;pipeline.addLast(&amp;quot;reqencoder&amp;quot;, new HttpRequestEncoder()); // downstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;respdecoder&amp;quot;, new HttpResponseDecoder()); // upstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(HttpTunnelMessageUtils.MAX_BODY_SIZE)); // upstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;sendHandler&amp;quot;, new HttpTunnelClientSendHandler(this)); // both
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;writeFragmenter&amp;quot;, new WriteFragmenter(HttpTunnelMessageUtils.MAX_BODY_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; &amp;nbsp;return pipeline;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelPipeline createPollPipeline() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&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; &amp;nbsp;pipeline.addLast(&amp;quot;reqencoder&amp;quot;, new HttpRequestEncoder()); // downstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;respdecoder&amp;quot;, new HttpResponseDecoder()); // upstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(HttpTunnelMessageUtils.MAX_BODY_SIZE)); // upstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(HttpTunnelClientPollHandler.NAME, new HttpTunnelClientPollHandler(this)); // both
&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; &amp;nbsp;return pipeline;
&lt;br&gt;&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;private void setTunnelIdForPollChannel() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientPollHandler pollHandler = pollChannel.getPipeline().get(HttpTunnelClientPollHandler.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollHandler.setTunnelId(tunnelId);
&lt;br&gt;@@ -181,11 +181,11 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void fullyEstablished() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!bound) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.bound = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bound = true;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelBound(this, getLocalAddress());
&lt;br&gt;&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;this.connected = true;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connected = true;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectFuture.setSuccess();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(this, getRemoteAddress());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -203,25 +203,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;});
&lt;br&gt;&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;public String getServerHostName() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(serverHostName == null) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverHostName = HttpTunnelMessageUtils.convertToHostString(serverAddress); 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverHostName = HttpTunnelMessageUtils.convertToHostString(serverAddress);
&lt;br&gt;&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;return serverHostName; 
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return serverHostName;
&lt;br&gt;&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;private class ConsolidatingFutureListener implements ChannelFutureListener {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelFuture completionFuture;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private AtomicInteger eventsLeft;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final ChannelFuture completionFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final AtomicInteger eventsLeft;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ConsolidatingFutureListener(ChannelFuture completionFuture, int numToConsolidate) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.completionFuture = completionFuture;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;eventsLeft = new AtomicInteger(numToConsolidate);
&lt;br&gt;&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; &amp;nbsp;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;completionFuture.setFailure(future.getCause());
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -15,27 +15,26 @@
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import java.net.Socket;
&lt;br&gt;&amp;nbsp;import java.net.SocketAddress;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.DefaultChannelConfig;
&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;- * Configuration for the client end of an HTTP tunnel. Any socket channel properties set here 
&lt;br&gt;- * will be applied uniformly to the underlying send and poll channels, created from the channel 
&lt;br&gt;+ * Configuration for the client end of an HTTP tunnel. Any socket channel properties set here
&lt;br&gt;+ * will be applied uniformly to the underlying send and poll channels, created from the channel
&lt;br&gt;&amp;nbsp; * factory provided to the {@link HttpTunnelClientChannelFactory}.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * HTTP tunnel clients have the following additional options:
&lt;br&gt;- * 
&lt;br&gt;+ *
&lt;br&gt;&amp;nbsp; * &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;nbsp; * &amp;lt;tr&amp;gt;
&lt;br&gt;&amp;nbsp; * &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Associated setter method&amp;lt;/th&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;proxyAddress&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setProxyAddress(Socket)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;td&amp;gt;{@code &amp;quot;proxyAddress&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setProxyAddress(SocketAddress)}&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;- * 
&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=4055707&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055707&amp;i=5&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;@@ -43,34 +42,34 @@
&lt;br&gt;&amp;nbsp;public class HttpTunnelClientChannelConfig extends DefaultChannelConfig implements SocketChannelConfig {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final String PROXY_ADDRESS_OPTION = &amp;quot;proxyAddress&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final SocketChannelConfig sendChannelConfig;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final SocketChannelConfig pollChannelConfig;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private SocketAddress proxyAddress;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpTunnelClientChannelConfig(SocketChannelConfig sendChannelConfig, SocketChannelConfig pollChannelConfig) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sendChannelConfig = sendChannelConfig;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pollChannelConfig = pollChannelConfig;
&lt;br&gt;&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;/* HTTP TUNNEL SPECIFIC CONFIGURATION */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public boolean setOption(String key, Object value) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(super.setOption(key, value)) {
&lt;br&gt;&amp;nbsp; &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; &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; &amp;nbsp;if(PROXY_ADDRESS_OPTION.equals(key)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setProxyAddress((SocketAddress) value);
&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; &amp;nbsp;return false;
&lt;br&gt;&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; &amp;nbsp;return true;
&lt;br&gt;&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; * @return the address of the http proxy. If this is null, then no proxy
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * should be used.
&lt;br&gt;@@ -78,7 +77,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public SocketAddress getProxyAddress() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return proxyAddress;
&lt;br&gt;&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; * Specify a proxy to be used for the http tunnel. If this is null, then
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * no proxy should be used, otherwise this should be a directly accessible IPv4/IPv6
&lt;br&gt;@@ -87,7 +86,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setProxyAddress(SocketAddress proxyAddress) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.proxyAddress = proxyAddress;
&lt;br&gt;&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;/* GENERIC SOCKET CHANNEL CONFIGURATION */
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public int getReceiveBufferSize() {
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -42,28 +42,29 @@
&lt;br&gt;&amp;nbsp;class HttpTunnelClientSendHandler extends SimpleChannelHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;client2server&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientSendHandler.class.getName());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String tunnelId = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;// FIXME Unused field - safe to remove?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private String host;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private AtomicBoolean disconnecting;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final AtomicBoolean disconnecting;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelStateEvent postShutdownEvent;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ConcurrentLinkedQueue&amp;lt;MessageEvent&amp;gt; queuedWrites;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private AtomicInteger pendingRequestCount;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ConcurrentLinkedQueue&amp;lt;MessageEvent&amp;gt; queuedWrites;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final AtomicInteger pendingRequestCount;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private long sendRequestTime;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpTunnelClientSendHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queuedWrites = new ConcurrentLinkedQueue&amp;lt;MessageEvent&amp;gt;();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingRequestCount = new AtomicInteger(0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;disconnecting = new AtomicBoolean(false);
&lt;br&gt;&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;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;@@ -76,17 +77,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = (HttpResponse)e.getMessage();
&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; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long roundTripTime = System.nanoTime() - sendRequestTime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for tunnel {0}, after {1}ns&amp;quot;, new Object[] { tunnelId, roundTripTime });
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelOpenResponse(response)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = HttpTunnelMessageUtils.extractCookie(response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelId = HttpTunnelMessageUtils.extractCookie(response);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;tunnel open request accepted - id {0}&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.onTunnelOpened(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;@@ -110,7 +111,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private synchronized void sendQueuedData(ChannelHandlerContext ctx) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending close request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;@@ -142,22 +143,22 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;write request for tunnel {0} queued&amp;quot;, tunnelId);
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void closeRequested(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdownTunnel(ctx, e);
&lt;br&gt;&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;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void disconnectRequested(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdownTunnel(ctx, e);
&lt;br&gt;&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;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void unbindRequested(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdownTunnel(ctx, e);
&lt;br&gt;&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;private void shutdownTunnel(ChannelHandlerContext ctx, ChannelStateEvent postShutdownEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;tunnel shutdown requested for send channel of tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!ctx.getChannel().isConnected()) {
&lt;br&gt;@@ -165,20 +166,20 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(postShutdownEvent);
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!disconnecting.compareAndSet(false, true)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;tunnel shutdown process already initiated for tunnel {0}&amp;quot;, tunnelId);
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.postShutdownEvent = postShutdownEvent;
&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; &amp;nbsp;// if the channel is idle, send a close request immediately
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public String getTunnelId() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -33,9 +33,9 @@
&lt;br&gt;&amp;nbsp;class HttpTunnelServerChannelSink extends AbstractChannelSink {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&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; &amp;nbsp;if(e instanceof ChannelStateEvent) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelStateEvent ev = (ChannelStateEvent) e;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(ev.getState()) {
&lt;br&gt;@@ -58,7 +58,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final class ChannelFutureProxy implements ChannelFutureListener {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final ChannelFuture upstreamFuture;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelFutureProxy(ChannelFuture upstreamFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureProxy(ChannelFuture upstreamFuture) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.upstreamFuture = upstreamFuture;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -40,13 +40,13 @@
&lt;br&gt;&amp;nbsp;class ServerMessageSwitch implements ServerMessageSwitchUpstreamInterface, ServerMessageSwitchDownstreamInterface {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(ServerMessageSwitch.class.getName());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private String tunnelIdPrefix;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private AtomicInteger tunnelIdSequence;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelFactory newChannelFactory;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ConcurrentHashMap&amp;lt;String, TunnelInfo&amp;gt; tunnelsById;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final String tunnelIdPrefix;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final AtomicInteger tunnelIdSequence;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final HttpTunnelAcceptedChannelFactory newChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ConcurrentHashMap&amp;lt;String, TunnelInfo&amp;gt; tunnelsById;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ServerMessageSwitch(HttpTunnelAcceptedChannelFactory newChannelFactory) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.newChannelFactory = newChannelFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelIdPrefix = Long.toHexString(new Random().nextLong());
&lt;br&gt;@@ -75,13 +75,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, HttpTunnelMessageUtils.createRejection(null, &amp;quot;Unknown tunnel, possibly already closed&amp;quot;));
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!tunnel.responseChannel.compareAndSet(null, channel)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;Duplicate poll request detected for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, HttpTunnelMessageUtils.createRejection(null, &amp;quot;Only one poll request at a time per tunnel allowed&amp;quot;));
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(tunnel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -91,13 +91,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// no data to send, or it has already been dealt with by another thread
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel responseChannel = state.responseChannel.getAndSet(null);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(responseChannel == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// no response channel, or another thread has already used it
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending response for tunnel id {0} to {1}&amp;quot;, new Object[] { state.tunnelId, responseChannel.getRemoteAddress() });
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QueuedResponse messageToSend = queuedData.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(messageToSend.data);
&lt;br&gt;@@ -118,11 +118,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;routing inbound data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(tunnel.localChannel, inboundData);
&lt;br&gt;&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;public void closeTunnel(String tunnelId) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelsById.remove(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -134,34 +134,38 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;attempt made to send data out on tunnel id {0} which is unknown or closed&amp;quot;, tunnelId);
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WriteSplitter splitter = new WriteSplitter(HttpTunnelMessageUtils.MAX_BODY_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; &amp;nbsp;ChannelFutureAggregator aggregator = new ChannelFutureAggregator(writeFuture);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(data);
&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; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;routing outbound data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelBuffer fragment : fragments) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture fragmentFuture = Channels.future(writeFuture.getChannel());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregator.addFuture(fragmentFuture);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnel.queuedResponses.offer(new QueuedResponse(fragment, fragmentFuture));
&lt;br&gt;&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; &amp;nbsp;sendQueuedData(tunnel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private class TunnelInfo {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final class TunnelInfo {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public String tunnelId;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public Channel localChannel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public AtomicReference&amp;lt;Channel&amp;gt; responseChannel = new AtomicReference&amp;lt;Channel&amp;gt;(null);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ConcurrentLinkedQueue&amp;lt;QueuedResponse&amp;gt; queuedResponses = new ConcurrentLinkedQueue&amp;lt;QueuedResponse&amp;gt;();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&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; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private class QueuedResponse {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final class QueuedResponse {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelBuffer data;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelFuture writeFuture;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public QueuedResponse(ChannelBuffer data, ChannelFuture writeFuture) {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QueuedResponse(ChannelBuffer data, ChannelFuture writeFuture) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.data = data;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.writeFuture = writeFuture;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -28,13 +28,13 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * Downstream handler which places an upper bound on the size of written
&lt;br&gt;- * {@link org.jboss.netty.ChannelBuffer ChannelBuffers}. If a buffer
&lt;br&gt;+ * {@link ChannelBuffer ChannelBuffers}. If a buffer
&lt;br&gt;&amp;nbsp; * is bigger than the specified upper bound, the buffer is broken up
&lt;br&gt;&amp;nbsp; * into two or more smaller pieces.
&lt;br&gt;&amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;&amp;nbsp; * This is utilised by the http tunnel to smooth out the per-byte latency,
&lt;br&gt;&amp;nbsp; * by placing an upper bound on HTTP request / response body sizes.
&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=4055707&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055707&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;@@ -48,15 +48,15 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public WriteFragmenter(int splitThreshold) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.splitThreshold = splitThreshold;
&lt;br&gt;&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;public void setSplitThreshold(int splitThreshold) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.splitThreshold = splitThreshold;
&lt;br&gt;&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;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = (ChannelBuffer)e.getMessage();
&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; &amp;nbsp;if(data.readableBytes() &amp;lt;= splitThreshold) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.writeRequested(ctx, e);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else {
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -27,16 +27,16 @@
&lt;br&gt;&amp;nbsp;public class AcceptedServerChannelRequestDispatchTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final String HOST = &amp;quot;test.server.com&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final String KNOWN_TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected static final String UNKNOWN_TUNNEL_ID = &amp;quot;unknownTunnel&amp;quot;;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private AcceptedServerChannelRequestDispatch handler;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;FakeSocketChannel channel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FakeChannelSink sink;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerMessageSwitchUpstreamInterface messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ServerMessageSwitchUpstreamInterface messageSwitch;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;@@ -47,49 +47,49 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = InetSocketAddress.createUnresolved(&amp;quot;test.client.com&amp;quot;, 51231);
&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; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ignoring(messageSwitch).isOpenTunnel(KNOWN_TUNNEL_ID); will(returnValue(true));
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testTunnelOpenRequest() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).createTunnel(channel.remoteAddress); will(returnValue(KNOWN_TUNNEL_ID));
&lt;br&gt;&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; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createOpenTunnelRequest(HOST));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isTunnelOpenResponse(response));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testTunnelCloseRequest() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).closeTunnel(KNOWN_TUNNEL_ID);
&lt;br&gt;&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; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createCloseTunnelRequest(HOST, KNOWN_TUNNEL_ID);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isTunnelCloseResponse(response));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testTunnelCloseRequestWithoutTunnelIdRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createCloseTunnelRequest(HOST, null);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithoutTunnelIdIsRejected(request);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testTunnelCloseRequestWithUnknownTunnelId() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createCloseTunnelRequest(HOST, UNKNOWN_TUNNEL_ID);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithUnknownTunnelIdIsRejected(request);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendDataRequest() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer expectedData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;@@ -97,36 +97,36 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).routeInboundData(KNOWN_TUNNEL_ID, expectedData);
&lt;br&gt;&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; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, KNOWN_TUNNEL_ID, expectedData);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&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; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isOKResponse(response));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendDataRequestWithNoContentRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, KNOWN_TUNNEL_ID, ChannelBuffers.dynamicBuffer());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&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; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkResponseIsRejection(&amp;quot;Send data requests must contain data&amp;quot;);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendDataRequestForUnknownTunnelIdRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, UNKNOWN_TUNNEL_ID, ChannelBuffers.dynamicBuffer());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithUnknownTunnelIdIsRejected(request);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendDataRequestWithoutTunnelIdRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, null, ChannelBuffers.dynamicBuffer());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithoutTunnelIdIsRejected(request);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testReceiveDataRequest() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;@@ -135,39 +135,39 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(HOST, KNOWN_TUNNEL_ID);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testReceiveDataRequestWithoutTunnelIdRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(HOST, null);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithoutTunnelIdIsRejected(request);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testReceiveDataRequestForUnknownTunnelIdRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(HOST, UNKNOWN_TUNNEL_ID);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithUnknownTunnelIdIsRejected(request);
&lt;br&gt;&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;private void checkRequestWithoutTunnelIdIsRejected(HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.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; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isRejection(response));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;no tunnel id specified in send data request&amp;quot;, HttpTunnelMessageUtils.extractErrorMessage(response));
&lt;br&gt;&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;private void checkRequestWithUnknownTunnelIdIsRejected(HttpRequest request) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).isOpenTunnel(UNKNOWN_TUNNEL_ID); will(returnValue(false));
&lt;br&gt;&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; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.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; &amp;nbsp;checkResponseIsRejection(&amp;quot;tunnel id \&amp;quot;unknownTunnel\&amp;quot; is either closed or does not exist&amp;quot;);
&lt;br&gt;&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;private void checkResponseIsRejection(String errorMessage) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isRejection(response));
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -22,12 +22,12 @@
&lt;br&gt;&amp;nbsp;public class HttpTunnelAcceptedChannelSinkTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerMessageSwitchDownstreamInterface messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ServerMessageSwitchDownstreamInterface messageSwitch;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelSink sink;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private UpstreamEventCatcher upstreamCatcher;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch = mockContext.mock(ServerMessageSwitchDownstreamInterface.class);
&lt;br&gt;@@ -42,21 +42,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendData() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer outboundData = NettyTestUtils.createData(1234L);
&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; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).routeOutboundData(with(equal(TUNNEL_ID)), with(same(outboundData)), with(any(ChannelFuture.class)));
&lt;br&gt;&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; &amp;nbsp;Channels.write(channel, outboundData);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendInvalidDataType() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, new Object());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, upstreamCatcher.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsExceptionEvent(upstreamCatcher.events.poll());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testUnbind() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;@@ -64,13 +64,13 @@
&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;Channels.unbind(channel);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testDisconnect() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).closeTunnel(TUNNEL_ID);
&lt;br&gt;&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; &amp;nbsp;Channels.disconnect(channel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -20,7 +20,7 @@
&lt;br&gt;&amp;nbsp; * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4055707&amp;i=8&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;public class HttpTunnelClientSendHandlerTest {
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3 }, 12345);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InetSocketAddress PROXY_ADDRESS = createAddress(new byte[] { 10, 0, 0, 2 }, 8888);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final InetSocketAddress LOCAL_ADDRESS = createAddress(new byte[] { 10, 0, 0, 1 }, 54321);
&lt;br&gt;@@ -29,7 +29,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private HttpTunnelClientSendHandler handler;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private MockChannelStateListener listener;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;@@ -42,7 +42,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = PROXY_ADDRESS;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.localAddress = LOCAL_ADDRESS;
&lt;br&gt;&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;private static InetSocketAddress createAddress(byte[] addr, int port) {
&lt;br&gt;&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;return new InetSocketAddress(InetAddress.getByAddress(addr), port);
&lt;br&gt;@@ -59,7 +59,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isOpenTunnelRequest(request));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testStoresTunnelId() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnect();
&lt;br&gt;@@ -67,7 +67,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, handler.getTunnelId());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, listener.tunnelId);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendData() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;@@ -76,38 +76,38 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelEvent sentEvent = sink.events.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsSendDataRequestWithData(sentEvent, &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testWillNotSendDataUntilTunnelIdSet() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnect();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(NettyTestUtils.createData(1234L));
&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; &amp;nbsp;assertEquals(0, sink.events.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; &amp;nbsp;Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testOnlyOneRequestAtATime() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	emulateConnectAndOpen();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	channel.write(NettyTestUtils.createData(5678L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	assertEquals(0, sink.events.size());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;	
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;	checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(5678L));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testDisconnect() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&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; &amp;nbsp;channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;@@ -115,7 +115,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.disconnect();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.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; &amp;nbsp;HttpRequest request = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpRequest.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isCloseTunnelRequest(request));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, HttpTunnelMessageUtils.extractTunnelId(request));
&lt;br&gt;@@ -123,11 +123,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(sink.events.poll(), ChannelState.CONNECTED, null);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testClose() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&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; &amp;nbsp;channel.close();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpRequest.class);
&lt;br&gt;@@ -137,7 +137,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(sink.events.poll(), ChannelState.OPEN, false);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testWritesAfterCloseAreRejected() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;@@ -145,7 +145,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.close();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(channel.write(NettyTestUtils.createData(1234L)).isSuccess());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;// FIXME expectedHost is unused. &amp;nbsp;Safe to remove?
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void checkIsSendDataRequestWithData(ChannelEvent event, String expectedHost, ChannelBuffer data) {
&lt;br&gt;&amp;nbsp;		assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;&amp;nbsp;		DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;@@ -153,7 +154,7 @@
&lt;br&gt;&amp;nbsp;		HttpRequest request = (HttpRequest) messageEvent.getMessage();
&lt;br&gt;&amp;nbsp;		assertTrue(HttpTunnelMessageUtils.isSendDataRequest(request));
&lt;br&gt;&amp;nbsp;		assertEquals(data.readableBytes(), request.getContentLength());
&lt;br&gt;-		
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;		ChannelBuffer content = request.getContent();
&lt;br&gt;&amp;nbsp;		NettyTestUtils.assertEquals(data, content);
&lt;br&gt;&amp;nbsp;	}
&lt;br&gt;@@ -162,11 +163,11 @@
&lt;br&gt;&amp;nbsp;	 &amp;nbsp; &amp;nbsp;channel.emulateConnected(LOCAL_ADDRESS, PROXY_ADDRESS, null);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink.events.clear();
&lt;br&gt;&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;private void emulateConnectAndOpen() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnect();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createTunnelOpenResponse(&amp;quot;newTunnel&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; &amp;nbsp;sink.events.clear();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -21,12 +21,12 @@
&lt;br&gt;&amp;nbsp;@RunWith(JMock.class)
&lt;br&gt;&amp;nbsp;public class HttpTunnelServerChannelFactoryTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerSocketChannelFactory realChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ServerSocketChannelFactory realChannelFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelFactory factory;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ServerSocketChannel realChannel;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory = mockContext.mock(ServerSocketChannelFactory.class);
&lt;br&gt;@@ -45,14 +45,14 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(newChannel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(pipeline, newChannel.getPipeline());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testNewChannel_forwardsWrappedFactoryFailure() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelException innerException = new ChannelException();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannelFactory).newChannel(with(any(ChannelPipeline.class))); will(throwException(innerException));
&lt;br&gt;&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; &amp;nbsp;try {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;factory.newChannel(Channels.pipeline());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fail(&amp;quot;Expected ChannelException&amp;quot;);
&lt;br&gt;@@ -60,17 +60,17 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(innerException, e);
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp;public void testChannelCreation_withServerBootstrap() {
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannelFactory).newChannel(with(any(ChannelPipeline.class))); will(returnValue(realChannel));
&lt;br&gt;&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; &amp;nbsp;ServerBootstrap bootstrap = new ServerBootstrap(factory);
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel newChannel = bootstrap.bind(new InetSocketAddress(80));
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(newChannel);
&lt;br&gt;-// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+//
&lt;br&gt;&amp;nbsp;// &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -27,16 +27,16 @@
&lt;br&gt;&amp;nbsp;@RunWith(JMock.class)
&lt;br&gt;&amp;nbsp;public class HttpTunnelServerChannelSinkTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelSink sink;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelPipeline pipeline;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelFuture realFuture;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private Throwable exceptionInPipeline;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ServerSocketChannel realChannel;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ChannelFuture realFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Throwable exceptionInPipeline;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannel = mockContext.mock(ServerSocketChannel.class);
&lt;br&gt;@@ -47,18 +47,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture = Channels.future(realChannel);
&lt;br&gt;&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;@After
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void teardown() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(&amp;quot;exception caught in pipeline: &amp;quot; + exceptionInPipeline, exceptionInPipeline == null);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testCloseRequest() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).close(); will(returnValue(realFuture));
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).close(); will(returnValue(realFuture));
&lt;br&gt;&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; &amp;nbsp;ChannelFuture virtualFuture1 = Channels.close(channel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.assertIsSatisfied();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = virtualFuture1;
&lt;br&gt;@@ -72,7 +72,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setSuccess();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(virtualFuture.isSuccess());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testUnbindRequest_withFailure() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkUnbind();
&lt;br&gt;@@ -84,19 +84,19 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).unbind(); will(returnValue(realFuture));
&lt;br&gt;&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; &amp;nbsp;ChannelFuture virtualFuture = Channels.unbind(channel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.assertIsSatisfied();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return virtualFuture;
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testBindRequest_withSuccess() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkBind();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setSuccess();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(virtualFuture.isSuccess());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testBindRequest_withFailure() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkBind();
&lt;br&gt;@@ -109,16 +109,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).bind(toAddress); will(returnValue(realFuture));
&lt;br&gt;&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; &amp;nbsp;ChannelFuture virtualFuture = Channels.bind(channel, toAddress);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return virtualFuture;
&lt;br&gt;&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;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final class ExceptionCatcher extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExceptionCatcher() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&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; &amp;nbsp;@Override
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exceptionInPipeline = e.getCause();
&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;public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exceptionInPipeline = e.getCause();
&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;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -41,18 +41,18 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int SERVER_PORT = 20100;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelSoakTester.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final Logger LOG = Logger.getLogger(HttpTunnelSoakTester.class.getName());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ServerBootstrap serverBootstrap;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ClientBootstrap clientBootstrap;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private final ChannelGroup channels;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;final ChannelGroup channels;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int expectedNextByte = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int nextWriteByte = 0;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ExecutorService executor;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private final ScheduledExecutorService scheduledExecutor;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private final ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt; verificationQueue;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;final ScheduledExecutorService scheduledExecutor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;final ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt; verificationQueue;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpTunnelSoakTester() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;@@ -246,7 +246,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return randomBytes;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void main(String[] args) throws UnknownHostException {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void main(String[] args) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelSoakTester soakTester = new HttpTunnelSoakTester();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;soakTester.run();
&lt;br&gt;@@ -263,7 +263,12 @@
&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 EchoHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static class EchoHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;EchoHandler() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&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; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx.getChannel(), e.getMessage());
&lt;br&gt;@@ -272,6 +277,11 @@
&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; &amp;nbsp;private class ResponseVerifier extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ResponseVerifier() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&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; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer receivedBytes = (ChannelBuffer) e.getMessage();
&lt;br&gt;@@ -285,6 +295,11 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private class VerificationTask implements Runnable {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;VerificationTask() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super();
&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; &amp;nbsp;public void run() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer bytesToVerify = verificationQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(bytesToVerify == null) {
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -41,29 +41,29 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelFactory serverFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ClientBootstrap clientBootstrap;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ServerBootstrap serverBootstrap;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelGroup activeConnections;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelHandler clientCaptureHandler;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerEndHandler connectionCaptureHandler;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private Channel serverEnd;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private CountDownLatch serverEndLatch;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelBuffer receivedBytes;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private CountDownLatch messageReceivedLatch;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelBuffer clientReceivedBytes;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private CountDownLatch clientMessageReceivedLatch;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ChannelGroup activeConnections;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ChannelHandler clientCaptureHandler;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ServerEndHandler connectionCaptureHandler;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;Channel serverEnd;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;CountDownLatch serverEndLatch;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ChannelBuffer receivedBytes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;CountDownLatch messageReceivedLatch;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;ChannelBuffer clientReceivedBytes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;CountDownLatch clientMessageReceivedLatch;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private Channel serverChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() throws UnknownHostException {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections = new DefaultChannelGroup();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientFactory = new HttpTunnelClientChannelFactory(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverFactory = new HttpTunnelServerChannelFactory(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
&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; &amp;nbsp;clientBootstrap = new ClientBootstrap(clientFactory);
&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; &amp;nbsp;clientCaptureHandler = new ClientEndHandler();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -73,30 +73,30 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&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;});
&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; &amp;nbsp;clientReceivedBytes = ChannelBuffers.dynamicBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientMessageReceivedLatch = new CountDownLatch(1);
&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; &amp;nbsp;serverBootstrap = new ServerBootstrap(serverFactory);
&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; &amp;nbsp;connectionCaptureHandler = new ServerEndHandler();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
&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; &amp;nbsp;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;capture&amp;quot;, connectionCaptureHandler);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&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;});
&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; &amp;nbsp;serverEndLatch = new CountDownLatch(1);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;receivedBytes = ChannelBuffers.dynamicBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageReceivedLatch = new CountDownLatch(1);
&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; &amp;nbsp;serverChannel = serverBootstrap.bind(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(serverChannel);
&lt;br&gt;&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;@After
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void tearDown() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.disconnect().await(1000L);
&lt;br&gt;@@ -110,55 +110,55 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.await(1000L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.isSuccess());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(connectFuture.getChannel());
&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; &amp;nbsp;Channel clientChannel = connectFuture.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(clientChannel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(serverChannel.getLocalAddress(), clientChannel.getRemoteAddress());
&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; &amp;nbsp;assertTrue(serverEndLatch.await(1000, TimeUnit.MILLISECONDS));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(serverEnd);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(clientChannel.getLocalAddress(), serverEnd.getRemoteAddress());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendDataFromClientToServer() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture connectFuture = clientBootstrap.connect(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.await(1000L));
&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; &amp;nbsp;Channel clientEnd = connectFuture.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(clientEnd);
&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; &amp;nbsp;assertTrue(serverEndLatch.await(1000, TimeUnit.MILLISECONDS));
&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; &amp;nbsp;ChannelFuture writeFuture = Channels.write(clientEnd, NettyTestUtils.createData(100L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.await(1000L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.isSuccess());
&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; &amp;nbsp;assertTrue(messageReceivedLatch.await(1000L, TimeUnit.MILLISECONDS));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(100L, receivedBytes.readLong());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testSendDataFromServerToClient() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture connectFuture = clientBootstrap.connect(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.await(1000L));
&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; &amp;nbsp;Channel clientEnd = connectFuture.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(clientEnd);
&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; &amp;nbsp;assertTrue(serverEndLatch.await(1000, TimeUnit.MILLISECONDS));
&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; &amp;nbsp;ChannelFuture writeFuture = Channels.write(serverEnd, NettyTestUtils.createData(4321L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.await(1000L));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.isSuccess());
&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; &amp;nbsp;assertTrue(clientMessageReceivedLatch.await(1000, TimeUnit.MILLISECONDS));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(4321L, clientReceivedBytes.readLong());
&lt;br&gt;&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;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;class ServerEndHandler extends SimpleChannelUpstreamHandler {
&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; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverEnd = e.getChannel();
&lt;br&gt;@@ -166,14 +166,14 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverEndLatch.countDown();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.channelConnected(ctx, e);
&lt;br&gt;&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; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;receivedBytes.writeBytes((ChannelBuffer) e.getMessage());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageReceivedLatch.countDown();
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;class ClientEndHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java	2009-11-24 03:58:04 UTC (rev 1916)
&lt;br&gt;@@ -26,26 +26,26 @@
&lt;br&gt;&amp;nbsp;public class ServerMessageSwitchTest {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public static final InetSocketAddress REMOTE_ADDRESS = InetSocketAddress.createUnresolved(&amp;quot;test.client.com&amp;quot;, 52354);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private ServerMessageSwitch messageSwitch;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelFactory newChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;HttpTunnelAcceptedChannelFactory newChannelFactory;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private UpstreamEventCatcher htunEventCatcher;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FakeChannelSink responseCatcher;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FakeSocketChannel htunChannel;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private FakeSocketChannel requesterChannel;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newChannelFactory = mockContext.mock(HttpTunnelAcceptedChannelFactory.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch = new ServerMessageSwitch(newChannelFactory);
&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; &amp;nbsp;final Channel htunAcceptedChannel = createTunnelChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createRequesterChannel();
&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; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(newChannelFactory).newChannel(with(any(String.class)), with(equal(REMOTE_ADDRESS))); will(returnValue(htunAcceptedChannel));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}});
&lt;br&gt;@@ -57,67 +57,67 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptedChannelPipeline.addLast(UpstreamEventCatcher.NAME, htunEventCatcher);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FakeSocketChannel htunAcceptedChannel = new FakeSocketChannel(null, null, acceptedChannelPipeline, new FakeChannelSink());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;htunEventCatcher.events.clear();
&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; &amp;nbsp;return htunAcceptedChannel;
&lt;br&gt;&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;private FakeSocketChannel createRequesterChannel() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline requesterChannelPipeline = Channels.pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;responseCatcher = new FakeChannelSink();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;requesterChannel = new FakeSocketChannel(null, null, requesterChannelPipeline, responseCatcher);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;responseCatcher.events.clear();
&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; &amp;nbsp;return requesterChannel;
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testRouteInboundData() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer inboundData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inboundData.writeLong(1234L);
&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; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeInboundData(tunnelId, inboundData);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, htunEventCatcher.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer receivedData = NettyTestUtils.checkIsUpstreamMessageEvent(htunEventCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(receivedData, inboundData);
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testRouteOutboundData_onPoll() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer outboundData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;outboundData.writeLong(1234L);
&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; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeOutboundData(tunnelId, outboundData, Channels.future(htunChannel));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.pollOutboundData(tunnelId, requesterChannel);
&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; &amp;nbsp;assertEquals(1, responseCatcher.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(responseCatcher.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(outboundData, response.getContent());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testRouteOutboundData_withDanglingRequest() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.pollOutboundData(tunnelId, requesterChannel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, responseCatcher.events.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; &amp;nbsp;ChannelBuffer outboundData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;outboundData.writeLong(1234L);
&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; &amp;nbsp;messageSwitch.routeOutboundData(tunnelId, outboundData, Channels.future(htunChannel));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, responseCatcher.events.size());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(responseCatcher.events.poll(), HttpResponse.class);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(outboundData, response.getContent());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testCloseTunnel() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(messageSwitch.isOpenTunnel(tunnelId));
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testRouteInboundDataIgnoredAfterClose() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = NettyTestUtils.createData(1234L);
&lt;br&gt;@@ -126,7 +126,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeInboundData(tunnelId, data);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, htunEventCatcher.events.size());
&lt;br&gt;&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;@Test
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void testRouteOutboundDataIgnoredAfterClose() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = NettyTestUtils.createData(1234L);
&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=4055707&amp;i=9&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/r1916-in-branches-httptunnel-src-test-java-org-jboss-netty-channel-socket-httptunnel-and-1-other-dir-tp4055707p4055707.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4055630</id>
	<title>r1915 - branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel.</title>
	<published>2009-11-23T19:29:27Z</published>
	<updated>2009-11-23T19:29:27Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 22:29:26 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1915
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;Log:
&lt;br&gt;Fixed a compilation error in Java 5
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;+++ branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java	2009-11-24 03:29:26 UTC (rev 1915)
&lt;br&gt;@@ -42,18 +42,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final int SERVER_PORT = 20100;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelSoakTester.class.getName());
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ServerBootstrap serverBootstrap;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ClientBootstrap clientBootstrap;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelGroup channels;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ServerBootstrap serverBootstrap;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ClientBootstrap clientBootstrap;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ChannelGroup channels;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int expectedNextByte = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;int nextWriteByte = 0;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ExecutorService executor;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ScheduledExecutorService scheduledExecutor;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt; verificationQueue;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ExecutorService executor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ScheduledExecutorService scheduledExecutor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt; verificationQueue;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public HttpTunnelSoakTester() {
&lt;br&gt;&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;System.in.read();
&lt;br&gt;@@ -66,23 +66,23 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verificationQueue = new ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt;();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ServerSocketChannelFactory serverChannelFactory = new NioServerSocketChannelFactory(executor, executor);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelServerChannelFactory serverTunnelFactory = new HttpTunnelServerChannelFactory(serverChannelFactory);
&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; &amp;nbsp;serverBootstrap = new ServerBootstrap(serverTunnelFactory);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.setPipelineFactory(createServerPipelineFactory());
&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; &amp;nbsp;ClientSocketChannelFactory clientChannelFactory = new NioClientSocketChannelFactory(executor, executor);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientChannelFactory clientTunnelFactory = new HttpTunnelClientChannelFactory(clientChannelFactory);
&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; &amp;nbsp;clientBootstrap = new ClientBootstrap(clientTunnelFactory);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.setPipelineFactory(createClientPipelineFactory());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configureProxy();
&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; &amp;nbsp;channels = new DefaultChannelGroup();
&lt;br&gt;&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;private void configureProxy() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String proxyHost = System.getProperty(&amp;quot;http.proxyHost&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(proxyHost != null &amp;&amp; !proxyHost.isEmpty()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(proxyHost != null &amp;&amp; proxyHost.length() != 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int proxyPort = Integer.getInteger(&amp;quot;http.proxyPort&amp;quot;, 80);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetAddress chosenAddress = chooseAddress(proxyHost);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetSocketAddress proxyAddress = new InetSocketAddress(chosenAddress, proxyPort);
&lt;br&gt;@@ -104,10 +104,10 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(address.isAnyLocalAddress() || address.isLinkLocalAddress()) {
&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;continue;
&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;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return address;
&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;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &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;} catch (UnknownHostException e) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&lt;br&gt;@@ -116,7 +116,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected ChannelPipelineFactory createClientPipelineFactory() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new ChannelPipelineFactory() {
&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; &amp;nbsp;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;responseVerifier&amp;quot;, new ResponseVerifier());
&lt;br&gt;@@ -127,7 +127,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;protected ChannelPipelineFactory createServerPipelineFactory() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new ChannelPipelineFactory() {
&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; &amp;nbsp;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;echo&amp;quot;, new EchoHandler());
&lt;br&gt;@@ -141,27 +141,27 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel serverChannel = serverBootstrap.bind(new InetSocketAddress(SERVER_PORT));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels.add(serverChannel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;server channel bound to {0}&amp;quot;, serverChannel.getLocalAddress());
&lt;br&gt;- &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;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel clientChannel = createClientChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(clientChannel == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;no client channel - bailing out&amp;quot;);
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels.add(clientChannel);
&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; &amp;nbsp;scheduledExecutor.execute(new VerificationTask());
&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; &amp;nbsp;if(!pushData(clientChannel)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;Data send cycle failed&amp;quot;);
&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; &amp;nbsp;LOG.info(&amp;quot;send cycle completed successfully&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;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;closing channels&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;closeChannel(clientChannel);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;closeChannel(serverChannel);
&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; &amp;nbsp;LOG.info(&amp;quot;done!&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -181,7 +181,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; 10000; i++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] randomBytesForSend = createRandomSizeByteArray();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;totalBytesSent += randomBytesForSend.length;
&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; &amp;nbsp;long startTime = System.nanoTime();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture writeFuture = clientChannel.write(ChannelBuffers.wrappedBuffer(randomBytesForSend));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;@@ -198,18 +198,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.SEVERE, &amp;quot;Interrupted while waiting for bytes to be written&amp;quot;, e);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&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;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(i % 100 == 0 &amp;&amp; i &amp;gt; 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;{0} writes completed, totalling {1} bytes&amp;quot;, new Object[] { i, totalBytesSent });
&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;}
&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; &amp;nbsp;long runEndTime = System.currentTimeMillis();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long totalTime = runEndTime - runStartTime;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long totalKB = totalBytesSent / 1024;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double rate = totalKB / (totalTime / 1000.0);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;Average throughput: {0} KB/s&amp;quot;, rate);
&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; &amp;nbsp;return true;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -225,12 +225,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;Interrupted while waiting for client connect to be established&amp;quot;);
&lt;br&gt;&amp;nbsp; &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;}
&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; &amp;nbsp;if(!clientChannelFuture.isSuccess()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.SEVERE, &amp;quot;did not connect successfully&amp;quot;, clientChannelFuture.getCause());
&lt;br&gt;&amp;nbsp; &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;}
&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; &amp;nbsp;return clientChannelFuture.getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -242,7 +242,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;randomBytes[i] = (byte)nextWriteByte;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nextWriteByte = (nextWriteByte + 1) % 127;
&lt;br&gt;&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; &amp;nbsp;return randomBytes;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -254,7 +254,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;soakTester.shutdown();
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void shutdown() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.releaseExternalResources();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.releaseExternalResources();
&lt;br&gt;@@ -269,7 +269,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx.getChannel(), e.getMessage());
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private class ResponseVerifier extends SimpleChannelUpstreamHandler {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;@@ -277,31 +277,31 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer receivedBytes = (ChannelBuffer) e.getMessage();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verificationQueue.offer(receivedBytes);
&lt;br&gt;&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; &amp;nbsp;@Override
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels.add(ctx.getChannel());
&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; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private class VerificationTask implements Runnable {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void run() {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer bytesToVerify = verificationQueue.poll();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(bytesToVerify == null) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor.schedule(this, 10, TimeUnit.MILLISECONDS);
&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;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(bytesToVerify.readable()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(bytesToVerify.readByte() != expectedNextByte) {
&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;LOG.severe(&amp;quot;received a byte out of sequence&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;System.exit(-1);
&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;
&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;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedNextByte = (expectedNextByte + 1) % 127;
&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;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor.execute(this);
&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;_______________________________________________
&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=4055630&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/r1915-branches-httptunnel-src-test-java-org-jboss-netty-channel-socket-httptunnel-tp4055630p4055630.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4050598</id>
	<title>r1914 - in branches/httptunnel: src/main/java/org/jboss/netty/channel/socket and 3 other directories.</title>
	<published>2009-11-23T03:47:41Z</published>
	<updated>2009-11-23T03:47:41Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: iainmcgin
&lt;br&gt;Date: 2009-11-23 06:47:40 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1914
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelPipelineFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientWorkerOwner.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchDownstreamInterface.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchUpstreamInterface.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/TunnelWrappedServerChannelHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelSink.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeClientSocketChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeSocketChannel.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/MockChannelStateListener.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtilsTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NullChannelHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/UpstreamEventCatcher.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenterTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitterTest.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/pom.xml
&lt;br&gt;Log:
&lt;br&gt;commit of netty_http_20091123.patch from issue NETTY-246 on JIRA.
&lt;br&gt;&lt;br&gt;Modified: branches/httptunnel/pom.xml
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/pom.xml	2009-11-23 11:13:48 UTC (rev 1913)
&lt;br&gt;+++ branches/httptunnel/pom.xml	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -206,6 +206,18 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;1.5.8&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;groupId&amp;gt;org.jmock&amp;lt;/groupId&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;artifactId&amp;gt;jmock&amp;lt;/artifactId&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;groupId&amp;gt;org.jmock&amp;lt;/groupId&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;artifactId&amp;gt;jmock-junit4&amp;lt;/artifactId&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;version&amp;gt;2.5.1&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;/dependencies&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;properties&amp;gt;
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelPipelineFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelPipelineFactory.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelPipelineFactory.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,53 @@
&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;+
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Creates pipelines for incoming http tunnel connections, capable of decoding the incoming HTTP
&lt;br&gt;+ * requests, determining their type (client sending data, client polling data, or unknown) and
&lt;br&gt;+ * handling them appropriately.
&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=4050598&amp;i=0&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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;+class AcceptedServerChannelPipelineFactory implements ChannelPipelineFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitch messageSwitch;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AcceptedServerChannelPipelineFactory(ServerMessageSwitch messageSwitch) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.messageSwitch = messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;httpResponseEncoder&amp;quot;, new HttpResponseEncoder());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;httpRequestDecoder&amp;quot;, new HttpRequestDecoder());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;httpChunkAggregator&amp;quot;, new HttpChunkAggregator(HttpTunnelMessageUtils.MAX_BODY_SIZE));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;messageSwitchClient&amp;quot;, new AcceptedServerChannelRequestDispatch(messageSwitch));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatch.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,131 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.logging.Level;
&lt;br&gt;+import java.util.logging.Logger;
&lt;br&gt;+
&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.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Upstream handler which is responsible for determining whether a received HTTP request is a legal
&lt;br&gt;+ * tunnel request, and if so, invoking the appropriate request method on the 
&lt;br&gt;+ * {@link ServerMessageSwitch} to service the request.
&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=4050598&amp;i=2&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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;+class AcceptedServerChannelRequestDispatch extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;AcceptedServerChannelRequestDispatch&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(AcceptedServerChannelRequestDispatch.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitchUpstreamInterface messageSwitch;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public AcceptedServerChannelRequestDispatch(ServerMessageSwitchUpstreamInterface messageSwitch) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.messageSwitch = messageSwitch;
&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;HttpRequest request = (HttpRequest)e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOpenTunnelRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleOpenTunnel(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isSendDataRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleSendData(ctx, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isReceiveDataRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleReceiveData(ctx, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isCloseTunnelRequest(request)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleCloseTunnel(ctx, request);
&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;LOG.warning(&amp;quot;Invalid request received on http tunnel channel&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createRejection(request, &amp;quot;invalid request to netty HTTP tunnel gateway&amp;quot;));
&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 respondWith(ChannelHandlerContext ctx, HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void handleOpenTunnel(ChannelHandlerContext ctx) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(ctx.getChannel().getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;open tunnel request received from {0} - allocated ID {1}&amp;quot;, new Object[] { ctx.getChannel().getRemoteAddress(), tunnelId });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createTunnelOpenResponse(tunnelId));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void handleCloseTunnel(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;close tunnel request received for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createTunnelCloseResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void handleSendData(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;send data request received for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(request.getContentLength() == 0 || request.getContent() == null || request.getContent().readableBytes() == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;send data request contained no data on tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createRejection(request, &amp;quot;Send data requests must contain data&amp;quot;));
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeInboundData(tunnelId, request.getContent());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;respondWith(ctx, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void handleReceiveData(ChannelHandlerContext ctx, HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = checkTunnelId(request, ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;poll data request received for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.pollOutboundData(tunnelId, ctx.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String checkTunnelId(HttpRequest request, ChannelHandlerContext ctx) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = HttpTunnelMessageUtils.extractTunnelId(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warning(&amp;quot;request without a tunnel id received - rejecting&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), HttpTunnelMessageUtils.createRejection(request, &amp;quot;no tunnel id specified in send data request&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(!messageSwitch.isOpenTunnel(tunnelId)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;request for unknown tunnel id {0} received - rejecting&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), HttpTunnelMessageUtils.createRejection(request, &amp;quot;tunnel id \&amp;quot;&amp;quot; + tunnelId + &amp;quot;\&amp;quot; is either closed or does not exist&amp;quot;));
&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; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ChannelFutureAggregator.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,47 @@
&lt;br&gt;+/**
&lt;br&gt;+ * 
&lt;br&gt;+ */
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.HashSet;
&lt;br&gt;+import java.util.Set;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;+
&lt;br&gt;+class ChannelFutureAggregator implements ChannelFutureListener {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelFuture aggregateFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Set&amp;lt;ChannelFuture&amp;gt; pendingFutures;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelFutureAggregator(ChannelFuture aggregateFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.aggregateFuture = aggregateFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pendingFutures = new HashSet&amp;lt;ChannelFuture&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void addFuture(ChannelFuture future) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pendingFutures.add(future);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.addListener(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public synchronized void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isCancelled()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO: what should the correct behaviour be when a fragment is cancelled?
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// cancel all outstanding fragments and cancel the aggregate?
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFutures.remove(future);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setFailure(future.getCause());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelFuture pendingFuture : pendingFutures) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingFuture.cancel();
&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;return;
&lt;br&gt;+ &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;if(pendingFutures.isEmpty()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregateFuture.setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannel.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannel.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,74 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.jboss.netty.channel.Channels.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelConfig;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.DefaultChannelConfig;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Represents the server end of an HTTP tunnel, created after a legal tunnel creation
&lt;br&gt;+ * request is received from a client. The server end of a tunnel does not have any
&lt;br&gt;+ * directly related TCP connections - the connections used by a client are likely
&lt;br&gt;+ * to change over the lifecycle of a tunnel, especially when an HTTP proxy is in
&lt;br&gt;+ * use.
&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=4050598&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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;+class HttpTunnelAcceptedChannel extends AbstractChannel {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelConfig config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private SocketAddress remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpTunnelAcceptedChannel(HttpTunnelServerChannel parent, ChannelFactory factory, ChannelPipeline pipeline, HttpTunnelAcceptedChannelSink sink, SocketAddress remoteAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(parent, factory, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = new DefaultChannelConfig();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sink = sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.remoteAddress = remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelOpen(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelBound(this, getLocalAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelConnected(this, getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelConfig getConfig() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SocketAddress getLocalAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getParent().getLocalAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SocketAddress getRemoteAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isBound() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sink.isActive();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isConnected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sink.isActive();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelFactory.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelFactory.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,35 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.Channel;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Simple interface provided to a {@link ServerMessageSwitch}, allowing it to
&lt;br&gt;+ * create the server end of tunnels in response to legal tunnel creation
&lt;br&gt;+ * requests from clients.
&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=4050598&amp;i=6&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=7&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;+interface HttpTunnelAcceptedChannelFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public Channel newChannel(String newTunnelId, SocketAddress remoteAddress);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSink.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,90 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Sink for the server end of an http tunnel. Data sent down through the server end is dispatched
&lt;br&gt;+ * from here to the ServerMessageSwitch, which queues the data awaiting a poll request from the
&lt;br&gt;+ * client end of the tunnel.
&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=4050598&amp;i=8&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=9&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;+class HttpTunnelAcceptedChannelSink extends AbstractChannelSink {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitchDownstreamInterface messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean active;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelAcceptedChannelSink(ServerMessageSwitchDownstreamInterface messageSwitch, String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.messageSwitch = messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof MessageEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleMessageEvent((MessageEvent)e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(e instanceof ChannelStateEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleStateEvent((ChannelStateEvent)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 handleMessageEvent(MessageEvent ev) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!(ev.getMessage() instanceof ChannelBuffer)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;Attempt to send data which is not a ChannelBuffer:&amp;quot; + ev.getMessage());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeOutboundData(tunnelId, (ChannelBuffer)ev.getMessage(), ev.getFuture());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void handleStateEvent(ChannelStateEvent ev) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel owner = (Channel) ev.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(ev.getState()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case OPEN:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(ev.getValue())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.active = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelClosed(owner);
&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;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case BOUND:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.active = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelUnbound(owner);
&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;case CONNECTED:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.active = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelDisconnected(owner);
&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;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isActive() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return active;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannel.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,233 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+import java.util.concurrent.atomic.AtomicInteger;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&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.group.ChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.socket.ClientSocketChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannel;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequestEncoder;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponseDecoder;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * The client end of an HTTP tunnel, created by an {@link HttpTunnelClientChannelFactory}. Channels of
&lt;br&gt;+ * this type are designed to emulate a normal TCP based socket channel as far as is feasible within the limitations
&lt;br&gt;+ * of the HTTP 1.1 protocol, and the usage patterns permitted by commonly used HTTP proxies and firewalls.
&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=4050598&amp;i=10&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=11&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 class HttpTunnelClientChannel extends AbstractChannel implements SocketChannel, HttpTunnelClientWorkerOwner {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientChannelConfig config;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private SocketChannel sendChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private SocketChannel pollChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelFuture connectFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean connected;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean bound;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private InetSocketAddress serverAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String serverHostName;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpTunnelClientChannel(ChannelFactory factory, ChannelPipeline pipeline, HttpTunnelClientChannelSink sink, ClientSocketChannelFactory outboundFactory, ChannelGroup realConnections) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(null, factory, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sendChannel = outboundFactory.newChannel(createSendPipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pollChannel = outboundFactory.newChannel(createPollPipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.config = new HttpTunnelClientChannelConfig(sendChannel.getConfig(), pollChannel.getConfig());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.serverAddress = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.add(sendChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.add(pollChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelOpen(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientChannelConfig getConfig() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isBound() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bound;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isConnected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return connected;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getLocalAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sendChannel.getLocalAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getRemoteAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return serverAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onMessageReceived(ChannelBuffer content) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(this, content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onConnectRequest(ChannelFuture connectFuture, InetSocketAddress remoteAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.connectFuture = connectFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* if we are using a proxy, the remoteAddress is swapped here for the address of the proxy.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * The send and poll channels can later ask for the correct server address using
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; * getServerHostName().
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.serverAddress = remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress connectTarget;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(config.getProxyAddress() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectTarget = config.getProxyAddress();
&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;connectTarget = remoteAddress;
&lt;br&gt;+ &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;Channels.connect(sendChannel, connectTarget);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onDisconnectRequest(final ChannelFuture disconnectFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener disconnectListener = new ConsolidatingFutureListener(disconnectFuture, 2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.disconnect().addListener(disconnectListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.disconnect().addListener(disconnectListener);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;disconnectFuture.addListener(new ChannelFutureListener() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverAddress = null;
&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;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onBindRequest(SocketAddress localAddress, final ChannelFuture bindFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener bindListener = new ConsolidatingFutureListener(bindFuture, 2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.bind(localAddress).addListener(bindListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.bind(localAddress).addListener(bindListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onUnbindRequest(final ChannelFuture unbindFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener unbindListener = new ConsolidatingFutureListener(unbindFuture, 2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.unbind().addListener(unbindListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.unbind().addListener(unbindListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onCloseRequest(final ChannelFuture closeFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureListener closeListener = new ConsolidatingFutureListener(closeFuture, 2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.close().addListener(closeListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.close().addListener(closeListener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onTunnelOpened(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setTunnelIdForPollChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.connect(pollChannel, sendChannel.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelPipeline createSendPipeline() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;reqencoder&amp;quot;, new HttpRequestEncoder()); // downstream
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;respdecoder&amp;quot;, new HttpResponseDecoder()); // upstream
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(HttpTunnelMessageUtils.MAX_BODY_SIZE)); // upstream
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;sendHandler&amp;quot;, new HttpTunnelClientSendHandler(this)); // both
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;writeFragmenter&amp;quot;, new WriteFragmenter(HttpTunnelMessageUtils.MAX_BODY_SIZE));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelPipeline createPollPipeline() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;reqencoder&amp;quot;, new HttpRequestEncoder()); // downstream
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;respdecoder&amp;quot;, new HttpResponseDecoder()); // upstream
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;aggregator&amp;quot;, new HttpChunkAggregator(HttpTunnelMessageUtils.MAX_BODY_SIZE)); // upstream
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(HttpTunnelClientPollHandler.NAME, new HttpTunnelClientPollHandler(this)); // both
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void setTunnelIdForPollChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientPollHandler pollHandler = pollChannel.getPipeline().get(HttpTunnelClientPollHandler.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollHandler.setTunnelId(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void fullyEstablished() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!bound) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.bound = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelBound(this, getLocalAddress());
&lt;br&gt;+ &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;this.connected = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectFuture.setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(this, getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void sendData(MessageEvent e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelFuture originalFuture = e.getFuture();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(sendChannel, e.getMessage()).addListener(new ChannelFutureListener() {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;originalFuture.setSuccess();
&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;originalFuture.setFailure(future.getCause());
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;});
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String getServerHostName() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(serverHostName == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverHostName = HttpTunnelMessageUtils.convertToHostString(serverAddress); 
&lt;br&gt;+ &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;return serverHostName; 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private class ConsolidatingFutureListener implements ChannelFutureListener {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelFuture completionFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private AtomicInteger eventsLeft;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ConsolidatingFutureListener(ChannelFuture completionFuture, int numToConsolidate) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.completionFuture = completionFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;eventsLeft = new AtomicInteger(numToConsolidate);
&lt;br&gt;+ &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;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;completionFuture.setFailure(future.getCause());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(eventsLeft.decrementAndGet() == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;completionFuture.setSuccess();
&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;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfig.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,160 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.Socket;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.DefaultChannelConfig;
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Configuration for the client end of an HTTP tunnel. Any socket channel properties set here 
&lt;br&gt;+ * will be applied uniformly to the underlying send and poll channels, created from the channel 
&lt;br&gt;+ * factory provided to the {@link HttpTunnelClientChannelFactory}.
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * HTTP tunnel clients have the following additional options:
&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;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Associated setter method&amp;lt;/th&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;proxyAddress&amp;quot;}&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;{@link #setProxyAddress(Socket)}&amp;lt;/td&amp;gt;
&lt;br&gt;+ * &amp;lt;/tr&amp;gt;
&lt;br&gt;+ * &amp;lt;/table&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=4050598&amp;i=12&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=13&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 class HttpTunnelClientChannelConfig extends DefaultChannelConfig implements SocketChannelConfig {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String PROXY_ADDRESS_OPTION = &amp;quot;proxyAddress&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final SocketChannelConfig sendChannelConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final SocketChannelConfig pollChannelConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private SocketAddress proxyAddress;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientChannelConfig(SocketChannelConfig sendChannelConfig, SocketChannelConfig pollChannelConfig) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sendChannelConfig = sendChannelConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pollChannelConfig = pollChannelConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* HTTP TUNNEL SPECIFIC CONFIGURATION */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean setOption(String key, Object value) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(super.setOption(key, value)) {
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(PROXY_ADDRESS_OPTION.equals(key)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setProxyAddress((SocketAddress) value);
&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 false;
&lt;br&gt;+ &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;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the address of the http proxy. If this is null, then no proxy
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * should be used.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SocketAddress getProxyAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return proxyAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * Specify a proxy to be used for the http tunnel. If this is null, then
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * no proxy should be used, otherwise this should be a directly accessible IPv4/IPv6
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * address and port.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setProxyAddress(SocketAddress proxyAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.proxyAddress = proxyAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/* GENERIC SOCKET CHANNEL CONFIGURATION */
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getReceiveBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.getReceiveBufferSize();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getSendBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.getSendBufferSize();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getSoLinger() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.getSoLinger();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getTrafficClass() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.getTrafficClass();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isKeepAlive() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.isKeepAlive();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isReuseAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.isReuseAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isTcpNoDelay() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pollChannelConfig.isTcpNoDelay();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setKeepAlive(boolean keepAlive) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setKeepAlive(keepAlive);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setKeepAlive(keepAlive);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setPerformancePreferences(connectionTime, latency, bandwidth);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setPerformancePreferences(connectionTime, latency, bandwidth);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSize(int receiveBufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setReceiveBufferSize(receiveBufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setReceiveBufferSize(receiveBufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReuseAddress(boolean reuseAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setReuseAddress(reuseAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setReuseAddress(reuseAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setSendBufferSize(int sendBufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannelConfig.setSendBufferSize(sendBufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setSendBufferSize(sendBufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setSoLinger(int soLinger) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	pollChannelConfig.setSoLinger(soLinger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setSoLinger(soLinger);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setTcpNoDelay(boolean tcpNoDelay) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	pollChannelConfig.setTcpNoDelay(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setTcpNoDelay(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setTrafficClass(int trafficClass) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	pollChannelConfig.setTrafficClass(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannelConfig.setTrafficClass(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelFactory.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelFactory.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,49 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.group.ChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.group.DefaultChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.socket.ClientSocketChannelFactory;
&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=4050598&amp;i=14&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=15&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 class HttpTunnelClientChannelFactory implements ClientSocketChannelFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ClientSocketChannelFactory factory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelGroup realConnections;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientChannelFactory(ClientSocketChannelFactory factory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.factory = factory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections = new DefaultChannelGroup();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientChannel newChannel(ChannelPipeline pipeline) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientChannel channel = new HttpTunnelClientChannel(this, pipeline, new HttpTunnelClientChannelSink(), factory, realConnections);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void releaseExternalResources() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.close();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;factory.releaseExternalResources();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelSink.java	2009-11-23 11:47:40 UTC (rev 1914)
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&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=4050598&amp;i=16&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=17&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;+class HttpTunnelClientChannelSink extends AbstractChannelSink {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof ChannelStateEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleChannelStateEvent((ChannelStateEvent)e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(e instanceof MessageEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handleMessageEvent((MessageEvent)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 handleMessageEvent(MessageEvent e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientChannel channel = (HttpTunnelClientChannel) e.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.sendData(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void handleChannelStateEvent(ChannelStateEvent e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientChannel channel = (HttpTunnelClientChannel) e.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(e.getState()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case CONNECTED:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e.getValue() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.onConnectRequest(e.getFuture(), (InetSocketAddress) e.getValue());
&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;channel.onDisconnectRequest(e.getFuture());
&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;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case BOUND:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e.getValue() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.onBindRequest((SocketAddress)e.getValue(), e.getFuture());
&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;channel.onUnbindRequest(e.getFuture());
&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;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case OPEN:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(e.getValue())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.onCloseRequest(e.getFuture());
&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;break;
&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: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandler.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,83 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.logging.Level;
&lt;br&gt;+import java.util.logging.Logger;
&lt;br&gt;+
&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.ChannelStateEvent;
&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.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&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=4050598&amp;i=18&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=19&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;+class HttpTunnelClientPollHandler extends SimpleChannelHandler {
&lt;br&gt;+
&lt;br&gt;+	public static final String NAME = &amp;quot;server2client&amp;quot;;
&lt;br&gt;+	
&lt;br&gt;+	private static final Logger LOG = Logger.getLogger(HttpTunnelClientPollHandler.class.getName());
&lt;br&gt;+
&lt;br&gt;+	private String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private long pollTime;
&lt;br&gt;+
&lt;br&gt;+	public HttpTunnelClientPollHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+	
&lt;br&gt;+	public void setTunnelId(String tunnelId) {
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+	public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Poll channel for tunnel {0} established&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.fullyEstablished();
&lt;br&gt;+		sendPoll(ctx);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Override
&lt;br&gt;+	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)
&lt;br&gt;+			throws Exception {
&lt;br&gt;+		HttpResponse response = (HttpResponse) e.getMessage();
&lt;br&gt;+		
&lt;br&gt;+		if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp;long rtTime = System.nanoTime() - pollTime;
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for poll on tunnel {0} after {1}ns&amp;quot;, new Object[] { tunnelId, rtTime });
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp;tunnelChannel.onMessageReceived(response.getContent());
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp;sendPoll(ctx);
&lt;br&gt;+		} else {
&lt;br&gt;+		 &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;non-OK response received for poll on tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+		}
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void sendPoll(ChannelHandlerContext ctx) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollTime = System.nanoTime();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending poll request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;+		Channels.write(ctx, Channels.future(ctx.getChannel()), request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandler.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,185 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.concurrent.ConcurrentLinkedQueue;
&lt;br&gt;+import java.util.concurrent.atomic.AtomicBoolean;
&lt;br&gt;+import java.util.concurrent.atomic.AtomicInteger;
&lt;br&gt;+import java.util.logging.Level;
&lt;br&gt;+import java.util.logging.Logger;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.Channel;
&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.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.DownstreamMessageEvent;
&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.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&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=4050598&amp;i=20&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=21&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;+class HttpTunnelClientSendHandler extends SimpleChannelHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;client2server&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelClientSendHandler.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientWorkerOwner tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String tunnelId = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String host;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private AtomicBoolean disconnecting;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelStateEvent postShutdownEvent;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ConcurrentLinkedQueue&amp;lt;MessageEvent&amp;gt; queuedWrites;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private AtomicInteger pendingRequestCount;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private long sendRequestTime;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelClientSendHandler(HttpTunnelClientWorkerOwner tunnelChannel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queuedWrites = new ConcurrentLinkedQueue&amp;lt;MessageEvent&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingRequestCount = new AtomicInteger(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;disconnecting = new AtomicBoolean(false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;connection to {0} succeeded - sending open tunnel request&amp;quot;, e.getValue());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createOpenTunnelRequest(tunnelChannel.getServerHostName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel thisChannel = ctx.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent event = new DownstreamMessageEvent(thisChannel, Channels.future(thisChannel), request, thisChannel.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queuedWrites.offer(event);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pendingRequestCount.incrementAndGet();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&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;HttpResponse response = (HttpResponse)e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(HttpTunnelMessageUtils.isOKResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long roundTripTime = System.nanoTime() - sendRequestTime;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;OK response received for tunnel {0}, after {1}ns&amp;quot;, new Object[] { tunnelId, roundTripTime });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelOpenResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = HttpTunnelMessageUtils.extractCookie(response);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;tunnel open request accepted - id {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelChannel.onTunnelOpened(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendNextAfterResponse(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if(HttpTunnelMessageUtils.isTunnelCloseResponse(response)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;server acknowledged disconnect for tunnel {0}&amp;quot;, tunnelId);
&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;LOG.log(Level.INFO, &amp;quot;server closed tunnel {0}&amp;quot;, tunnelId);
&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;ctx.sendDownstream(postShutdownEvent);
&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;// TODO: kill connection
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;unknown response received for tunnel {0}, closing connection&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.close(ctx, ctx.getChannel().getCloseFuture());
&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 sendNextAfterResponse(ChannelHandlerContext ctx) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.decrementAndGet() &amp;gt; 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;Immediately sending next send request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private synchronized void sendQueuedData(ChannelHandlerContext ctx) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending close request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest closeRequest = HttpTunnelMessageUtils.createCloseTunnelRequest(tunnelChannel.getServerHostName(), tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, Channels.future(ctx.getChannel()), closeRequest);
&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;LOG.log(Level.FINE, &amp;quot;sending next request for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MessageEvent nextWrite = queuedWrites.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendRequestTime = System.nanoTime();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(nextWrite);
&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;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINER, &amp;quot;request to send data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(disconnecting.get()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;rejecting write request for tunnel {0} received after disconnect requested&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.getFuture().setFailure(new IllegalStateException(&amp;quot;tunnel is closing&amp;quot;));
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = (ChannelBuffer) e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(tunnelChannel.getServerHostName(), tunnelId, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent translatedEvent = new DownstreamMessageEvent(ctx.getChannel(), e.getFuture(), request, ctx.getChannel().getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;queuedWrites.offer(translatedEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&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;LOG.log(Level.FINE, &amp;quot;write request for tunnel {0} queued&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void closeRequested(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdownTunnel(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void disconnectRequested(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdownTunnel(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void unbindRequested(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;shutdownTunnel(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void shutdownTunnel(ChannelHandlerContext ctx, ChannelStateEvent postShutdownEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;tunnel shutdown requested for send channel of tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!ctx.getChannel().isConnected()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;send channel of tunnel {0} is already disconnected&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(postShutdownEvent);
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!disconnecting.compareAndSet(false, true)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;tunnel shutdown process already initiated for tunnel {0}&amp;quot;, tunnelId);
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.postShutdownEvent = postShutdownEvent;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if the channel is idle, send a close request immediately
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(pendingRequestCount.incrementAndGet() == 1) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(ctx);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String getTunnelId() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientWorkerOwner.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientWorkerOwner.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientWorkerOwner.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,68 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Interface which is used by the send and poll &amp;quot;worker&amp;quot; channels
&lt;br&gt;+ * to notify the virtual tunnel channel of key events, and to get
&lt;br&gt;+ * access to higher level information required for correct
&lt;br&gt;+ * operation.
&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=4050598&amp;i=22&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=23&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;+interface HttpTunnelClientWorkerOwner {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * The HTTP tunnel client sink invokes this when the application code requests the connection
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * of an HTTP tunnel to the specified remote address.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onConnectRequest(ChannelFuture connectFuture, InetSocketAddress remoteAddress);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * The send channel handler calls this method when the server accepts the open tunnel request,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * returning a unique tunnel ID.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param tunnelId the server allocated tunnel ID
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onTunnelOpened(String tunnelId);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * The poll channel handler calls this method when the poll channel is connected, indicating
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * that full duplex communications are now possible.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void fullyEstablished();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * The poll handler calls this method when some data is received and decoded from the server.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @param content the data received from the server
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onMessageReceived(ChannelBuffer content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * @return the name of the server with whom we are communicating with - this is used within
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * the HOST HTTP header for all requests. This is particularly important for operation behind
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * a proxy, where the HOST string is used to route the request.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String getServerHostName();
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelMessageUtils.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,304 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.io.StringWriter;
&lt;br&gt;+import java.io.UnsupportedEncodingException;
&lt;br&gt;+import java.net.Inet6Address;
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+import java.net.URI;
&lt;br&gt;+import java.net.URISyntaxException;
&lt;br&gt;+import java.util.Arrays;
&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.handler.codec.http.DefaultHttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpHeaders;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpMethod;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponseStatus;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpVersion;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Utility class for creating http requests for the operation of the full duplex
&lt;br&gt;+ * http tunnel, and verifying that received requests are of the correct types.
&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=4050598&amp;i=24&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=25&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 class HttpTunnelMessageUtils {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final String HTTP_URL_PREFIX = &amp;quot;http://&amp;quot;;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * An upper bound is enforced on the size of message bodies, so as
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * to ensure we do not dump large chunks of data on either peer.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final int MAX_BODY_SIZE = 16 * 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * The tunnel will only accept connections from this specific user agent. This
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * allows us to distinguish a legitimate tunnel connection from someone pointing
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; * a web browser or robot at the tunnel URL.
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; */
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final String USER_AGENT = &amp;quot;HttpTunnelClient&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final String OPEN_TUNNEL_REQUEST_URI = &amp;quot;/http-tunnel/open&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final String CLOSE_TUNNEL_REQUEST_URI = &amp;quot;/http-tunnel/close&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final String CLIENT_SEND_REQUEST_URI = &amp;quot;/http-tunnel/send&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final String CLIENT_RECV_REQUEST_URI = &amp;quot;/http-tunnel/poll&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;static final String CONTENT_TYPE = &amp;quot;application/octet-stream&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createOpenTunnelRequest(SocketAddress host) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	return createOpenTunnelRequest(convertToHostString(host));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createOpenTunnelRequest(String host) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	HttpRequest request = createRequestTemplate(host, null, OPEN_TUNNEL_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setNoData(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isOpenTunnelRequest(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isRequestTo(request, OPEN_TUNNEL_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean checkHost(HttpRequest request, SocketAddress expectedHost) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String host = request.getHeader(HttpHeaders.Names.HOST);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return expectedHost == null ? (host == null) : HttpTunnelMessageUtils.convertToHostString(expectedHost).equals(host);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createSendDataRequest(SocketAddress host, String cookie, ChannelBuffer data) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	return createSendDataRequest(convertToHostString(host), cookie, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createSendDataRequest(String host, String cookie, ChannelBuffer data) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = createRequestTemplate(host, cookie, CLIENT_SEND_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.CONTENT_LENGTH, Long.toString(data.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setContent(data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isSendDataRequest(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isRequestTo(request, CLIENT_SEND_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createReceiveDataRequest(SocketAddress host, String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	return createReceiveDataRequest(convertToHostString(host), tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createReceiveDataRequest(String host, String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	HttpRequest request = createRequestTemplate(host, tunnelId, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	setNoData(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	return request;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isReceiveDataRequest(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isRequestTo(request, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpRequest createCloseTunnelRequest(String host, String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = createRequestTemplate(host, tunnelId, CLOSE_TUNNEL_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setNoData(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isCloseTunnelRequest(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isRequestTo(request, CLOSE_TUNNEL_REQUEST_URI);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isServerToClientRequest(HttpRequest request) {
&lt;br&gt;+		return isRequestTo(request, CLIENT_RECV_REQUEST_URI);
&lt;br&gt;+	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static String convertToHostString(SocketAddress hostAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	StringWriter host = new StringWriter();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	InetSocketAddress inetSocketAddr = (InetSocketAddress) hostAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	InetAddress addr = inetSocketAddr.getAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	if(addr instanceof Inet6Address) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;		host.append('[');
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;		host.append(addr.getHostAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;		host.append(']');
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;		host.append(addr.getHostAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	host.append(':');
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	host.append(Integer.toString(inetSocketAddr.getPort()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	return host.toString();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static HttpRequest createRequestTemplate(String host, String tunnelId, String uri) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = new DefaultHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, createCompleteUri(host, uri));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.HOST, host);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.USER_AGENT, USER_AGENT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnelId != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.COOKIE, tunnelId);
&lt;br&gt;+ &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;return request;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static String createCompleteUri(String host, String uri) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;StringBuilder builder = new StringBuilder(HTTP_URL_PREFIX.length() + host.length() + uri.length());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.append(HTTP_URL_PREFIX);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.append(host);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;builder.append(uri);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return builder.toString();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static boolean isRequestTo(HttpRequest request, String uri) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URI decodedUri;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;decodedUri = new URI(request.getUri());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (URISyntaxException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &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;return HttpVersion.HTTP_1_1.equals(request.getProtocolVersion())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;&amp; USER_AGENT.equals(request.getHeader(HttpHeaders.Names.USER_AGENT))
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;&amp; HttpMethod.POST.equals(request.getMethod())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;&amp; uri.equals(decodedUri.getPath());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+	private static void setNoData(HttpRequest request) {
&lt;br&gt;+		request.setHeader(HttpHeaders.Names.CONTENT_LENGTH, &amp;quot;0&amp;quot;);
&lt;br&gt;+		request.setContent(null);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static String extractTunnelId(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return request.getHeader(HttpHeaders.Names.COOKIE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static byte[] toBytes(String string) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return string.getBytes(&amp;quot;UTF-8&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnsupportedEncodingException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// UTF-8 is meant to be supported on all platforms
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;UTF-8 encoding not supported!&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpResponse createTunnelOpenResponse(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = createResponseTemplate(HttpResponseStatus.CREATED, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.SET_COOKIE, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isTunnelOpenResponse(HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isResponseWithCode(response, HttpResponseStatus.CREATED);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isOKResponse(HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isResponseWithCode(response, HttpResponseStatus.OK);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean hasContents(HttpResponse response, byte[] expectedContents) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(response.getContent() != null 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; response.getContentLength() == expectedContents.length
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;&amp; response.getContent().readableBytes() == expectedContents.length) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] compareBytes = new byte[expectedContents.length];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.getContent().readBytes(compareBytes);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Arrays.equals(expectedContents, compareBytes);
&lt;br&gt;+ &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;return false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpResponse createTunnelCloseResponse() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = createResponseTemplate(HttpResponseStatus.RESET_CONTENT, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isTunnelCloseResponse(HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return isResponseWithCode(response, HttpResponseStatus.RESET_CONTENT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static String extractCookie(HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(response.containsHeader(HttpHeaders.Names.SET_COOKIE)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response.getHeader(HttpHeaders.Names.SET_COOKIE);
&lt;br&gt;+ &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;return null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpResponse createSendDataResponse() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createOKResponseTemplate(null); 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpResponse createRecvDataResponse(ChannelBuffer data) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createOKResponseTemplate(data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static HttpResponse createRejection(HttpRequest request, String reason) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpVersion version = (request != null) ? request.getProtocolVersion() : HttpVersion.HTTP_1_1;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = new DefaultHttpResponse(version, HttpResponseStatus.BAD_REQUEST);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.CONTENT_TYPE, &amp;quot;text/plain; charset=\&amp;quot;utf-8\&amp;quot;&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer reasonBuffer = ChannelBuffers.wrappedBuffer(toBytes(reason));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, Integer.toString(reasonBuffer.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setContent(reasonBuffer);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean isRejection(HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return !(HttpResponseStatus.OK.equals(response.getStatus()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static Object extractErrorMessage(HttpResponse response) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(response.getContent() == null || response.getContentLength() == 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;&amp;quot;;
&lt;br&gt;+ &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;byte[] bytes = new byte[response.getContent().readableBytes()];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.getContent().readBytes(bytes);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new String(bytes, &amp;quot;UTF-8&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnsupportedEncodingException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return &amp;quot;&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static boolean isResponseWithCode(HttpResponse response, HttpResponseStatus status) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return HttpVersion.HTTP_1_1.equals(response.getProtocolVersion())
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;&amp; status.equals(response.getStatus());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static HttpResponse createOKResponseTemplate(ChannelBuffer data) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createResponseTemplate(HttpResponseStatus.OK, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static HttpResponse createResponseTemplate(HttpResponseStatus status, ChannelBuffer data) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = new DefaultHttpResponse(HttpVersion.HTTP_1_1, status);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(data != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, Integer.toString(data.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setHeader(HttpHeaders.Names.CONTENT_TYPE, &amp;quot;application/octet-stream&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setContent(data);
&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;response.setHeader(HttpHeaders.Names.CONTENT_LENGTH, &amp;quot;0&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;response.setContent(null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return response;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannel.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannel.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,83 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractServerChannel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineException;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelConfig;
&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=4050598&amp;i=26&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=27&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 class HttpTunnelServerChannel extends AbstractServerChannel implements ServerSocketChannel, HttpTunnelAcceptedChannelFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelConfig config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitch messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected HttpTunnelServerChannel(HttpTunnelServerChannelFactory factory, ChannelPipeline pipeline) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(factory, pipeline, new HttpTunnelServerChannelSink());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setRealChannel(ServerSocketChannel realChannel, ServerMessageSwitch messageSwitch) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.realChannel = realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelServerChannelSink sink = (HttpTunnelServerChannelSink) this.getPipeline().getSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink.setRealChannel(realChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;config = new HttpTunnelServerChannelConfig(realChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.messageSwitch = messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelOpen(this);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ServerSocketChannelConfig getConfig() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getLocalAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return realChannel.getLocalAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getRemoteAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// server channels never have a remote address
&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;+ &amp;nbsp; &amp;nbsp;public boolean isBound() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return realChannel.isBound();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ServerMessageSwitch getMessageSwitch() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelAcceptedChannel newChannel(String newTunnelId, SocketAddress remoteAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline childPipeline = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;childPipeline = getConfig().getPipelineFactory().getPipeline();
&lt;br&gt;+ &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;throw new ChannelPipelineException(&amp;quot;Failed to initialize a pipeline.&amp;quot;, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelAcceptedChannelSink sink = new HttpTunnelAcceptedChannelSink(messageSwitch, newTunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new HttpTunnelAcceptedChannel(this, this.getFactory(), childPipeline, sink, remoteAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelConfig.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelConfig.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,110 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.Map;
&lt;br&gt;+import java.util.Map.Entry;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBufferFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelConfig;
&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=4050598&amp;i=28&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=29&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 class HttpTunnelServerChannelConfig implements ServerSocketChannelConfig {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelPipelineFactory pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelServerChannelConfig(ServerSocketChannel realChannel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.realChannel = realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannelConfig getWrappedConfig() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return realChannel.getConfig();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getBacklog() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getWrappedConfig().getBacklog();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getReceiveBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getWrappedConfig().getReceiveBufferSize();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isReuseAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getWrappedConfig().isReuseAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setBacklog(int backlog) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getWrappedConfig().setBacklog(backlog);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getWrappedConfig().setPerformancePreferences(connectionTime, latency, bandwidth);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSize(int receiveBufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getWrappedConfig().setReceiveBufferSize(receiveBufferSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReuseAddress(boolean reuseAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getWrappedConfig().setReuseAddress(reuseAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelBufferFactory getBufferFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getWrappedConfig().getBufferFactory();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getConnectTimeoutMillis() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getWrappedConfig().getConnectTimeoutMillis();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelPipelineFactory getPipelineFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setBufferFactory(ChannelBufferFactory bufferFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getWrappedConfig().setBufferFactory(bufferFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setConnectTimeoutMillis(int connectTimeoutMillis) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;getWrappedConfig().setConnectTimeoutMillis(connectTimeoutMillis);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean setOption(String name, Object value) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (name.equals(&amp;quot;pipelineFactory&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setPipelineFactory((ChannelPipelineFactory) value);
&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;} else {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return getWrappedConfig().setOption(name, value);
&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;public void setOptions(Map&amp;lt;String, Object&amp;gt; options) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (Entry&amp;lt;String, Object&amp;gt; e: options.entrySet()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setOption(e.getKey(), e.getValue());
&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;public void setPipelineFactory(ChannelPipelineFactory pipelineFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pipelineFactory = pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactory.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactory.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,62 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.group.ChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.group.DefaultChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
&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=4050598&amp;i=30&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=31&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 class HttpTunnelServerChannelFactory implements ServerSocketChannelFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannelFactory realConnectionFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelGroup realConnections;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelServerChannelFactory(ServerSocketChannelFactory realConnectionFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.realConnectionFactory = realConnectionFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections = new DefaultChannelGroup();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelServerChannel newChannel(ChannelPipeline pipeline) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelServerChannel channel = new HttpTunnelServerChannel(this, pipeline);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ServerMessageSwitch messageSwitch = new ServerMessageSwitch(channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ServerSocketChannel realChannel = createRealChannel(channel, messageSwitch);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.setRealChannel(realChannel, messageSwitch);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannel createRealChannel(HttpTunnelServerChannel channel, ServerMessageSwitch messageSwitch) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline realChannelPipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;AcceptedServerChannelPipelineFactory realPipelineFactory = new AcceptedServerChannelPipelineFactory(messageSwitch);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelPipeline.addFirst(TunnelWrappedServerChannelHandler.NAME, new TunnelWrappedServerChannelHandler(channel, realPipelineFactory, realConnections));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ServerSocketChannel newChannel = realConnectionFactory.newChannel(realChannelPipeline);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.add(newChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return newChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void releaseExternalResources() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnections.close();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realConnectionFactory.releaseExternalResources();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSink.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,77 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&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=4050598&amp;i=32&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=33&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;+class HttpTunnelServerChannelSink extends AbstractChannelSink {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(e instanceof ChannelStateEvent) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelStateEvent ev = (ChannelStateEvent) e;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch(ev.getState()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case OPEN:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(Boolean.FALSE.equals(ev.getValue())) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannel.close().addListener(new ChannelFutureProxy(e.getFuture()));
&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;break;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case BOUND:
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(ev.getValue() != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannel.bind((SocketAddress)ev.getValue()).addListener(new ChannelFutureProxy(e.getFuture()));
&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;realChannel.unbind().addListener(new ChannelFutureProxy(e.getFuture()));
&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;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;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final class ChannelFutureProxy implements ChannelFutureListener {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private final ChannelFuture upstreamFuture;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private ChannelFutureProxy(ChannelFuture upstreamFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.upstreamFuture = upstreamFuture;
&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;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamFuture.setSuccess();
&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;upstreamFuture.setFailure(future.getCause());
&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;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setRealChannel(ServerSocketChannel realChannel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.realChannel = realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitch.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,169 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+import java.util.Random;
&lt;br&gt;+import java.util.concurrent.ConcurrentHashMap;
&lt;br&gt;+import java.util.concurrent.ConcurrentLinkedQueue;
&lt;br&gt;+import java.util.concurrent.atomic.AtomicInteger;
&lt;br&gt;+import java.util.concurrent.atomic.AtomicReference;
&lt;br&gt;+import java.util.logging.Level;
&lt;br&gt;+import java.util.logging.Logger;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFutureListener;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&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=4050598&amp;i=34&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=35&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;+class ServerMessageSwitch implements ServerMessageSwitchUpstreamInterface, ServerMessageSwitchDownstreamInterface {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(ServerMessageSwitch.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private String tunnelIdPrefix;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private AtomicInteger tunnelIdSequence;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelFactory newChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ConcurrentHashMap&amp;lt;String, TunnelInfo&amp;gt; tunnelsById;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ServerMessageSwitch(HttpTunnelAcceptedChannelFactory newChannelFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.newChannelFactory = newChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelIdPrefix = Long.toHexString(new Random().nextLong());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelIdSequence = new AtomicInteger(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelsById = new ConcurrentHashMap&amp;lt;String, TunnelInfo&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String createTunnel(SocketAddress remoteAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String newTunnelId = tunnelIdPrefix + '_' + tunnelIdSequence.incrementAndGet();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo newTunnel = new TunnelInfo();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newTunnel.tunnelId = newTunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelsById.put(newTunnelId, newTunnel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newTunnel.localChannel = newChannelFactory.newChannel(newTunnelId, remoteAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return newTunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isOpenTunnel(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return tunnel != null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void pollOutboundData(String tunnelId, Channel channel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;Poll request for tunnel {0} which does not exist or already closed&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, HttpTunnelMessageUtils.createRejection(null, &amp;quot;Unknown tunnel, possibly already closed&amp;quot;));
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!tunnel.responseChannel.compareAndSet(null, channel)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;Duplicate poll request detected for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, HttpTunnelMessageUtils.createRejection(null, &amp;quot;Only one poll request at a time per tunnel allowed&amp;quot;));
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendQueuedData(tunnel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void sendQueuedData(TunnelInfo state) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ConcurrentLinkedQueue&amp;lt;QueuedResponse&amp;gt; queuedData = state.queuedResponses;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(queuedData.peek() == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// no data to send, or it has already been dealt with by another thread
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel responseChannel = state.responseChannel.getAndSet(null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(responseChannel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// no response channel, or another thread has already used it
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;sending response for tunnel id {0} to {1}&amp;quot;, new Object[] { state.tunnelId, responseChannel.getRemoteAddress() });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QueuedResponse messageToSend = queuedData.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(messageToSend.data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelFuture originalFuture = messageToSend.writeFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(responseChannel, response).addListener(new ChannelFutureListener() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void operationComplete(ChannelFuture future) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(future.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;originalFuture.setSuccess();
&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;originalFuture.setFailure(future.getCause());
&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;+ &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;public void routeInboundData(String tunnelId, ChannelBuffer inboundData) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;routing inbound data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(tunnel.localChannel, inboundData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void closeTunnel(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnelsById.remove(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void routeOutboundData(String tunnelId, ChannelBuffer data, ChannelFuture writeFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;TunnelInfo tunnel = tunnelsById.get(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(tunnel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// tunnel is closed
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;attempt made to send data out on tunnel id {0} which is unknown or closed&amp;quot;, tunnelId);
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WriteSplitter splitter = new WriteSplitter(HttpTunnelMessageUtils.MAX_BODY_SIZE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureAggregator aggregator = new ChannelFutureAggregator(writeFuture);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.FINE, &amp;quot;routing outbound data for tunnel {0}&amp;quot;, tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelBuffer fragment : fragments) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture fragmentFuture = Channels.future(writeFuture.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregator.addFuture(fragmentFuture);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;tunnel.queuedResponses.offer(new QueuedResponse(fragment, fragmentFuture));
&lt;br&gt;+ &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;sendQueuedData(tunnel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private class TunnelInfo {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public String tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public Channel localChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public AtomicReference&amp;lt;Channel&amp;gt; responseChannel = new AtomicReference&amp;lt;Channel&amp;gt;(null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ConcurrentLinkedQueue&amp;lt;QueuedResponse&amp;gt; queuedResponses = new ConcurrentLinkedQueue&amp;lt;QueuedResponse&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private class QueuedResponse {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelBuffer data;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelFuture writeFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public QueuedResponse(ChannelBuffer data, ChannelFuture writeFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.data = data;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.writeFuture = writeFuture;
&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: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchDownstreamInterface.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchDownstreamInterface.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchDownstreamInterface.java	2009-11-23 11:47:40 UTC (rev 1914)
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&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=4050598&amp;i=36&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=37&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;+interface ServerMessageSwitchDownstreamInterface {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void closeTunnel(String tunnelId);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void routeOutboundData(String tunnelId, ChannelBuffer data, ChannelFuture writeFuture);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchUpstreamInterface.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchUpstreamInterface.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchUpstreamInterface.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,40 @@
&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.socket.httptunnel;
&lt;br&gt;+
&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.Channel;
&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=4050598&amp;i=38&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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;+interface ServerMessageSwitchUpstreamInterface {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String createTunnel(SocketAddress remoteAddress);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isOpenTunnel(String tunnelId);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void closeTunnel(String tunnelId);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void routeInboundData(String tunnelId, ChannelBuffer inboundData);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void pollOutboundData(String tunnelId, Channel responseChannel);
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/TunnelWrappedServerChannelHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/TunnelWrappedServerChannelHandler.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/TunnelWrappedServerChannelHandler.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,76 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&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.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.ChildChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
&lt;br&gt;+import org.jboss.netty.channel.group.ChannelGroup;
&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=4050598&amp;i=40&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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;+class TunnelWrappedServerChannelHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;TunnelWrappedServerChannelHandler&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannel tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private AcceptedServerChannelPipelineFactory pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelGroup allChannels;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public TunnelWrappedServerChannelHandler(HttpTunnelServerChannel tunnelChannel, AcceptedServerChannelPipelineFactory pipelineFactory, ChannelGroup allChannels) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelChannel = tunnelChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pipelineFactory = pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.allChannels = allChannels;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.getChannel().getConfig().setPipelineFactory(pipelineFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.channelOpen(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void channelBound(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelBound(tunnelChannel, (SocketAddress) e.getValue());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.channelBound(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void channelUnbound(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelUnbound(tunnelChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.channelUnbound(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelClosed(tunnelChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.channelClosed(ctx, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void childChannelOpen(ChannelHandlerContext ctx, ChildChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;allChannels.add(e.getChildChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenter.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,73 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&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.SimpleChannelDownstreamHandler;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Downstream handler which places an upper bound on the size of written
&lt;br&gt;+ * {@link org.jboss.netty.ChannelBuffer ChannelBuffers}. If a buffer
&lt;br&gt;+ * is bigger than the specified upper bound, the buffer is broken up
&lt;br&gt;+ * into two or more smaller pieces.
&lt;br&gt;+ * &amp;lt;p&amp;gt;
&lt;br&gt;+ * This is utilised by the http tunnel to smooth out the per-byte latency,
&lt;br&gt;+ * by placing an upper bound on HTTP request / response body sizes.
&lt;br&gt;+ * &amp;nbsp;
&lt;br&gt;+ * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=42&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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 WriteFragmenter extends SimpleChannelDownstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;writeFragmenter&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int splitThreshold;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public WriteFragmenter(int splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.splitThreshold = splitThreshold;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setSplitThreshold(int splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.splitThreshold = splitThreshold;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = (ChannelBuffer)e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(data.readableBytes() &amp;lt;= splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.writeRequested(ctx, e);
&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;WriteSplitter splitter = new WriteSplitter(splitThreshold);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFutureAggregator aggregator = new ChannelFutureAggregator(e.getFuture());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelBuffer fragment : fragments) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture fragmentFuture = Channels.future(ctx.getChannel(), true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;aggregator.addFuture(fragmentFuture);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx, fragmentFuture, fragment);
&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;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.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/httptunnel/src/main/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitter.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,61 @@
&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.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffers;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * Provides functionality to split a provided ChannelBuffer into multiple fragments which fit
&lt;br&gt;+ * under a specified size threshold.
&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=4050598&amp;i=44&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;+ * @author Iain McGinniss (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&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 class WriteSplitter {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int splitThreshold;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public WriteSplitter(int splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.splitThreshold = splitThreshold;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;ChannelBuffer&amp;gt; split(ChannelBuffer buffer) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int listSize = (int)(((float)buffer.readableBytes()) / splitThreshold);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArrayList&amp;lt;ChannelBuffer&amp;gt; fragmentList = new ArrayList&amp;lt;ChannelBuffer&amp;gt;(listSize);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int startReadIndex = buffer.readerIndex();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(buffer.readableBytes() &amp;gt; splitThreshold) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(buffer.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer chunk = ChannelBuffers.buffer(Math.min(splitThreshold, buffer.readableBytes()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.readBytes(chunk);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fragmentList.add(chunk);
&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;fragmentList.add(ChannelBuffers.wrappedBuffer(buffer));
&lt;br&gt;+ &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;buffer.readerIndex(startReadIndex);
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return fragmentList;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/AcceptedServerChannelRequestDispatchTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,176 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&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.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Ignore;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=46&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+@Ignore
&lt;br&gt;+public class AcceptedServerChannelRequestDispatchTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final String HOST = &amp;quot;test.server.com&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final String KNOWN_TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected static final String UNKNOWN_TUNNEL_ID = &amp;quot;unknownTunnel&amp;quot;;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private AcceptedServerChannelRequestDispatch handler;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitchUpstreamInterface messageSwitch;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch = mockContext.mock(ServerMessageSwitchUpstreamInterface.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler = new AcceptedServerChannelRequestDispatch(messageSwitch);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(AcceptedServerChannelRequestDispatch.NAME, handler);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = InetSocketAddress.createUnresolved(&amp;quot;test.client.com&amp;quot;, 51231);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ignoring(messageSwitch).isOpenTunnel(KNOWN_TUNNEL_ID); will(returnValue(true));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}});
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testTunnelOpenRequest() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).createTunnel(channel.remoteAddress); will(returnValue(KNOWN_TUNNEL_ID));
&lt;br&gt;+ &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;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createOpenTunnelRequest(HOST));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isTunnelOpenResponse(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testTunnelCloseRequest() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).closeTunnel(KNOWN_TUNNEL_ID);
&lt;br&gt;+ &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;HttpRequest request = HttpTunnelMessageUtils.createCloseTunnelRequest(HOST, KNOWN_TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isTunnelCloseResponse(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testTunnelCloseRequestWithoutTunnelIdRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createCloseTunnelRequest(HOST, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithoutTunnelIdIsRejected(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testTunnelCloseRequestWithUnknownTunnelId() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createCloseTunnelRequest(HOST, UNKNOWN_TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithUnknownTunnelIdIsRejected(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendDataRequest() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer expectedData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;expectedData.writeLong(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).routeInboundData(KNOWN_TUNNEL_ID, expectedData);
&lt;br&gt;+ &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;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, KNOWN_TUNNEL_ID, expectedData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isOKResponse(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendDataRequestWithNoContentRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, KNOWN_TUNNEL_ID, ChannelBuffers.dynamicBuffer());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkResponseIsRejection(&amp;quot;Send data requests must contain data&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendDataRequestForUnknownTunnelIdRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, UNKNOWN_TUNNEL_ID, ChannelBuffers.dynamicBuffer());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithUnknownTunnelIdIsRejected(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendDataRequestWithoutTunnelIdRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createSendDataRequest(HOST, null, ChannelBuffers.dynamicBuffer());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithoutTunnelIdIsRejected(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testReceiveDataRequest() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).pollOutboundData(KNOWN_TUNNEL_ID, channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}});
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(HOST, KNOWN_TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testReceiveDataRequestWithoutTunnelIdRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(HOST, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithoutTunnelIdIsRejected(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testReceiveDataRequestForUnknownTunnelIdRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = HttpTunnelMessageUtils.createReceiveDataRequest(HOST, UNKNOWN_TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkRequestWithUnknownTunnelIdIsRejected(request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void checkRequestWithoutTunnelIdIsRejected(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isRejection(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;no tunnel id specified in send data request&amp;quot;, HttpTunnelMessageUtils.extractErrorMessage(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void checkRequestWithUnknownTunnelIdIsRejected(HttpRequest request) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).isOpenTunnel(UNKNOWN_TUNNEL_ID); will(returnValue(false));
&lt;br&gt;+ &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;Channels.fireMessageReceived(channel, request);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkResponseIsRejection(&amp;quot;tunnel id \&amp;quot;unknownTunnel\&amp;quot; is either closed or does not exist&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void checkResponseIsRejection(String errorMessage) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isRejection(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(errorMessage, HttpTunnelMessageUtils.extractErrorMessage(response));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelConfig.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelConfig.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,161 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.Map;
&lt;br&gt;+import java.util.Map.Entry;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBufferFactory;
&lt;br&gt;+import org.jboss.netty.buffer.HeapChannelBufferFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;+import org.jboss.netty.util.internal.ConversionUtil;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=47&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeChannelConfig implements SocketChannelConfig {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int receiveBufferSize = 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int sendBufferSize = 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int soLinger = 500;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int trafficClass = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean keepAlive = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean reuseAddress = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private boolean tcpNoDelay = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBufferFactory bufferFactory = new HeapChannelBufferFactory();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int connectTimeout = 5000;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelPipelineFactory pipelineFactory = new ChannelPipelineFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;};
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private int writeTimeout = 3000;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getReceiveBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return receiveBufferSize;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSize(int receiveBufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.receiveBufferSize = receiveBufferSize;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getSendBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return sendBufferSize;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setSendBufferSize(int sendBufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sendBufferSize = sendBufferSize;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getSoLinger() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return soLinger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setSoLinger(int soLinger) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.soLinger = soLinger;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getTrafficClass() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return trafficClass;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setTrafficClass(int trafficClass) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.trafficClass = trafficClass;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isKeepAlive() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return keepAlive;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setKeepAlive(boolean keepAlive) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.keepAlive = keepAlive;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isReuseAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return reuseAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReuseAddress(boolean reuseAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.reuseAddress = reuseAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isTcpNoDelay() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return tcpNoDelay;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setTcpNoDelay(boolean tcpNoDelay) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tcpNoDelay = tcpNoDelay;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// do nothing
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelBufferFactory getBufferFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bufferFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setBufferFactory(ChannelBufferFactory bufferFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.bufferFactory = bufferFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getConnectTimeoutMillis() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return connectTimeout;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setConnectTimeoutMillis(int connectTimeoutMillis) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.connectTimeout = connectTimeoutMillis;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelPipelineFactory getPipelineFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setPipelineFactory(ChannelPipelineFactory pipelineFactory) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.pipelineFactory = pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getWriteTimeoutMillis() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return writeTimeout;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setWriteTimeoutMillis(int writeTimeoutMillis) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.writeTimeout = writeTimeoutMillis;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean setOption(String key, Object value) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (key.equals(&amp;quot;pipelineFactory&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setPipelineFactory((ChannelPipelineFactory) value);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;connectTimeoutMillis&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setConnectTimeoutMillis(ConversionUtil.toInt(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;bufferFactory&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setBufferFactory((ChannelBufferFactory) value);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;receiveBufferSize&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setReceiveBufferSize(ConversionUtil.toInt(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;sendBufferSize&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setSendBufferSize(ConversionUtil.toInt(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;tcpNoDelay&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setTcpNoDelay(ConversionUtil.toBoolean(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;keepAlive&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setKeepAlive(ConversionUtil.toBoolean(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;reuseAddress&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setReuseAddress(ConversionUtil.toBoolean(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;soLinger&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setSoLinger(ConversionUtil.toInt(value));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;trafficClass&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setTrafficClass(ConversionUtil.toInt(value));
&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 false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setOptions(Map&amp;lt;String, Object&amp;gt; options) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (Entry&amp;lt;String, Object&amp;gt; e: options.entrySet()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setOption(e.getKey(), e.getValue());
&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;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelSink.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeChannelSink.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,21 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.LinkedList;
&lt;br&gt;+import java.util.Queue;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=48&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeChannelSink extends AbstractChannelSink {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public Queue&amp;lt;ChannelEvent&amp;gt; events = new LinkedList&amp;lt;ChannelEvent&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void eventSunk(ChannelPipeline pipeline, ChannelEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;events.add(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeClientSocketChannelFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeClientSocketChannelFactory.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeClientSocketChannelFactory.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,31 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.socket.ClientSocketChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannel;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=49&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeClientSocketChannelFactory implements ClientSocketChannelFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;FakeSocketChannel&amp;gt; createdChannels;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FakeClientSocketChannelFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createdChannels = new ArrayList&amp;lt;FakeSocketChannel&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SocketChannel newChannel(ChannelPipeline pipeline) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FakeSocketChannel channel = new FakeSocketChannel(null, this, pipeline, new FakeChannelSink());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createdChannels.add(channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void releaseExternalResources() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// nothing to do
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannel.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannel.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,63 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.jboss.netty.channel.Channels.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelConfig;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=50&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeServerSocketChannel extends AbstractChannel implements ServerSocketChannel {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean bound;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean connected;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress localAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ServerSocketChannelConfig config = new FakeServerSocketChannelConfig();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FakeServerSocketChannel(ChannelFactory factory, ChannelPipeline pipeline, ChannelSink sink) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(null, factory, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ServerSocketChannelConfig getConfig() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getLocalAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return localAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getRemoteAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isBound() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bound;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isConnected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return connected;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FakeSocketChannel acceptNewConnection(InetSocketAddress remoteAddress, ChannelSink sink) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline newPipeline = getConfig().getPipelineFactory().getPipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FakeSocketChannel newChannel = new FakeSocketChannel(this, getFactory(), newPipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newChannel.localAddress = this.localAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newChannel.remoteAddress = remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelOpen(newChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelBound(newChannel, newChannel.localAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelConnected(this, newChannel.remoteAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return newChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelConfig.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelConfig.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,49 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBufferFactory;
&lt;br&gt;+import org.jboss.netty.buffer.HeapChannelBufferFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.DefaultChannelConfig;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelConfig;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=51&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeServerSocketChannelConfig extends DefaultChannelConfig implements ServerSocketChannelConfig {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int backlog = 5;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int receiveBufferSize = 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean reuseAddress = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int connectionTimeout = 5000;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelPipelineFactory pipelineFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int writeTimeout = 5000;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelBufferFactory bufferFactory = new HeapChannelBufferFactory();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getBacklog() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return backlog;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setBacklog(int backlog) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.backlog = backlog;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public int getReceiveBufferSize() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return receiveBufferSize;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReceiveBufferSize(int receiveBufferSize) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.receiveBufferSize = receiveBufferSize;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isReuseAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return reuseAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setReuseAddress(boolean reuseAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.reuseAddress = reuseAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// ignore
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelFactory.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelFactory.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeServerSocketChannelFactory.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,25 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=52&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeServerSocketChannelFactory implements ServerSocketChannelFactory {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelSink sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FakeServerSocketChannel createdChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ServerSocketChannel newChannel(ChannelPipeline pipeline) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createdChannel = new FakeServerSocketChannel(this, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return createdChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void releaseExternalResources() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// nothing to do
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeSocketChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeSocketChannel.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/FakeSocketChannel.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,79 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.AbstractChannel;
&lt;br&gt;+import org.jboss.netty.channel.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelSink;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=53&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class FakeSocketChannel extends AbstractChannel implements SocketChannel {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress localAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SocketChannelConfig config = new FakeChannelConfig();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean bound = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean connected = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public ChannelSink sink;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public FakeSocketChannel(Channel parent, ChannelFactory factory, ChannelPipeline pipeline, ChannelSink sink) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super(parent, factory, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.sink = sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getLocalAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return localAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public SocketChannelConfig getConfig() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return config;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public InetSocketAddress getRemoteAddress() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isBound() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return bound;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean isConnected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return connected;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void emulateConnected(InetSocketAddress localAddress, InetSocketAddress remoteAddress, ChannelFuture connectedFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(connected) {
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateBound(localAddress, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.remoteAddress = remoteAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connected = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(this, remoteAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(connectedFuture != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectedFuture.setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void emulateBound(InetSocketAddress localAddress, ChannelFuture boundFuture) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(bound) {
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bound = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.localAddress = localAddress;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelBound(this, localAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(boundFuture != null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boundFuture.setSuccess();
&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;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelAcceptedChannelSinkTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Ignore;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=54&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+@Ignore
&lt;br&gt;+public class HttpTunnelAcceptedChannelSinkTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitchDownstreamInterface messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private UpstreamEventCatcher upstreamCatcher;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch = mockContext.mock(ServerMessageSwitchDownstreamInterface.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new HttpTunnelAcceptedChannelSink(messageSwitch, TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamCatcher = new UpstreamEventCatcher();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(UpstreamEventCatcher.NAME, upstreamCatcher);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamCatcher.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendData() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer outboundData = NettyTestUtils.createData(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).routeOutboundData(with(equal(TUNNEL_ID)), with(same(outboundData)), with(any(ChannelFuture.class)));
&lt;br&gt;+ &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;Channels.write(channel, outboundData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendInvalidDataType() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, new Object());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, upstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsExceptionEvent(upstreamCatcher.events.poll());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testUnbind() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).closeTunnel(TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}});
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.unbind(channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testDisconnect() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(messageSwitch).closeTunnel(TUNNEL_ID);
&lt;br&gt;+ &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;Channels.disconnect(channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelConfigTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,174 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+public class HttpTunnelClientChannelConfigTest {
&lt;br&gt;+
&lt;br&gt;+	JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+	
&lt;br&gt;+	SocketChannelConfig sendChannelConfig;
&lt;br&gt;+	SocketChannelConfig pollChannelConfig;
&lt;br&gt;+	
&lt;br&gt;+	HttpTunnelClientChannelConfig config;
&lt;br&gt;+	
&lt;br&gt;+	@Before
&lt;br&gt;+	public void setUp() {
&lt;br&gt;+		sendChannelConfig = mockContext.mock(SocketChannelConfig.class, &amp;quot;sendChannelConfig&amp;quot;);
&lt;br&gt;+		pollChannelConfig = mockContext.mock(SocketChannelConfig.class, &amp;quot;pollChannelConfig&amp;quot;);
&lt;br&gt;+		
&lt;br&gt;+		config = new HttpTunnelClientChannelConfig(sendChannelConfig, pollChannelConfig);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testGetReceiveBufferSize() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).getReceiveBufferSize(); will(returnValue(100));
&lt;br&gt;+		}});
&lt;br&gt;+		
&lt;br&gt;+		assertEquals(100, config.getReceiveBufferSize());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testGetSendBufferSize() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).getSendBufferSize(); will(returnValue(100));
&lt;br&gt;+		}});
&lt;br&gt;+		
&lt;br&gt;+		assertEquals(100, config.getSendBufferSize());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testGetSoLinger() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).getSoLinger(); will(returnValue(100));
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		assertEquals(100, config.getSoLinger());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testTrafficClass() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).getTrafficClass(); will(returnValue(1));
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		assertEquals(1, config.getTrafficClass());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testIsKeepAlive() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).isKeepAlive(); will(returnValue(true));
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		assertTrue(config.isKeepAlive());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testIsReuseAddress() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).isReuseAddress(); will(returnValue(true));
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		assertTrue(config.isReuseAddress());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testIsTcpNoDelay() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).isTcpNoDelay(); will(returnValue(true));
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		assertTrue(config.isTcpNoDelay());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetKeepAlive() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setKeepAlive(true);
&lt;br&gt;+			one(sendChannelConfig).setKeepAlive(true);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setKeepAlive(true);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetPerformancePreferences() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;+			one(sendChannelConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setPerformancePreferences(100, 200, 300);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetReceiveBufferSize() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setReceiveBufferSize(100);
&lt;br&gt;+			one(sendChannelConfig).setReceiveBufferSize(100);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setReceiveBufferSize(100);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetReuseAddress() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setReuseAddress(true);
&lt;br&gt;+			one(sendChannelConfig).setReuseAddress(true);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setReuseAddress(true);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetSendBufferSize() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setSendBufferSize(100);
&lt;br&gt;+			one(sendChannelConfig).setSendBufferSize(100);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setSendBufferSize(100);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetSoLinger() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setSoLinger(100);
&lt;br&gt;+			one(sendChannelConfig).setSoLinger(100);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setSoLinger(100);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testTcpNoDelay() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setTcpNoDelay(true);
&lt;br&gt;+			one(sendChannelConfig).setTcpNoDelay(true);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setTcpNoDelay(true);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSetTrafficClass() {
&lt;br&gt;+		mockContext.checking(new Expectations() {{
&lt;br&gt;+			one(pollChannelConfig).setTrafficClass(1);
&lt;br&gt;+			one(sendChannelConfig).setTrafficClass(1);
&lt;br&gt;+		}}); 
&lt;br&gt;+		
&lt;br&gt;+		config.setTrafficClass(1);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientChannelTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,116 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelState;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=55&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class HttpTunnelClientChannelTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final InetSocketAddress LOCAL_ADDRESS = InetSocketAddress.createUnresolved(&amp;quot;localhost&amp;quot;, 50123);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final InetSocketAddress REMOTE_ADDRESS = InetSocketAddress.createUnresolved(&amp;quot;test.server.com&amp;quot;, 12345);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private UpstreamEventCatcher upstreamCatcher;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientChannel channel;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeClientSocketChannelFactory outboundFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel sendChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel pollChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink sendSink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink pollSink;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamCatcher = new UpstreamEventCatcher();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(UpstreamEventCatcher.NAME, upstreamCatcher);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;outboundFactory = new FakeClientSocketChannelFactory();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientChannelFactory factory = &amp;nbsp;new HttpTunnelClientChannelFactory(outboundFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = factory.newChannel(pipeline);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(2, outboundFactory.createdChannels.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel = outboundFactory.createdChannels.get(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel = outboundFactory.createdChannels.get(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendSink = (FakeChannelSink) sendChannel.sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollSink = (FakeChannelSink) pollChannel.sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testConnect() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.connect(channel, REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// this should result in a CONNECTED state event on the send channel, but not on the poll
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// channel just yet
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sendSink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, pollSink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelEvent sendChannelEvent = sendSink.events.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(sendChannelEvent, ChannelState.CONNECTED, REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// once the send channel indicates that it is connected, we should see the tunnel open request
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// being sent
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.emulateConnected(LOCAL_ADDRESS, REMOTE_ADDRESS, ((ChannelStateEvent)sendChannelEvent).getFuture());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sendSink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelEvent openTunnelRequest = sendSink.events.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsDownstreamMessageEvent(openTunnelRequest, ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testBind() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture bindFuture = Channels.bind(channel, LOCAL_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sendSink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, pollSink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelEvent sendChannelEvent = sendSink.events.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(sendChannelEvent, ChannelState.BOUND, LOCAL_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelEvent pollChannelEvent = pollSink.events.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(pollChannelEvent, ChannelState.BOUND, LOCAL_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sendChannel.emulateBound(LOCAL_ADDRESS, sendChannelEvent.getFuture());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pollChannel.emulateBound(LOCAL_ADDRESS, pollChannelEvent.getFuture());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(bindFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testBind_sendBindFails() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture bindFuture = Channels.bind(channel, LOCAL_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Exception bindFailureReason = new Exception(&amp;quot;could not bind&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((ChannelStateEvent) sendSink.events.poll()).getFuture().setFailure(bindFailureReason);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(bindFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(bindFailureReason, bindFuture.getCause());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testBind_pollBindFails() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture bindFuture = Channels.bind(channel, LOCAL_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Exception bindFailureReason = new Exception(&amp;quot;could not bind&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((ChannelStateEvent) pollSink.events.poll()).getFuture().setFailure(bindFailureReason);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(bindFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(bindFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(bindFailureReason, bindFuture.getCause());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientPollHandlerTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,91 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.UnknownHostException;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.DownstreamMessageEvent;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=56&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class HttpTunnelClientPollHandlerTest {
&lt;br&gt;+
&lt;br&gt;+	private static final String TUNNEL_ID = &amp;quot;1&amp;quot;;
&lt;br&gt;+	private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3}, 12345);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress PROXY_ADDRESS = createAddress(new byte[] { 10, 0, 0, 2 }, 8888);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress LOCAL_ADDRESS = createAddress(new byte[] { 10, 0, 0, 1 }, 54321);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientPollHandler handler;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private MockChannelStateListener listener;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static InetSocketAddress createAddress(byte[] addr, int port) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new InetSocketAddress(InetAddress.getByAddress(addr), port);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnknownHostException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;Bad address in test&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+	@Before
&lt;br&gt;+	public void setUp() throws Exception {
&lt;br&gt;+		sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+		ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener = new MockChannelStateListener();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener.serverHostName = HttpTunnelMessageUtils.convertToHostString(SERVER_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler = new HttpTunnelClientPollHandler(listener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler.setTunnelId(TUNNEL_ID);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(HttpTunnelClientPollHandler.NAME, handler);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = PROXY_ADDRESS;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.localAddress = LOCAL_ADDRESS;
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSendsRequestOnConnect() {
&lt;br&gt;+		Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;+		assertEquals(1, sink.events.size());
&lt;br&gt;+		HttpRequest request = checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;+		assertTrue(HttpTunnelMessageUtils.isServerToClientRequest(request));
&lt;br&gt;+		assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;+		assertTrue(listener.fullyEstablished);
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSendsReceivedDataSentUpstream() {
&lt;br&gt;+		HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;+		Channels.fireMessageReceived(channel, response);
&lt;br&gt;+		assertEquals(1, listener.messages.size());
&lt;br&gt;+		assertEquals(1234L, listener.messages.get(0).readLong());
&lt;br&gt;+	}
&lt;br&gt;+	
&lt;br&gt;+	@Test
&lt;br&gt;+	public void testSendsAnotherRequestAfterResponse() {
&lt;br&gt;+		HttpResponse response = HttpTunnelMessageUtils.createRecvDataResponse(NettyTestUtils.createData(1234L));
&lt;br&gt;+		Channels.fireMessageReceived(channel, response);
&lt;br&gt;+		assertEquals(1, sink.events.size());
&lt;br&gt;+		checkIsMessageEventContainingHttpRequest(sink.events.poll());
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	private HttpRequest checkIsMessageEventContainingHttpRequest(ChannelEvent event) {
&lt;br&gt;+		assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;+		DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;+		assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;+		return (HttpRequest) messageEvent.getMessage();
&lt;br&gt;+	}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelClientSendHandlerTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,172 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.UnknownHostException;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelState;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.DownstreamMessageEvent;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=57&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class HttpTunnelClientSendHandlerTest {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress SERVER_ADDRESS = createAddress(new byte[] { 10, 0, 0, 3 }, 12345);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress PROXY_ADDRESS = createAddress(new byte[] { 10, 0, 0, 2 }, 8888);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final InetSocketAddress LOCAL_ADDRESS = createAddress(new byte[] { 10, 0, 0, 1 }, 54321);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientSendHandler handler;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private MockChannelStateListener listener;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener = new MockChannelStateListener();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;listener.serverHostName = HttpTunnelMessageUtils.convertToHostString(SERVER_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;handler = new HttpTunnelClientSendHandler(listener);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(HttpTunnelClientSendHandler.NAME, handler);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.remoteAddress = PROXY_ADDRESS;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.localAddress = LOCAL_ADDRESS;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static InetSocketAddress createAddress(byte[] addr, int port) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new InetSocketAddress(InetAddress.getByAddress(addr), port);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnknownHostException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;Bad address in test&amp;quot;);
&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;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendsTunnelOpen() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpRequest.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isOpenTunnelRequest(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.checkHost(request, SERVER_ADDRESS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testStoresTunnelId() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnect();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createTunnelOpenResponse(&amp;quot;newTunnel&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, handler.getTunnelId());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, listener.tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendData() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelEvent sentEvent = sink.events.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsSendDataRequestWithData(sentEvent, &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testWillNotSendDataUntilTunnelIdSet() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnect();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelConnected(channel, PROXY_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testOnlyOneRequestAtATime() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	emulateConnectAndOpen();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	channel.write(NettyTestUtils.createData(5678L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	assertEquals(0, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(5678L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testDisconnect() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(NettyTestUtils.createData(1234L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsSendDataRequestWithData(sink.events.poll(), &amp;quot;10.0.0.2:12345&amp;quot;, NettyTestUtils.createData(1234L));
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.disconnect();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createSendDataResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpRequest.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isCloseTunnelRequest(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, HttpTunnelMessageUtils.extractTunnelId(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createTunnelCloseResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(sink.events.poll(), ChannelState.CONNECTED, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testClose() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.close();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = NettyTestUtils.checkIsDownstreamMessageEvent(sink.events.poll(), HttpRequest.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(HttpTunnelMessageUtils.isCloseTunnelRequest(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;newTunnel&amp;quot;, HttpTunnelMessageUtils.extractTunnelId(request));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createTunnelCloseResponse());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, sink.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NettyTestUtils.checkIsStateEvent(sink.events.poll(), ChannelState.OPEN, false);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testWritesAfterCloseAreRejected() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnectAndOpen();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.close();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(channel.write(NettyTestUtils.createData(1234L)).isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void checkIsSendDataRequestWithData(ChannelEvent event, String expectedHost, ChannelBuffer data) {
&lt;br&gt;+		assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;+		DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;+		assertTrue(messageEvent.getMessage() instanceof HttpRequest);
&lt;br&gt;+		HttpRequest request = (HttpRequest) messageEvent.getMessage();
&lt;br&gt;+		assertTrue(HttpTunnelMessageUtils.isSendDataRequest(request));
&lt;br&gt;+		assertEquals(data.readableBytes(), request.getContentLength());
&lt;br&gt;+		
&lt;br&gt;+		ChannelBuffer content = request.getContent();
&lt;br&gt;+		NettyTestUtils.assertEquals(data, content);
&lt;br&gt;+	}
&lt;br&gt;+
&lt;br&gt;+	private void emulateConnect() {
&lt;br&gt;+	 &amp;nbsp; &amp;nbsp;channel.emulateConnected(LOCAL_ADDRESS, PROXY_ADDRESS, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void emulateConnectAndOpen() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;emulateConnect();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireMessageReceived(channel, HttpTunnelMessageUtils.createTunnelOpenResponse(&amp;quot;newTunnel&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelFactoryTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,76 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelException;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=58&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+public class HttpTunnelServerChannelFactoryTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannelFactory realChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelFactory factory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory = mockContext.mock(ServerSocketChannelFactory.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;factory = new HttpTunnelServerChannelFactory(realChannelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannel = new FakeServerSocketChannel(factory, pipeline, new FakeChannelSink());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testNewChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannelFactory).newChannel(with(any(ChannelPipeline.class))); will(returnValue(realChannel));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}});
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelServerChannel newChannel = factory.newChannel(pipeline);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(newChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(pipeline, newChannel.getPipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testNewChannel_forwardsWrappedFactoryFailure() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelException innerException = new ChannelException();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannelFactory).newChannel(with(any(ChannelPipeline.class))); will(throwException(innerException));
&lt;br&gt;+ &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;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;factory.newChannel(Channels.pipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fail(&amp;quot;Expected ChannelException&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch(ChannelException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(innerException, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+// &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+// &amp;nbsp; &amp;nbsp;public void testChannelCreation_withServerBootstrap() {
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannelFactory).newChannel(with(any(ChannelPipeline.class))); will(returnValue(realChannel));
&lt;br&gt;+// &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;ServerBootstrap bootstrap = new ServerBootstrap(factory);
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel newChannel = bootstrap.bind(new InetSocketAddress(80));
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(newChannel);
&lt;br&gt;+// &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+// &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelSinkTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,124 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&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.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.ExceptionEvent;
&lt;br&gt;+import org.jboss.netty.channel.SimpleChannelUpstreamHandler;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannel;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.After;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=59&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+public class HttpTunnelServerChannelSinkTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelSink sink;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelPipeline pipeline;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerSocketChannel realChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelFuture realFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Throwable exceptionInPipeline;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannel = mockContext.mock(ServerSocketChannel.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;exceptioncatcher&amp;quot;, new ExceptionCatcher());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink = new HttpTunnelServerChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sink.setRealChannel(realChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, sink);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture = Channels.future(realChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@After
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void teardown() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(&amp;quot;exception caught in pipeline: &amp;quot; + exceptionInPipeline, exceptionInPipeline == null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testCloseRequest() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).close(); will(returnValue(realFuture));
&lt;br&gt;+ &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;ChannelFuture virtualFuture1 = Channels.close(channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.assertIsSatisfied();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = virtualFuture1;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(virtualFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testUnbindRequest_withSuccess() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkUnbind();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(virtualFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testUnbindRequest_withFailure() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkUnbind();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setFailure(new Exception(&amp;quot;Something bad happened&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(virtualFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelFuture checkUnbind() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).unbind(); will(returnValue(realFuture));
&lt;br&gt;+ &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;ChannelFuture virtualFuture = Channels.unbind(channel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.assertIsSatisfied();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return virtualFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testBindRequest_withSuccess() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkBind();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(virtualFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testBindRequest_withFailure() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture virtualFuture = checkBind();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realFuture.setFailure(new Exception(&amp;quot;Something bad happened&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(virtualFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelFuture checkBind() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final SocketAddress toAddress = new InetSocketAddress(80);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(realChannel).bind(toAddress); will(returnValue(realFuture));
&lt;br&gt;+ &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;ChannelFuture virtualFuture = Channels.bind(channel, toAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return virtualFuture;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private final class ExceptionCatcher extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exceptionInPipeline = e.getCause();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &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: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelServerChannelTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,187 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.SocketAddress;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelState;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.UpstreamChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelConfig;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=60&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+public class HttpTunnelServerChannelTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannel virtualChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private UpstreamEventCatcher upstreamEvents;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeServerSocketChannelFactory realChannelFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory = new FakeServerSocketChannelFactory();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.sink = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelServerChannelFactory factory = new HttpTunnelServerChannelFactory(realChannelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel = factory.newChannel(createVirtualChannelPipeline());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelPipeline createVirtualChannelPipeline() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamEvents = new UpstreamEventCatcher();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(UpstreamEventCatcher.NAME, upstreamEvents);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testGetLocalAddress_delegatedToRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.createdChannel.localAddress = InetSocketAddress.createUnresolved(&amp;quot;mycomputer&amp;quot;, 80);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress returned = virtualChannel.getLocalAddress();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(realChannelFactory.createdChannel.localAddress, returned);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testGetRemoteAddress_returnsNull() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNull(virtualChannel.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testIsBound_delegatedToRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.createdChannel.bound = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(virtualChannel.isBound());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.createdChannel.bound = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(virtualChannel.isBound());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testConstruction_firesOpenEvent() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(upstreamEvents.events.size() &amp;gt; 0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsUpstreamChannelStateEvent(upstreamEvents.events.poll(), virtualChannel, ChannelState.OPEN, Boolean.TRUE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChannelBoundEventFromReal_replicatedOnVirtual() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamEvents.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetSocketAddress boundAddr = InetSocketAddress.createUnresolved(&amp;quot;mycomputer&amp;quot;, 12345);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelBound(realChannelFactory.createdChannel, boundAddr);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, upstreamEvents.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsUpstreamChannelStateEvent(upstreamEvents.events.poll(), virtualChannel, ChannelState.BOUND, boundAddr);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChannelUnboundEventFromReal_replicatedOnVirtual() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamEvents.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelUnbound(realChannelFactory.createdChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, upstreamEvents.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsUpstreamChannelStateEvent(upstreamEvents.events.poll(), virtualChannel, ChannelState.BOUND, null);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChannelClosedEventFromReal_replicatedOnVirtual() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;upstreamEvents.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.fireChannelClosed(realChannelFactory.createdChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, upstreamEvents.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkIsUpstreamChannelStateEvent(upstreamEvents.events.poll(), virtualChannel, ChannelState.OPEN, Boolean.FALSE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testHasConfiguration() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(virtualChannel.getConfig());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChangePipelineFactoryDoesNotAffectRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipelineFactory realPipelineFactory = realChannelFactory.createdChannel.getConfig().getPipelineFactory();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipelineFactory virtualPipelineFactory = mockContext.mock(ChannelPipelineFactory.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setPipelineFactory(virtualPipelineFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(virtualPipelineFactory, virtualChannel.getConfig().getPipelineFactory());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// channel pipeline factory is a special case: we do not want it set on the configuration
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// of the underlying factory
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(realPipelineFactory, realChannelFactory.createdChannel.getConfig().getPipelineFactory());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChangingBacklogAffectsRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setBacklog(1234);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1234, realChannelFactory.createdChannel.getConfig().getBacklog());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChangingConnectTimeoutMillisAffectsRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setConnectTimeoutMillis(54321);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(54321, realChannelFactory.createdChannel.getConfig().getConnectTimeoutMillis());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChangingPerformancePreferencesAffectsRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ServerSocketChannelConfig mockConfig = mockContext.mock(ServerSocketChannelConfig.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.createdChannel.config = mockConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(mockConfig).setPerformancePreferences(100, 200, 300);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}});
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setPerformancePreferences(100, 200, 300);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.assertIsSatisfied();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChangingReceiveBufferSizeAffectsRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setReceiveBufferSize(10101);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(10101, realChannelFactory.createdChannel.getConfig().getReceiveBufferSize());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChangingReuseAddressAffectsRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setReuseAddress(true);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(true, realChannelFactory.createdChannel.getConfig().isReuseAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetChannelPipelineFactoryViaOption() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ServerSocketChannelConfig mockConfig = mockContext.mock(ServerSocketChannelConfig.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.createdChannel.config = mockConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;never(mockConfig);
&lt;br&gt;+ &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;ChannelPipelineFactory factory = mockContext.mock(ChannelPipelineFactory.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualChannel.getConfig().setOption(&amp;quot;pipelineFactory&amp;quot;, factory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(factory, virtualChannel.getConfig().getPipelineFactory());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSetOptionAffectsRealChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ServerSocketChannelConfig mockConfig = mockContext.mock(ServerSocketChannelConfig.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;realChannelFactory.createdChannel.config = mockConfig;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(mockConfig).setOption(&amp;quot;testOption&amp;quot;, &amp;quot;testValue&amp;quot;);
&lt;br&gt;+ &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;virtualChannel.getConfig().setOption(&amp;quot;testOption&amp;quot;, &amp;quot;testValue&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void checkIsUpstreamChannelStateEvent(ChannelEvent ev, Channel expectedChannel, ChannelState expectedState, Object expectedValue) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(ev instanceof UpstreamChannelStateEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UpstreamChannelStateEvent checkedEv = (UpstreamChannelStateEvent) ev;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(expectedChannel, checkedEv.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(expectedState, checkedEv.getState());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(expectedValue, checkedEv.getValue());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelSoakTester.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,308 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.io.IOException;
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.UnknownHostException;
&lt;br&gt;+import java.util.Random;
&lt;br&gt;+import java.util.concurrent.ConcurrentLinkedQueue;
&lt;br&gt;+import java.util.concurrent.ExecutorService;
&lt;br&gt;+import java.util.concurrent.Executors;
&lt;br&gt;+import java.util.concurrent.ScheduledExecutorService;
&lt;br&gt;+import java.util.concurrent.TimeUnit;
&lt;br&gt;+import java.util.logging.Level;
&lt;br&gt;+import java.util.logging.Logger;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.bootstrap.ClientBootstrap;
&lt;br&gt;+import org.jboss.netty.bootstrap.ServerBootstrap;
&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.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&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.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&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.channel.group.ChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.group.DefaultChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.socket.ClientSocketChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.ServerSocketChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=61&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class HttpTunnelSoakTester {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final int SERVER_PORT = 20100;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final Logger LOG = Logger.getLogger(HttpTunnelSoakTester.class.getName());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerBootstrap serverBootstrap;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ClientBootstrap clientBootstrap;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelGroup channels;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int expectedNextByte = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;int nextWriteByte = 0;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ExecutorService executor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ScheduledExecutorService scheduledExecutor;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt; verificationQueue;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public HttpTunnelSoakTester() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.in.read();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (IOException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// TODO Auto-generated catch block
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;executor = Executors.newCachedThreadPool();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verificationQueue = new ConcurrentLinkedQueue&amp;lt;ChannelBuffer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ServerSocketChannelFactory serverChannelFactory = new NioServerSocketChannelFactory(executor, executor);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelServerChannelFactory serverTunnelFactory = new HttpTunnelServerChannelFactory(serverChannelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap = new ServerBootstrap(serverTunnelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.setPipelineFactory(createServerPipelineFactory());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClientSocketChannelFactory clientChannelFactory = new NioClientSocketChannelFactory(executor, executor);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelClientChannelFactory clientTunnelFactory = new HttpTunnelClientChannelFactory(clientChannelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap = new ClientBootstrap(clientTunnelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.setPipelineFactory(createClientPipelineFactory());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;configureProxy();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels = new DefaultChannelGroup();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void configureProxy() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String proxyHost = System.getProperty(&amp;quot;http.proxyHost&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(proxyHost != null &amp;&amp; !proxyHost.isEmpty()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int proxyPort = Integer.getInteger(&amp;quot;http.proxyPort&amp;quot;, 80);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetAddress chosenAddress = chooseAddress(proxyHost);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetSocketAddress proxyAddress = new InetSocketAddress(chosenAddress, proxyPort);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!proxyAddress.isUnresolved()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.setOption(HttpTunnelClientChannelConfig.PROXY_ADDRESS_OPTION, proxyAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.out.println(&amp;quot;Using &amp;quot; + proxyAddress + &amp;quot; as a proxy for this test run&amp;quot;);
&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;System.err.println(&amp;quot;Failed to resolve proxy address &amp;quot; + proxyAddress);
&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;System.out.println(&amp;quot;No proxy specified, will connect to server directly&amp;quot;);
&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 InetAddress chooseAddress(String proxyHost) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetAddress[] allByName = InetAddress.getAllByName(proxyHost);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(InetAddress address : allByName) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(address.isAnyLocalAddress() || address.isLinkLocalAddress()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;continue;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return address;
&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;
&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;} catch (UnknownHostException e) {
&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;protected ChannelPipelineFactory createClientPipelineFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new ChannelPipelineFactory() {
&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;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;responseVerifier&amp;quot;, new ResponseVerifier());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&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;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;protected ChannelPipelineFactory createServerPipelineFactory() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new ChannelPipelineFactory() {
&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;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;echo&amp;quot;, new EchoHandler());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&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;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void run() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;binding server channel&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel serverChannel = serverBootstrap.bind(new InetSocketAddress(SERVER_PORT));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels.add(serverChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;server channel bound to {0}&amp;quot;, serverChannel.getLocalAddress());
&lt;br&gt;+ &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;Channel clientChannel = createClientChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(clientChannel == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;no client channel - bailing out&amp;quot;);
&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;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels.add(clientChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor.execute(new VerificationTask());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!pushData(clientChannel)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;Data send cycle failed&amp;quot;);
&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;LOG.info(&amp;quot;send cycle completed successfully&amp;quot;);
&lt;br&gt;+ &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;LOG.info(&amp;quot;closing channels&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;closeChannel(clientChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;closeChannel(serverChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.info(&amp;quot;done!&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void closeChannel(Channel channel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!channel.close().await(1000L, TimeUnit.SECONDS)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.warning(&amp;quot;Failed to close connection within reasonable amount of time&amp;quot;);
&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;} catch (InterruptedException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;Interrupted while closing connection&amp;quot;);
&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 boolean pushData(Channel clientChannel) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long totalBytesSent = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long runStartTime = System.currentTimeMillis();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; 10000; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] randomBytesForSend = createRandomSizeByteArray();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;totalBytesSent += randomBytesForSend.length;
&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;long startTime = System.nanoTime();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture writeFuture = clientChannel.write(ChannelBuffers.wrappedBuffer(randomBytesForSend));
&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;if(!writeFuture.await(10, TimeUnit.SECONDS)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.SEVERE, &amp;quot;Failed to write random array of length {0} in acceptable time&amp;quot;, randomBytesForSend.length);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&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;long endTime = System.nanoTime();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long totalTime = endTime - startTime;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(totalTime &amp;gt; 1000 * 1000000) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.WARNING, &amp;quot;Took {0}ns to write {1} bytes&amp;quot;, new Object[] { endTime - startTime, randomBytesForSend.length });
&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;} catch(InterruptedException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.SEVERE, &amp;quot;Interrupted while waiting for bytes to be written&amp;quot;, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(i % 100 == 0 &amp;&amp; i &amp;gt; 0) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;{0} writes completed, totalling {1} bytes&amp;quot;, new Object[] { i, totalBytesSent });
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long runEndTime = System.currentTimeMillis();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long totalTime = runEndTime - runStartTime;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;long totalKB = totalBytesSent / 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double rate = totalKB / (totalTime / 1000.0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.INFO, &amp;quot;Average throughput: {0} KB/s&amp;quot;, rate);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Channel createClientChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;InetSocketAddress serverAddress = new InetSocketAddress(&amp;quot;10.0.1.22&amp;quot;, SERVER_PORT);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture clientChannelFuture = clientBootstrap.connect(serverAddress);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!clientChannelFuture.await(1000, TimeUnit.MILLISECONDS)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;did not connect within acceptable time period&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &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;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (InterruptedException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;Interrupted while waiting for client connect to be established&amp;quot;);
&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; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!clientChannelFuture.isSuccess()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.log(Level.SEVERE, &amp;quot;did not connect successfully&amp;quot;, clientChannelFuture.getCause());
&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; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return clientChannelFuture.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private byte[] createRandomSizeByteArray() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Random random = new Random();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int arraySize = random.nextInt(64 * 1024) + 1;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] randomBytes = new byte[arraySize];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; randomBytes.length; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;randomBytes[i] = (byte)nextWriteByte;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;nextWriteByte = (nextWriteByte + 1) % 127;
&lt;br&gt;+ &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;return randomBytes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void main(String[] args) throws UnknownHostException {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpTunnelSoakTester soakTester = new HttpTunnelSoakTester();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;soakTester.run();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} finally {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;soakTester.shutdown();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void shutdown() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.releaseExternalResources();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.releaseExternalResources();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;executor.shutdownNow();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor.shutdownNow();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private class EchoHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(ctx.getChannel(), e.getMessage());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private class ResponseVerifier extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelBuffer receivedBytes = (ChannelBuffer) e.getMessage();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;verificationQueue.offer(receivedBytes);
&lt;br&gt;+ &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;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelOpen(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channels.add(ctx.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private class VerificationTask implements Runnable {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void run() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer bytesToVerify = verificationQueue.poll();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(bytesToVerify == null) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor.schedule(this, 10, TimeUnit.MILLISECONDS);
&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;
&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;while(bytesToVerify.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(bytesToVerify.readByte() != expectedNextByte) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LOG.severe(&amp;quot;received a byte out of sequence&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;System.exit(-1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &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; &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; &amp;nbsp;expectedNextByte = (expectedNextByte + 1) % 127;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;scheduledExecutor.execute(this);
&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: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/HttpTunnelTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,186 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.UnknownHostException;
&lt;br&gt;+import java.util.concurrent.CountDownLatch;
&lt;br&gt;+import java.util.concurrent.Executors;
&lt;br&gt;+import java.util.concurrent.TimeUnit;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.bootstrap.ClientBootstrap;
&lt;br&gt;+import org.jboss.netty.bootstrap.ServerBootstrap;
&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.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandler;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&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.channel.ChannelPipelineFactory;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&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.channel.group.ChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.group.DefaultChannelGroup;
&lt;br&gt;+import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
&lt;br&gt;+import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
&lt;br&gt;+import org.junit.After;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=62&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class HttpTunnelTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelClientChannelFactory clientFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelServerChannelFactory serverFactory;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ClientBootstrap clientBootstrap;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerBootstrap serverBootstrap;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelGroup activeConnections;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelHandler clientCaptureHandler;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerEndHandler connectionCaptureHandler;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Channel serverEnd;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private CountDownLatch serverEndLatch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer receivedBytes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private CountDownLatch messageReceivedLatch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer clientReceivedBytes;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private CountDownLatch clientMessageReceivedLatch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private Channel serverChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws UnknownHostException {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections = new DefaultChannelGroup();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientFactory = new HttpTunnelClientChannelFactory(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverFactory = new HttpTunnelServerChannelFactory(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap = new ClientBootstrap(clientFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientCaptureHandler = new ClientEndHandler();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;clientCapture&amp;quot;, clientCaptureHandler);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientReceivedBytes = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientMessageReceivedLatch = new CountDownLatch(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap = new ServerBootstrap(serverFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connectionCaptureHandler = new ServerEndHandler();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.setPipelineFactory(new ChannelPipelineFactory() {
&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;public ChannelPipeline getPipeline() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;capture&amp;quot;, connectionCaptureHandler);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return pipeline;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverEndLatch = new CountDownLatch(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;receivedBytes = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageReceivedLatch = new CountDownLatch(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverChannel = serverBootstrap.bind(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(serverChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@After
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void tearDown() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.disconnect().await(1000L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientBootstrap.releaseExternalResources();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverBootstrap.releaseExternalResources();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test(timeout=2000)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testConnectClientToServer() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture connectFuture = clientBootstrap.connect(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.await(1000L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(connectFuture.getChannel());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel clientChannel = connectFuture.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(clientChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(serverChannel.getLocalAddress(), clientChannel.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(serverEndLatch.await(1000, TimeUnit.MILLISECONDS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(serverEnd);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(clientChannel.getLocalAddress(), serverEnd.getRemoteAddress());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendDataFromClientToServer() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture connectFuture = clientBootstrap.connect(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.await(1000L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel clientEnd = connectFuture.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(clientEnd);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(serverEndLatch.await(1000, TimeUnit.MILLISECONDS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture writeFuture = Channels.write(clientEnd, NettyTestUtils.createData(100L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.await(1000L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(messageReceivedLatch.await(1000L, TimeUnit.MILLISECONDS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(100L, receivedBytes.readLong());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSendDataFromServerToClient() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture connectFuture = clientBootstrap.connect(new InetSocketAddress(InetAddress.getLocalHost(), 12345));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(connectFuture.await(1000L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel clientEnd = connectFuture.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(clientEnd);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(serverEndLatch.await(1000, TimeUnit.MILLISECONDS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture writeFuture = Channels.write(serverEnd, NettyTestUtils.createData(4321L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.await(1000L));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(writeFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(clientMessageReceivedLatch.await(1000, TimeUnit.MILLISECONDS));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(4321L, clientReceivedBytes.readLong());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;class ServerEndHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverEnd = e.getChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;activeConnections.add(serverEnd);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;serverEndLatch.countDown();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;super.channelConnected(ctx, e);
&lt;br&gt;+ &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;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;receivedBytes.writeBytes((ChannelBuffer) e.getMessage());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageReceivedLatch.countDown();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;class ClientEndHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@Override
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientReceivedBytes.writeBytes((ChannelBuffer) e.getMessage());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;clientMessageReceivedLatch.countDown();
&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: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/MockChannelStateListener.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/MockChannelStateListener.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/MockChannelStateListener.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,40 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.buffer.ChannelBuffer;
&lt;br&gt;+import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=63&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class MockChannelStateListener implements HttpTunnelClientWorkerOwner {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public boolean fullyEstablished = false;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public List&amp;lt;ChannelBuffer&amp;gt; messages = new ArrayList&amp;lt;ChannelBuffer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String tunnelId = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String serverHostName = null;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void fullyEstablished() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fullyEstablished = true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onConnectRequest(ChannelFuture connectFuture, InetSocketAddress remoteAddress) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// not relevant for test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onMessageReceived(ChannelBuffer content) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messages.add(content);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void onTunnelOpened(String tunnelId) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.tunnelId = tunnelId;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public String getServerHostName() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return serverHostName;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtils.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,155 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetAddress;
&lt;br&gt;+import java.net.InetSocketAddress;
&lt;br&gt;+import java.net.UnknownHostException;
&lt;br&gt;+import java.nio.ByteBuffer;
&lt;br&gt;+import java.util.ArrayList;
&lt;br&gt;+import java.util.Collections;
&lt;br&gt;+import java.util.Iterator;
&lt;br&gt;+import java.util.LinkedList;
&lt;br&gt;+import java.util.List;
&lt;br&gt;+
&lt;br&gt;+import junit.framework.Assert;
&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.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelState;
&lt;br&gt;+import org.jboss.netty.channel.ChannelStateEvent;
&lt;br&gt;+import org.jboss.netty.channel.DownstreamMessageEvent;
&lt;br&gt;+import org.jboss.netty.channel.ExceptionEvent;
&lt;br&gt;+import org.jboss.netty.channel.UpstreamMessageEvent;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=64&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class NettyTestUtils {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static ByteBuffer convertReadable(ChannelBuffer b) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int startIndex = b.readerIndex();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ByteBuffer converted = ByteBuffer.allocate(b.readableBytes());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.readBytes(converted);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.readerIndex(startIndex);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;converted.flip();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return converted;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void assertEquals(ChannelBuffer expected, ChannelBuffer actual) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(expected.readableBytes() != actual.readableBytes()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.failNotEquals(&amp;quot;channel buffers have differing readable sizes&amp;quot;, expected.readableBytes(), actual.readableBytes());
&lt;br&gt;+ &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;int startPositionExpected = expected.readerIndex();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int startPositionActual = actual.readerIndex();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int position = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(expected.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte expectedByte = expected.readByte();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte actualByte = actual.readByte(); 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(expectedByte != actualByte) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.failNotEquals(&amp;quot;channel buffers differ at position &amp;quot; + position, expectedByte, actualByte);
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;position++;
&lt;br&gt;+ &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;expected.readerIndex(startPositionExpected);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;actual.readerIndex(startPositionActual);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static boolean checkEquals(ChannelBuffer expected, ChannelBuffer actual) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(expected.readableBytes() != actual.readableBytes()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&lt;br&gt;+ &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;int position = 0;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(expected.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte expectedByte = expected.readByte();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte actualByte = actual.readByte(); 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(expectedByte != actualByte) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return false;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;position++;
&lt;br&gt;+ &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;return true;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static List&amp;lt;ChannelBuffer&amp;gt; splitIntoChunks(int chunkSize, ChannelBuffer... buffers) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LinkedList&amp;lt;ChannelBuffer&amp;gt; chunks = new LinkedList&amp;lt;ChannelBuffer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ArrayList&amp;lt;ChannelBuffer&amp;gt; sourceBuffers = new ArrayList&amp;lt;ChannelBuffer&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Collections.addAll(sourceBuffers, buffers);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Iterator&amp;lt;ChannelBuffer&amp;gt; sourceIter = sourceBuffers.iterator();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer chunk = ChannelBuffers.buffer(chunkSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(sourceIter.hasNext()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer source = sourceIter.next();
&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;int index = source.readerIndex();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(source.writerIndex() &amp;gt; index) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int fragmentSize = Math.min(source.writerIndex() - index, chunk.writableBytes());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;chunk.writeBytes(source, index, fragmentSize);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(!chunk.writable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;chunks.add(chunk);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;chunk = ChannelBuffers.buffer(chunkSize);
&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;index += fragmentSize;
&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;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(chunk.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;chunks.add(chunk);
&lt;br&gt;+ &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;return chunks;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static ChannelBuffer createData(long containedNumber) {
&lt;br&gt;+		ChannelBuffer data = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+		data.writeLong(containedNumber);
&lt;br&gt;+		return data;
&lt;br&gt;+	}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void checkIsUpstreamMessageEventContainingData(ChannelEvent event, ChannelBuffer expectedData) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = checkIsUpstreamMessageEvent(event, ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;	assertEquals(expectedData, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static &amp;lt;T&amp;gt; T checkIsUpstreamMessageEvent(ChannelEvent event, Class&amp;lt;T&amp;gt; expectedMessageType) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof UpstreamMessageEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;UpstreamMessageEvent messageEvent = (UpstreamMessageEvent) event;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(expectedMessageType.isInstance(messageEvent.getMessage()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return expectedMessageType.cast(messageEvent.getMessage());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static &amp;lt;T&amp;gt; T checkIsDownstreamMessageEvent(ChannelEvent event, Class&amp;lt;T&amp;gt; expectedMessageType) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof DownstreamMessageEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DownstreamMessageEvent messageEvent = (DownstreamMessageEvent) event;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(expectedMessageType.isInstance(messageEvent.getMessage()));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return expectedMessageType.cast(messageEvent.getMessage());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static InetSocketAddress createAddress(byte[] addr, int port) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new InetSocketAddress(InetAddress.getByAddress(addr), port);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (UnknownHostException e) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new RuntimeException(&amp;quot;Bad address in test&amp;quot;);
&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;public static Throwable checkIsExceptionEvent(ChannelEvent ev) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(ev instanceof ExceptionEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ExceptionEvent exceptionEv = (ExceptionEvent)ev;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return exceptionEv.getCause();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void checkIsStateEvent(ChannelEvent event, ChannelState expectedState, Object expectedValue) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(event instanceof ChannelStateEvent);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelStateEvent stateEvent = (ChannelStateEvent) event;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.assertEquals(expectedState, stateEvent.getState());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Assert.assertEquals(expectedValue, stateEvent.getValue());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtilsTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtilsTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NettyTestUtilsTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,103 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.util.List;
&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.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=65&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class NettyTestUtilsTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplitIntoChunks() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer a = createFullBuffer(20, (byte)0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer b = createFullBuffer(20, (byte)1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer c = createFullBuffer(20, (byte)2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; chunks = NettyTestUtils.splitIntoChunks(10, a, b, c);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(6, chunks.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelBuffer chunk : chunks) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(10, chunk.readableBytes());
&lt;br&gt;+ &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;// reader index should not be modified by splitIntoChunks()
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, a.readerIndex());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, b.readerIndex());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, c.readerIndex());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplitIntoChunks_chunksCrossBoundaries() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer a = createFullBuffer(5, (byte)0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer b = createFullBuffer(5, (byte)1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer c = createFullBuffer(5, (byte)2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; chunks = NettyTestUtils.splitIntoChunks(4, a, b, c);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(4, chunks.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(0), new byte[] { 0, 0, 0, 0 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(1), new byte[] { 0, 1, 1, 1 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(2), new byte[] { 1, 1, 2, 2 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(3), new byte[] { 2, 2, 2 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplitIntoChunks_smallestChunksPossible() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer a = createFullBuffer(5, (byte)0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer b = createFullBuffer(5, (byte)1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer c = createFullBuffer(5, (byte)2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; chunks = NettyTestUtils.splitIntoChunks(1, a, b, c);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(15, chunks.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(0), new byte[] { 0 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(5), new byte[] { 1 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(10), new byte[] { 2 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplitIntoChunks_sourceBuffersArePartiallyRead() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer a = createFullBuffer(5, (byte)0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a.readerIndex(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer b = createFullBuffer(5, (byte)1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b.readerIndex(2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer c = createFullBuffer(5, (byte)2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// will be ignored, as fully read
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer d = createFullBuffer(5, (byte)3);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d.readerIndex(5);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer e = createFullBuffer(5, (byte)4);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.readerIndex(4);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; chunks = NettyTestUtils.splitIntoChunks(3, a, b, c, d, e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(0), new byte[] { 0, 0, 0 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(1), new byte[] { 0, 1, 1 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(2), new byte[] { 1, 2, 2 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(3), new byte[] { 2, 2, 2 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkBufferContains(chunks.get(4), new byte[] { 4 });
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private void checkBufferContains(ChannelBuffer channelBuffer, byte[] bs) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if(channelBuffer.readableBytes() != bs.length) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fail(&amp;quot;buffer does not have enough bytes&amp;quot;);
&lt;br&gt;+ &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;for(int i=0; i &amp;lt; bs.length; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(&amp;quot;byte at position &amp;quot; + i + &amp;quot; does not match&amp;quot;, bs[i], channelBuffer.getByte(i));
&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 createFullBuffer(int size, byte value) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer buffer = ChannelBuffers.buffer(size);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] contents = new byte[size];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; contents.length; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contents[i] = value;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer.writeBytes(contents);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return buffer;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NullChannelHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NullChannelHandler.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/NullChannelHandler.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,21 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelDownstreamHandler;
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&lt;br&gt;+import org.jboss.netty.channel.ChannelHandlerContext;
&lt;br&gt;+import org.jboss.netty.channel.ChannelUpstreamHandler;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=66&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class NullChannelHandler implements ChannelUpstreamHandler, ChannelDownstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
&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;public void handleDownstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendDownstream(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/ServerMessageSwitchTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,138 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.net.InetSocketAddress;
&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.Channel;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.handler.codec.http.HttpResponse;
&lt;br&gt;+import org.jmock.Expectations;
&lt;br&gt;+import org.jmock.integration.junit4.JMock;
&lt;br&gt;+import org.jmock.integration.junit4.JUnit4Mockery;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Ignore;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+import org.junit.runner.RunWith;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=67&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@RunWith(JMock.class)
&lt;br&gt;+@Ignore
&lt;br&gt;+public class ServerMessageSwitchTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final InetSocketAddress REMOTE_ADDRESS = InetSocketAddress.createUnresolved(&amp;quot;test.client.com&amp;quot;, 52354);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private JUnit4Mockery mockContext = new JUnit4Mockery();
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ServerMessageSwitch messageSwitch;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private HttpTunnelAcceptedChannelFactory newChannelFactory;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private UpstreamEventCatcher htunEventCatcher;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink responseCatcher;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel htunChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel requesterChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newChannelFactory = mockContext.mock(HttpTunnelAcceptedChannelFactory.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch = new ServerMessageSwitch(newChannelFactory);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final Channel htunAcceptedChannel = createTunnelChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;createRequesterChannel();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mockContext.checking(new Expectations() {{
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;one(newChannelFactory).newChannel(with(any(String.class)), with(equal(REMOTE_ADDRESS))); will(returnValue(htunAcceptedChannel));
&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 Channel createTunnelChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline acceptedChannelPipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;htunEventCatcher = new UpstreamEventCatcher();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;acceptedChannelPipeline.addLast(UpstreamEventCatcher.NAME, htunEventCatcher);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FakeSocketChannel htunAcceptedChannel = new FakeSocketChannel(null, null, acceptedChannelPipeline, new FakeChannelSink());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;htunEventCatcher.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return htunAcceptedChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel createRequesterChannel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline requesterChannelPipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;responseCatcher = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;requesterChannel = new FakeSocketChannel(null, null, requesterChannelPipeline, responseCatcher);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;responseCatcher.events.clear();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return requesterChannel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testRouteInboundData() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer inboundData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;inboundData.writeLong(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeInboundData(tunnelId, inboundData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, htunEventCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer receivedData = NettyTestUtils.checkIsUpstreamMessageEvent(htunEventCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(receivedData, inboundData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testRouteOutboundData_onPoll() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer outboundData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;outboundData.writeLong(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeOutboundData(tunnelId, outboundData, Channels.future(htunChannel));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.pollOutboundData(tunnelId, requesterChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, responseCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(responseCatcher.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(outboundData, response.getContent());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testRouteOutboundData_withDanglingRequest() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.pollOutboundData(tunnelId, requesterChannel);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, responseCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer outboundData = ChannelBuffers.dynamicBuffer();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;outboundData.writeLong(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeOutboundData(tunnelId, outboundData, Channels.future(htunChannel));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, responseCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpResponse response = NettyTestUtils.checkIsDownstreamMessageEvent(responseCatcher.events.poll(), HttpResponse.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(outboundData, response.getContent());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testCloseTunnel() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(messageSwitch.isOpenTunnel(tunnelId));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testRouteInboundDataIgnoredAfterClose() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = NettyTestUtils.createData(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeInboundData(tunnelId, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, htunEventCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testRouteOutboundDataIgnoredAfterClose() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = NettyTestUtils.createData(1234L);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String tunnelId = messageSwitch.createTunnel(REMOTE_ADDRESS);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.closeTunnel(tunnelId);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;messageSwitch.routeOutboundData(tunnelId, data, Channels.future(htunChannel));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(0, responseCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/UpstreamEventCatcher.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/UpstreamEventCatcher.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/UpstreamEventCatcher.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,24 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+import java.util.LinkedList;
&lt;br&gt;+import java.util.Queue;
&lt;br&gt;+
&lt;br&gt;+import org.jboss.netty.channel.ChannelEvent;
&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.ChannelUpstreamHandler;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=68&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;+public class UpstreamEventCatcher implements ChannelUpstreamHandler {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static final String NAME = &amp;quot;upstreamCatcher&amp;quot;;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public Queue&amp;lt;ChannelEvent&amp;gt; events = new LinkedList&amp;lt;ChannelEvent&amp;gt;();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;events.add(e);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&lt;br&gt;+}
&lt;br&gt;&lt;br&gt;Added: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenterTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenterTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteFragmenterTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,117 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&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.ChannelFuture;
&lt;br&gt;+import org.jboss.netty.channel.ChannelPipeline;
&lt;br&gt;+import org.jboss.netty.channel.Channels;
&lt;br&gt;+import org.jboss.netty.channel.MessageEvent;
&lt;br&gt;+import org.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+/**
&lt;br&gt;+ * @author &lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4050598&amp;i=69&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;
&lt;br&gt;+ */
&lt;br&gt;+public class WriteFragmenterTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeSocketChannel channel;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private WriteFragmenter fragmenter;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private FakeChannelSink downstreamCatcher;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fragmenter = new WriteFragmenter(100);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelPipeline pipeline = Channels.pipeline();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(WriteFragmenter.NAME, fragmenter);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;downstreamCatcher = new FakeChannelSink();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = new FakeSocketChannel(null, null, pipeline, downstreamCatcher); &amp;nbsp; 
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testLeavesWritesBeneathThresholdUntouched() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.wrappedBuffer(new byte[99]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, downstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer sentData = NettyTestUtils.checkIsDownstreamMessageEvent(downstreamCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(data, sentData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testLeavesMessagesOnThresholdUntouched() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.wrappedBuffer(new byte[100]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, downstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer sentData = NettyTestUtils.checkIsDownstreamMessageEvent(downstreamCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertSame(data, sentData);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplitsMessagesAboveThreshold_twoChunks() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.wrappedBuffer(new byte[101]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(2, downstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer chunk1 = NettyTestUtils.checkIsDownstreamMessageEvent(downstreamCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer chunk2 = NettyTestUtils.checkIsDownstreamMessageEvent(downstreamCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(100, chunk1.readableBytes());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, chunk2.readableBytes());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplitsMessagesAboveThreshold_multipleChunks() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.wrappedBuffer(new byte[2540]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channels.write(channel, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(26, downstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; 25; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer chunk = NettyTestUtils.checkIsDownstreamMessageEvent(downstreamCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(100, chunk.readableBytes());
&lt;br&gt;+ &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;ChannelBuffer endChunk = NettyTestUtils.checkIsDownstreamMessageEvent(downstreamCatcher.events.poll(), ChannelBuffer.class);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(40, endChunk.readableBytes());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChannelFutureTriggeredOnlyWhenAllChunksWritten() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.wrappedBuffer(new byte[2540]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture mainWriteFuture = Channels.write(channel, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(26, downstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; 25; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((MessageEvent) downstreamCatcher.events.poll()).getFuture().setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(mainWriteFuture.isDone());
&lt;br&gt;+ &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;((MessageEvent) downstreamCatcher.events.poll()).getFuture().setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(mainWriteFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(mainWriteFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testChannelFutureFailsOnFirstWriteFailure() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer data = ChannelBuffers.wrappedBuffer(new byte[2540]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture mainWriteFuture = Channels.write(channel, data);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(26, downstreamCatcher.events.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; 10; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;((MessageEvent) downstreamCatcher.events.poll()).getFuture().setSuccess();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(mainWriteFuture.isDone());
&lt;br&gt;+ &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;((MessageEvent) downstreamCatcher.events.poll()).getFuture().setFailure(new Exception(&amp;quot;Something bad happened&amp;quot;));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(mainWriteFuture.isDone());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertFalse(mainWriteFuture.isSuccess());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// check all the subsequent writes got cancelled
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; 15; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(((MessageEvent) downstreamCatcher.events.poll()).getFuture().isCancelled());
&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: branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitterTest.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitterTest.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/httptunnel/src/test/java/org/jboss/netty/channel/socket/httptunnel/WriteSplitterTest.java	2009-11-23 11:47:40 UTC (rev 1914)
&lt;br&gt;@@ -0,0 +1,81 @@
&lt;br&gt;+package org.jboss.netty.channel.socket.httptunnel;
&lt;br&gt;+
&lt;br&gt;+
&lt;br&gt;+import static org.junit.Assert.*;
&lt;br&gt;+
&lt;br&gt;+import java.util.List;
&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.junit.Before;
&lt;br&gt;+import org.junit.Test;
&lt;br&gt;+
&lt;br&gt;+public class WriteSplitterTest {
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private static final int SPLIT_THRESHOLD = 1024;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private WriteSplitter splitter;
&lt;br&gt;+
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Before
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void setUp() throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;splitter = new WriteSplitter(SPLIT_THRESHOLD);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplit_bufferUnderThreshold() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer buffer = createBufferWithContents(800);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(buffer);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(fragments);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, fragments.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplit_bufferMatchesThreshold() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer buffer = createBufferWithContents(SPLIT_THRESHOLD);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(buffer);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(fragments);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(1, fragments.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplit_bufferOverThreshold() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer buffer = createBufferWithContents((int)(SPLIT_THRESHOLD * 1.5));
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(buffer);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(fragments);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(2, fragments.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer fragment1 = fragments.get(0);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkMatches(buffer, fragment1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer fragment2 = fragments.get(1);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkMatches(buffer, fragment2);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;@Test
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public void testSplit_largeNumberOfFragments() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelBuffer buffer = createBufferWithContents(SPLIT_THRESHOLD * 250);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;ChannelBuffer&amp;gt; fragments = splitter.split(buffer);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertNotNull(fragments);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(250, fragments.size());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(ChannelBuffer fragment : fragments) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;checkMatches(buffer, fragment);
&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 checkMatches(ChannelBuffer mainBuffer, ChannelBuffer fragment) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertTrue(mainBuffer.readableBytes() &amp;gt;= fragment.readableBytes());
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;while(fragment.readable()) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;assertEquals(mainBuffer.readByte(), fragment.readByte());
&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 createBufferWithContents(int size) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;byte[] contents = new byte[size];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for(int i=0; i &amp;lt; contents.length; i++) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;contents[i] = (byte)(i % 10);
&lt;br&gt;+ &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;return ChannelBuffers.copiedBuffer(contents);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;}
&lt;br&gt;+
&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=4050598&amp;i=70&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/r1914-in-branches-httptunnel-src-main-java-org-jboss-netty-channel-socket-and-3-other-directories-tp4050598p4050598.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4050453</id>
	<title>r1913 - branches.</title>
	<published>2009-11-23T03:13:48Z</published>
	<updated>2009-11-23T03:13:48Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 06:13:48 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1913
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httptunnel/
&lt;br&gt;Log:
&lt;br&gt;Created a branch for the HTTP tunneling transport
&lt;br&gt;&lt;br&gt;Copied: branches/httptunnel (from rev 1910, trunk)
&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=4050453&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/r1913-branches-tp4050453p4050453.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4049225</id>
	<title>r1910 - trunk/src/test/java/org/jboss/netty/util/internal.</title>
	<published>2009-11-22T21:38:50Z</published>
	<updated>2009-11-22T21:38:50Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 00:38:50 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1910
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/test/java/org/jboss/netty/util/internal/StringUtilTest.java
&lt;br&gt;Log:
&lt;br&gt;Set svn properties
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/test/java/org/jboss/netty/util/internal/StringUtilTest.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=4049225&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/r1910-trunk-src-test-java-org-jboss-netty-util-internal-tp4049225p4049225.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4049223</id>
	<title>r1909 - trunk/src/main/java/org/jboss/netty/channel/xnio.</title>
	<published>2009-11-22T21:37:57Z</published>
	<updated>2009-11-22T21:37:57Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 00:37:56 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1909
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/channel/xnio/BaseXnioChannel.java
&lt;br&gt;Log:
&lt;br&gt;Set svn properties
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/channel/xnio/BaseXnioChannel.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/channel/xnio/BaseXnioChannel.java	2009-11-23 05:37:35 UTC (rev 1908)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/channel/xnio/BaseXnioChannel.java	2009-11-23 05:37:56 UTC (rev 1909)
&lt;br&gt;@@ -41,7 +41,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=4049223&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=4049223&amp;i=1&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;- * @version $Rev: 937 $, $Date: 2009-02-25 19:43:03 +0900 (Wed, 25 Feb 2009) $
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@SuppressWarnings(&amp;quot;unchecked&amp;quot;)
&lt;br&gt;&amp;nbsp;class BaseXnioChannel extends AbstractChannel implements XnioChannel {
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/channel/xnio/BaseXnioChannel.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=4049223&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/r1909-trunk-src-main-java-org-jboss-netty-channel-xnio-tp4049223p4049223.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4049220</id>
	<title>r1908 - in trunk/src/main/java/org/jboss/netty/example: uptime and 1 other directory.</title>
	<published>2009-11-22T21:37:35Z</published>
	<updated>2009-11-22T21:37:35Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 00:37:35 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1908
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/echo/EchoServerHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClient.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClientHandler.java
&lt;br&gt;Log:
&lt;br&gt;Set svn properties
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/example/echo/EchoServerHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/echo/EchoServerHandler.java	2009-11-23 05:37:07 UTC (rev 1907)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/echo/EchoServerHandler.java	2009-11-23 05:37:35 UTC (rev 1908)
&lt;br&gt;@@ -32,7 +32,7 @@
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4049220&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=4049220&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;- * @version $Rev: 1685 $, $Date: 2009-08-28 16:15:49 +0900 (Fri, 28 Aug 2009) $
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;all&amp;quot;)
&lt;br&gt;&amp;nbsp;public class EchoServerHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/example/echo/EchoServerHandler.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/example/uptime/UptimeClient.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClient.java	2009-11-23 05:37:07 UTC (rev 1907)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClient.java	2009-11-23 05:37:35 UTC (rev 1908)
&lt;br&gt;@@ -33,7 +33,7 @@
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4049220&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=4049220&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;- * @version $Rev: 1685 $, $Date: 2009-08-28 16:15:49 +0900 (Fri, 28 Aug 2009) $
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public class UptimeClient {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClient.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/example/uptime/UptimeClientHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClientHandler.java	2009-11-23 05:37:07 UTC (rev 1907)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClientHandler.java	2009-11-23 05:37:35 UTC (rev 1908)
&lt;br&gt;@@ -36,7 +36,7 @@
&lt;br&gt;&amp;nbsp; * @author The Netty Project (&lt;a href=&quot;http://n2.nabble.com/user/SendEmail.jtp?type=node&amp;node=4049220&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=4049220&amp;i=5&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * @version $Rev: 1685 $, $Date: 2009-08-28 16:15:49 +0900 (Fri, 28 Aug 2009) $
&lt;br&gt;+ * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;@ChannelPipelineCoverage(&amp;quot;one&amp;quot;)
&lt;br&gt;&amp;nbsp;public class UptimeClientHandler extends SimpleChannelUpstreamHandler {
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/example/uptime/UptimeClientHandler.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=4049220&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/r1908-in-trunk-src-main-java-org-jboss-netty-example-uptime-and-1-other-directory-tp4049220p4049220.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4049219</id>
	<title>r1907 - trunk/src/main/java/org/jboss/netty/handler/codec/base64.</title>
	<published>2009-11-22T21:37:07Z</published>
	<updated>2009-11-22T21:37:07Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 00:37:07 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1907
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java
&lt;br&gt;Log:
&lt;br&gt;Removed a tab
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java	2009-11-23 05:35:43 UTC (rev 1906)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/base64/Base64.java	2009-11-23 05:37:07 UTC (rev 1907)
&lt;br&gt;@@ -360,7 +360,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Example: DkLE
&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;	int outBuff;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int outBuff;
&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;outBuff =
&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;(DECODABET[src[srcOffset &amp;nbsp; &amp;nbsp;]] &amp; 0xFF) &amp;lt;&amp;lt; 18 |
&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=4049219&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/r1907-trunk-src-main-java-org-jboss-netty-handler-codec-base64-tp4049219p4049219.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4049217</id>
	<title>r1906 - trunk/src/main/java/org/jboss/netty/handler/timeout.</title>
	<published>2009-11-22T21:35:44Z</published>
	<updated>2009-11-22T21:35:44Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 00:35:43 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1906
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/timeout/DefaultIdleStateEvent.java
&lt;br&gt;Log:
&lt;br&gt;Set svn properties
&lt;br&gt;&lt;br&gt;&lt;br&gt;Property changes on: trunk/src/main/java/org/jboss/netty/handler/timeout/DefaultIdleStateEvent.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=4049217&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/r1906-trunk-src-main-java-org-jboss-netty-handler-timeout-tp4049217p4049217.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4049215</id>
	<title>r1905 - trunk/src/main/java/org/jboss/netty/util/internal/jzlib.</title>
	<published>2009-11-22T21:34:22Z</published>
	<updated>2009-11-22T21:34:22Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-23 00:34:22 -0500 (Mon, 23 Nov 2009)
&lt;br&gt;New Revision: 1905
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java
&lt;br&gt;Log:
&lt;br&gt;Removed a tab
&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-22 11:06:50 UTC (rev 1904)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/util/internal/jzlib/Deflate.java	2009-11-23 05:34:22 UTC (rev 1905)
&lt;br&gt;@@ -984,7 +984,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ins_h = (ins_h &amp;lt;&amp;lt; hash_shift ^ window[strstart + MIN_MATCH - 1] &amp; 0xff) &amp;
&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;hash_mask;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//	prev[strstart&amp;w_mask]=hash_head=head[ins_h];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// prev[strstart&amp;w_mask]=hash_head=head[ins_h];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hash_head = head[ins_h] &amp; 0xffff;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prev[strstart &amp; w_mask] = head[ins_h];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;head[ins_h] = (short) strstart;
&lt;br&gt;@@ -1021,7 +1021,7 @@
&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;ins_h = (ins_h &amp;lt;&amp;lt; hash_shift ^ window[strstart +
&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;MIN_MATCH - 1] &amp; 0xff) &amp;
&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;hash_mask;
&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;prev[strstart&amp;w_mask]=hash_head=head[ins_h];
&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;prev[strstart&amp;w_mask]=hash_head=head[ins_h];
&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;hash_head = head[ins_h] &amp; 0xffff;
&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;prev[strstart &amp; w_mask] = head[ins_h];
&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;head[ins_h] = (short) strstart;
&lt;br&gt;@@ -1098,7 +1098,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (lookahead &amp;gt;= MIN_MATCH) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ins_h = (ins_h &amp;lt;&amp;lt; hash_shift ^ window[strstart + MIN_MATCH - 1] &amp; 0xff) &amp;
&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;hash_mask;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//	prev[strstart&amp;w_mask]=hash_head=head[ins_h];
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp; &amp;nbsp;prev[strstart&amp;w_mask]=hash_head=head[ins_h];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;hash_head = head[ins_h] &amp; 0xffff;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;prev[strstart &amp; w_mask] = head[ins_h];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;head[ins_h] = (short) strstart;
&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=4049215&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/r1905-trunk-src-main-java-org-jboss-netty-util-internal-jzlib-tp4049215p4049215.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4045776</id>
	<title>r1904 - branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-22T03:06:50Z</published>
	<updated>2009-11-22T03:06:50Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: fredbregier
&lt;br&gt;Date: 2009-11-22 06:06:50 -0500 (Sun, 22 Nov 2009)
&lt;br&gt;New Revision: 1904
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java
&lt;br&gt;Log:
&lt;br&gt;Fix from trunk the common http codec (last one was message doesn't need to be protected)
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java	2009-11-21 15:51:21 UTC (rev 1903)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java	2009-11-22 11:06:50 UTC (rev 1904)
&lt;br&gt;@@ -109,7 +109,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxInitialLineLength;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxHeaderSize;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxChunkSize;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected volatile HttpMessage message;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile HttpMessage message;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile ChannelBuffer content;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile long chunkSize;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int headerSize;
&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=4045776&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/r1904-branches-httpPost-src-main-java-org-jboss-netty-handler-codec-http-tp4045776p4045776.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4042968</id>
	<title>r1903 - trunk/src/main/java/org/jboss/netty/handler/codec/http.</title>
	<published>2009-11-21T07:51:21Z</published>
	<updated>2009-11-21T07:51:21Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: trustin
&lt;br&gt;Date: 2009-11-21 10:51:21 -0500 (Sat, 21 Nov 2009)
&lt;br&gt;New Revision: 1903
&lt;br&gt;&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java
&lt;br&gt;Log:
&lt;br&gt;HttpMessageDecoder.message doesn't need to be 'protected'
&lt;br&gt;&lt;br&gt;Modified: trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java
&lt;br&gt;===================================================================
&lt;br&gt;--- trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;+++ trunk/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java	2009-11-21 15:51:21 UTC (rev 1903)
&lt;br&gt;@@ -109,7 +109,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxInitialLineLength;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxHeaderSize;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final int maxChunkSize;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;protected volatile HttpMessage message;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private volatile HttpMessage message;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile ChannelBuffer content;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private volatile long chunkSize;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private int headerSize;
&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=4042968&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/r1903-trunk-src-main-java-org-jboss-netty-handler-codec-http-tp4042968p4042968.html" />
	
</entry>

<entry>
	<id>tag:n2.nabble.com,2006:post-4042358</id>
	<title>r1902 - in branches/httpPost: src/docbook/en-US and 14 other directories.</title>
	<published>2009-11-21T03:56:43Z</published>
	<updated>2009-11-21T03:56:43Z</updated>
	<author>
		<name>Netty Commit Logs mailing list</name>
	</author>
	<content type="html">Author: fredbregier
&lt;br&gt;Date: 2009-11-21 06:56:42 -0500 (Sat, 21 Nov 2009)
&lt;br&gt;New Revision: 1902
&lt;br&gt;&lt;br&gt;Added:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/HttpClient.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/HttpClientPipelineFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/HttpRequestHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/HttpResponseHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/HttpServer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoopPost/HttpServerPipelineFactory.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/DefaultHttpChunkTrailer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpChunkTrailer.java
&lt;br&gt;Removed:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpDecompressionHandler.java
&lt;br&gt;Modified:
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/pom.xml
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/docbook/en-US/master.xml
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/javadoc/overview.html
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/buffer/DynamicChannelBuffer.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/Channels.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultServerChannelConfig.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingSocketChannelConfig.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/NioClientSocketPipelineSink.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/example/http/snoop/HttpClient.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/HttpRequestHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpResponseHandler.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpServer.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/handler/codec/base64/Base64Encoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/CookieDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/DefaultHttpChunk.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/DefaultHttpMessage.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/DefaultHttpRequest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/DefaultHttpResponse.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpChunk.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpChunkAggregator.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpCodecUtil.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpHeaders.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessage.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageDecoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpMessageEncoder.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpRequest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/main/java/org/jboss/netty/handler/codec/http/HttpResponse.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/test/java/org/jboss/netty/buffer/DynamicChannelBufferTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/test/java/org/jboss/netty/handler/codec/frame/AbstractSocketFixedLengthEchoTest.java
&lt;br&gt;&amp;nbsp; &amp;nbsp;branches/httpPost/src/test/java/org/jboss/netty/handler/codec/http/CookieDecoderTest.java
&lt;br&gt;Log:
&lt;br&gt;Fix to last version of Netty
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/pom.xml
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/pom.xml	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/pom.xml	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -20,7 +20,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.jboss.netty&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;netty&amp;lt;/artifactId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;packaging&amp;gt;bundle&amp;lt;/packaging&amp;gt;
&lt;br&gt;- &amp;nbsp;&amp;lt;version&amp;gt;3.2.0.ALPHA1-SNAPSHOT&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp;&amp;lt;version&amp;gt;3.2.0.ALPHA2-SNAPSHOT&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;name&amp;gt;The Netty Project&amp;lt;/name&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;url&amp;gt;&lt;a href=&quot;http://www.jboss.org/netty/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.jboss.org/netty/&lt;/a&gt;&amp;lt;/url&amp;gt;
&lt;br&gt;@@ -90,21 +90,21 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.jboss.microcontainer&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;jboss-kernel&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.0.8.GA&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.0.9.GA&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;org.osgi.core&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;1.4.0&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;org.osgi.compendium&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;1.2.0&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;1.4.0&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;exclusions&amp;gt;
&lt;br&gt;@@ -151,7 +151,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.jboss.logging&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;jboss-logging-spi&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.0.5.GA&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.1.0.GA&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;compile&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;@@ -185,13 +185,13 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;4.6&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;4.7&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.easymock&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;easymock&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.4&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.5.2&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/dependency&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;dependency&amp;gt;
&lt;br&gt;@@ -228,7 +228,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;maven-resources-plugin&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.3&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.4.1&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;configuration&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;encoding&amp;gt;UTF-8&amp;lt;/encoding&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/configuration&amp;gt;
&lt;br&gt;@@ -264,7 +264,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;groupId&amp;gt;org.apache.felix&amp;lt;/groupId&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;maven-bundle-plugin&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.0.0&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.0.1&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;extensions&amp;gt;true&amp;lt;/extensions&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;configuration&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;instructions&amp;gt;
&lt;br&gt;@@ -291,7 +291,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;maven-source-plugin&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.1&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.1.1&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;executions&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;execution&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;id&amp;gt;attach-source&amp;lt;/id&amp;gt;
&lt;br&gt;@@ -402,7 +402,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;/plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;plugin&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;artifactId&amp;gt;maven-javadoc-plugin&amp;lt;/artifactId&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;version&amp;gt;2.6.1&amp;lt;/version&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;executions&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;execution&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;id&amp;gt;generate-javadoc&amp;lt;/id&amp;gt;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/docbook/en-US/master.xml
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/docbook/en-US/master.xml	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/docbook/en-US/master.xml	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -16,11 +16,11 @@
&lt;br&gt;&amp;nbsp;--&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;!DOCTYPE chapter PUBLIC &amp;quot;-//OASIS//DTD DocBook XML V4.5//EN&amp;quot; &amp;quot;&lt;a href=&quot;http://www.docbook.org/xml/4.5/docbookx.dtd&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.docbook.org/xml/4.5/docbookx.dtd&lt;/a&gt;&amp;quot; [
&lt;br&gt;&amp;nbsp;&amp;lt;!ENTITY % CustomDTD SYSTEM &amp;quot;custom.dtd&amp;quot;&amp;gt;
&lt;br&gt;-%CustomDTD; 
&lt;br&gt;+%CustomDTD;
&lt;br&gt;&amp;nbsp;]&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;book lang=&amp;quot;en&amp;quot;&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;bookinfo&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;The Netty Project 3.1 User Guide&amp;lt;/title&amp;gt;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;The Netty Project 3.2 User Guide&amp;lt;/title&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;subtitle&amp;gt;The Proven Approach to Rapid Network Application Development&amp;lt;/subtitle&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;releaseinfo&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;!-- The version.txt file is generated by maven-antrun-plugin. --&amp;gt;
&lt;br&gt;@@ -44,19 +44,19 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;!--
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;xi:include href=&amp;quot;module/state-mgmt.xml&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt;
&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;lt;xi:include href=&amp;quot;module/codec.xml&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt;
&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;lt;xi:include href=&amp;quot;module/threading.xml&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt;
&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;lt;xi:include href=&amp;quot;module/security.xml&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt;
&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;lt;xi:include href=&amp;quot;module/transport.xml&amp;quot;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt; 
&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;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt;
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;xi:include href=&amp;quot;module/appendix.xml&amp;quot;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;xmlns:xi=&amp;quot;&lt;a href=&quot;http://www.w3.org/2001/XInclude&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.w3.org/2001/XInclude&lt;/a&gt;&amp;quot; /&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp;--&amp;gt;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/javadoc/overview.html
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/javadoc/overview.html	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/javadoc/overview.html	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -18,7 +18,7 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp;&amp;lt;title&amp;gt;The Netty Project API Reference&amp;lt;/title&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;/head&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;body&amp;gt;
&lt;br&gt;-&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&lt;a href=&quot;http://www.jboss.org/file-access/default/members/netty/freezone/guide/3.1/html/images/architecture.png&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.jboss.org/file-access/default/members/netty/freezone/guide/3.1/html/images/architecture.png&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;br&gt;+&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;&lt;a href=&quot;http://www.jboss.org/file-access/default/members/netty/freezone/guide/3.2/html/images/architecture.png&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.jboss.org/file-access/default/members/netty/freezone/guide/3.2/html/images/architecture.png&lt;/a&gt;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;p style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;&lt;a href=&quot;http://www.jboss.org/netty/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.jboss.org/netty/&lt;/a&gt;&amp;quot; target=&amp;quot;_top&amp;quot;&amp;gt;&amp;lt;em&amp;gt;The Netty project&amp;lt;/em&amp;gt;&amp;lt;/a&amp;gt; is an effort to provide an asynchronous event-driven network application framework and tools for rapid development of maintainable high performance and high scalability protocol servers and clients&amp;#46; &amp;nbsp;In other words, Netty is a NIO client server framework which enables quick and easy development of network applications such as protocol servers and clients&amp;#46; &amp;nbsp;It greatly simplifies and streamlines network programming such as TCP/IP socket server&amp;#46;&amp;lt;/p&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;/body&amp;gt;
&lt;br&gt;&amp;nbsp;&amp;lt;/html&amp;gt;
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/buffer/DynamicChannelBuffer.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/buffer/DynamicChannelBuffer.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/buffer/DynamicChannelBuffer.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -38,9 +38,8 @@
&lt;br&gt;&amp;nbsp;public class DynamicChannelBuffer extends AbstractChannelBuffer {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ChannelBufferFactory factory;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private final int initialCapacity;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private final ByteOrder endianness;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private ChannelBuffer buffer = ChannelBuffers.EMPTY_BUFFER;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;private ChannelBuffer buffer;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public DynamicChannelBuffer(int estimatedLength) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this(ByteOrder.BIG_ENDIAN, estimatedLength);
&lt;br&gt;@@ -61,8 +60,8 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new NullPointerException(&amp;quot;factory&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.factory = factory;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;initialCapacity = estimatedLength;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;this.endianness = endianness;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;buffer = factory.getBuffer(order(), estimatedLength);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public ChannelBufferFactory factory() {
&lt;br&gt;@@ -268,10 +267,7 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int newCapacity;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (capacity() == 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newCapacity = initialCapacity;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (newCapacity == 0) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;newCapacity = 1;
&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;newCapacity = 1;
&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; &amp;nbsp;newCapacity = capacity();
&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/channel/ChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelConfig.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/ChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -15,7 +15,6 @@
&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.IOException;
&lt;br&gt;&amp;nbsp;import java.nio.ByteOrder;
&lt;br&gt;&amp;nbsp;import java.util.Map;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -24,7 +23,6 @@
&lt;br&gt;&amp;nbsp;import org.jboss.netty.buffer.HeapChannelBufferFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.nio.NioSocketChannelConfig;
&lt;br&gt;-import org.jboss.netty.handler.timeout.WriteTimeoutHandler;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * A set of configuration properties of a {@link Channel}.
&lt;br&gt;@@ -151,33 +149,4 @@
&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; {@code 0} to disable.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;void setConnectTimeoutMillis(int connectTimeoutMillis);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Use {@link WriteTimeoutHandler} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Returns the write timeout of the channel in milliseconds. &amp;nbsp;If a write
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * operation is not completed within the write timeout, an
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link IOException} will be raised. &amp;nbsp;If the {@link Channel} does not
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * support write operation, this property is not used at all, and therefore
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * will be ignored.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @return the write timeout in milliseconds. &amp;nbsp;{@code 0} if disabled.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;int getWriteTimeoutMillis();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Use {@link WriteTimeoutHandler} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sets the write timeout of the channel in milliseconds. &amp;nbsp;If a write
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * operation is not completed within the write timeout, an
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link IOException} will be raised. &amp;nbsp;If the {@link Channel} does not
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * support write operation, this property is not used at all, and therefore
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * will be ignored.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param writeTimeoutMillis the write timeout in milliseconds.
&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; {@code 0} to disable.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;void setWriteTimeoutMillis(int writeTimeoutMillis);
&lt;br&gt;&amp;nbsp;}
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/Channels.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/Channels.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/Channels.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -134,45 +134,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new FailedChannelFuture(channel, cause);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;// event factory methods
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Instantiate {@link UpstreamMessageEvent} or {@link DownstreamMessageEvent} directly instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Creates a new {@link MessageEvent}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel which is associated with the event
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when a message is sent
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(only meaningful when the event is sent downstream)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param message the received or sent message object
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;('received' when the event is sent upstream, and
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'sent' when the event is sent downstream)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static MessageEvent messageEvent(Channel channel, ChannelFuture future, Object message) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return messageEvent(channel, future, message, null);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Instantiate {@link UpstreamMessageEvent} or {@link DownstreamMessageEvent} directly instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Creates a new {@link MessageEvent}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel which is associated with the event
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when a message is sent
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;(only meaningful when the event is sent downstream)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param message the received or sent message object
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;('received' when the event is sent upstream, and
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 'sent' when the event is sent downstream)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param remoteAddress the source or destination address of the message
&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;('source' when the event is sent upstream, and
&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; 'destination' when the event is sent downstream)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static MessageEvent messageEvent(Channel channel, ChannelFuture future, Object message, SocketAddress remoteAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return new DownstreamMessageEvent(channel, future, message, remoteAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;// event emission methods
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;@@ -208,25 +169,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; * @deprecated Use {@link #fireChannelOpen(ChannelHandlerContext)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelOpen&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;lt;p&amp;gt;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Please note that this method does not trigger a
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@code &amp;quot;childChannelOpen&amp;quot;} event unlike {@link #fireChannelOpen(Channel)}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * method.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelOpen(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelOpen(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelBound&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -255,25 +197,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; * @deprecated Use {@link #fireChannelBound(ChannelHandlerContext, SocketAddress)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelBound&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param localAddress
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the local address where the specified channel is bound
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelBound(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress localAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelBound(ctx, localAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelConnected&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -303,25 +226,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; * @deprecated Use {@link #fireChannelConnected(ChannelHandlerContext, SocketAddress)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelConnected&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param remoteAddress
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the remote address where the specified channel is connected
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelConnected(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress remoteAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelConnected(ctx, remoteAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;messageReceived&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -359,29 +263,11 @@
&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; * @deprecated Use {@link #fireMessageReceived(ChannelHandlerContext, Object)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;messageReceived&amp;quot;} event to the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param message &amp;nbsp;the received message
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireMessageReceived(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object message) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireMessageReceived(ctx, message);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;messageReceived&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param message &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the received message
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * @param remoteAddress &amp;nbsp;the remote address where the received message
&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; came from
&lt;br&gt;@@ -393,26 +279,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; * @deprecated Use {@link #fireMessageReceived(ChannelHandlerContext, Object, SocketAddress)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;messageReceived&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param message &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;the received message
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param remoteAddress &amp;nbsp;the remote address where the received message
&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; came from
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireMessageReceived(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Object message, SocketAddress remoteAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireMessageReceived(ctx, message, remoteAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;writeComplete&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -448,20 +314,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; * @deprecated Use {@link #fireChannelInterestChanged(Channel)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelInterestChanged&amp;quot;} event to the first
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param interestOps the new interestOps
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelInterestChanged(Channel channel, int interestOps) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelInterestChanged(channel);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelInterestChanged&amp;quot;} event to the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;@@ -476,24 +328,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; * @deprecated Use {@link #fireChannelInterestChanged(ChannelHandlerContext)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelInterestChanged&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel &amp;nbsp; &amp;nbsp; the {@link Channel}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param interestOps the new interestOps
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelInterestChanged(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel, int interestOps) {
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelInterestChanged(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelDisconnected&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -516,21 +350,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; * @deprecated Use {@link #fireChannelDisconnected(ChannelHandlerContext)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelDisconnected&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelDisconnected(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelDisconnected(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelUnbound&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -553,21 +372,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; * @deprecated Use {@link #fireChannelUnbound(ChannelHandlerContext)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelUnbound&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelUnbound(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelUnbound(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelClosed&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -596,21 +400,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; * @deprecated Use {@link #fireChannelClosed(ChannelHandlerContext)}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;channelClosed&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireChannelClosed(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireChannelClosed(ctx);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;exceptionCaught&amp;quot;} event to the first
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -630,22 +419,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.sendUpstream(new DefaultExceptionEvent(ctx.getChannel(), cause));
&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; * @deprecated Use {@link #fireExceptionCaught(ChannelHandlerContext, Throwable)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;exceptionCaught&amp;quot;} event to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelUpstreamHandler} which is placed in the closest upstream
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void fireExceptionCaught(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;@SuppressWarnings(&amp;quot;unused&amp;quot;) Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Throwable cause) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireExceptionCaught(ctx, cause);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static void fireChildChannelStateChanged(
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel channel, Channel childChannel) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.getPipeline().sendUpstream(
&lt;br&gt;@@ -694,27 +467,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; * @deprecated Use {@link #bind(ChannelHandlerContext, ChannelFuture, SocketAddress)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;bind&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to bind
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when the bind
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;operation is done
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param localAddress the local address to bind to
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void bind(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture future, SocketAddress localAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bind(ctx, future, localAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;unbind&amp;quot;} request to the
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;@@ -730,25 +482,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; * @deprecated Use {@link #unbind(ChannelHandlerContext, ChannelFuture)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;unbind&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to unbind
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when the unbind
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;operation is done
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void unbind(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel, ChannelFuture future) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;unbind(ctx, future);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;unbind&amp;quot;} request to the last
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -807,27 +540,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; * @deprecated Use {@link #connect(ChannelHandlerContext, ChannelFuture, SocketAddress)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;connect&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to attempt a connection
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when the connection
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;attempt is done
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param remoteAddress the remote address to connect to
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void connect(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture future, SocketAddress remoteAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;connect(ctx, future, remoteAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;write&amp;quot;} request to the last
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -858,26 +570,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; * @deprecated Use {@link #write(ChannelHandlerContext, ChannelFuture, Object)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;write&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to write a message
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when the write
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;operation is done
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void write(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture future, Object message) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;write(ctx, future, message, null);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;write&amp;quot;} request to the last
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -918,29 +610,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; * @deprecated Use {@link #write(ChannelHandlerContext, ChannelFuture, Object, SocketAddress)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;write&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to write a message
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when the write
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;operation is done
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param message the message to write to the channel
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param remoteAddress &amp;nbsp;the destination of the message.
&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; {@code null} to use the default remote address.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void write(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture future, Object message, SocketAddress remoteAddress) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;write(ctx, future, message, remoteAddress);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;setInterestOps&amp;quot;} request to the last
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -983,26 +652,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; * @deprecated Use {@link #setInterestOps(ChannelHandlerContext, ChannelFuture, int)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;setInterestOps&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to change the interestOps
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified when the interestOps is
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;changed.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void setInterestOps(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture future, int interestOps) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setInterestOps(ctx, future, interestOps);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;disconnect&amp;quot;} request to the last
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -1034,24 +683,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; * @deprecated Use {@link #disconnect(ChannelHandlerContext, ChannelFuture)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;disconnect&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to disconnect
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified on disconnection
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void disconnect(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel, ChannelFuture future) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;disconnect(ctx, future);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;close&amp;quot;} request to the last
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} in the {@link ChannelPipeline} of
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; * the specified {@link Channel}.
&lt;br&gt;@@ -1082,24 +713,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ctx.getChannel(), future, ChannelState.OPEN, Boolean.FALSE));
&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; * @deprecated Use {@link #close(ChannelHandlerContext, ChannelFuture)} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sends a {@code &amp;quot;close&amp;quot;} request to the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelDownstreamHandler} which is placed in the closest
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * downstream from the handler associated with the specified
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@link ChannelHandlerContext}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param ctx &amp;nbsp; &amp;nbsp; the context
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param channel the channel to close
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @param future &amp;nbsp;the future which will be notified on closure
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void close(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelHandlerContext ctx, Channel channel, ChannelFuture future) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;close(ctx, future);
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private static void validateInterestOps(int interestOps) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;switch (interestOps) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;case Channel.OP_NONE:
&lt;br&gt;&lt;br&gt;Modified: branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultChannelConfig.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -21,7 +21,6 @@
&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;&amp;nbsp;import org.jboss.netty.channel.socket.SocketChannelConfig;
&lt;br&gt;-import org.jboss.netty.handler.timeout.WriteTimeoutHandler;
&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;@@ -83,14 +82,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return null;
&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; * @deprecated Use {@link WriteTimeoutHandler} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public int getWriteTimeoutMillis() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setConnectTimeoutMillis(int connectTimeoutMillis) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (connectTimeoutMillis &amp;lt; 0) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;throw new IllegalArgumentException(&amp;quot;connectTimeoutMillis: &amp;quot; + connectTimeoutMillis);
&lt;br&gt;@@ -101,12 +92,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setPipelineFactory(ChannelPipelineFactory pipelineFactory) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Unused
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Use {@link WriteTimeoutHandler} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setWriteTimeoutMillis(int writeTimeoutMillis) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Unused
&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/DefaultServerChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultServerChannelConfig.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/DefaultServerChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -21,7 +21,6 @@
&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;&amp;nbsp;import org.jboss.netty.channel.socket.ServerSocketChannelConfig;
&lt;br&gt;-import org.jboss.netty.handler.timeout.WriteTimeoutHandler;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;&amp;nbsp; * The default {@link ServerSocketChannelConfig} implementation.
&lt;br&gt;@@ -94,20 +93,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setConnectTimeoutMillis(int connectTimeoutMillis) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Unused
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Use {@link WriteTimeoutHandler} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public int getWriteTimeoutMillis() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated Use {@link WriteTimeoutHandler} instead.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setWriteTimeoutMillis(int writeTimeoutMillis) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Unused
&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/HttpTunnelingSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingSocketChannelConfig.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/http/HttpTunnelingSocketChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -310,11 +310,6 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return channel.realChannel.getConfig().getPipelineFactory();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public int getWriteTimeoutMillis() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return channel.realChannel.getConfig().getWriteTimeoutMillis();
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setBufferFactory(ChannelBufferFactory bufferFactory) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.realChannel.getConfig().setBufferFactory(bufferFactory);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -326,9 +321,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setPipelineFactory(ChannelPipelineFactory pipelineFactory) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.realChannel.getConfig().setPipelineFactory(pipelineFactory);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setWriteTimeoutMillis(int writeTimeoutMillis) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.realChannel.getConfig().setWriteTimeoutMillis(writeTimeoutMillis);
&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/nio/DefaultNioSocketChannelConfig.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/DefaultNioSocketChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -75,9 +75,7 @@
&lt;br&gt;&amp;nbsp; &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; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (key.equals(&amp;quot;readWriteFair&amp;quot;)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setReadWriteFair(true); // Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;writeBufferHighWaterMark&amp;quot;)) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (key.equals(&amp;quot;writeBufferHighWaterMark&amp;quot;)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setWriteBufferHighWaterMark0(ConversionUtil.toInt(value));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} else if (key.equals(&amp;quot;writeBufferLowWaterMark&amp;quot;)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;setWriteBufferLowWaterMark0(ConversionUtil.toInt(value));
&lt;br&gt;@@ -180,15 +178,4 @@
&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.predictorFactory = predictorFactory;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public boolean isReadWriteFair() {
&lt;br&gt;- &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;quot;Detected an access to a deprecated configuration parameter: &amp;quot; +
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;readWriteFair&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return true;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setReadWriteFair(boolean readWriteFair) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;isReadWriteFair();
&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/nio/NioClientSocketPipelineSink.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioClientSocketPipelineSink.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -133,20 +133,29 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;private void connect(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final NioClientSocketChannel channel, ChannelFuture future,
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final NioClientSocketChannel channel, final ChannelFuture cf,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;SocketAddress remoteAddress) {
&lt;br&gt;&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;if (channel.socket.connect(remoteAddress)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.worker.register(channel, future);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.worker.register(channel, cf);
&lt;br&gt;&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;future.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.connectFuture = future;
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.getCloseFuture().addListener(new ChannelFutureListener() {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;public void operationComplete(ChannelFuture f)
&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;throws Exception {
&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 (!cf.isDone()) {
&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;cf.setFailure(new ClosedChannelException());
&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; &amp;nbsp; &amp;nbsp;cf.addListener(ChannelFutureListener.CLOSE_ON_FAILURE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.connectFuture = cf;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boss.register(channel);
&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;} catch (Throwable t) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.setFailure(t);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cf.setFailure(t);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireExceptionCaught(channel, t);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioWorker.close(channel, succeededFuture(channel));
&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;@@ -363,7 +372,7 @@
&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;ch.connectFuture.setFailure(cause);
&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;fireExceptionCaught(ch, cause);
&lt;br&gt;- &amp;nbsp; &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; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioWorker.close(ch, succeededFuture(ch));
&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;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;@@ -378,13 +387,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (Throwable t) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ch.connectFuture.setFailure(t);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fireExceptionCaught(ch, t);
&lt;br&gt;- &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; &amp;nbsp;NioWorker.close(ch, succeededFuture(ch));
&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;}
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;private void close(SelectionKey k) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;k.cancel();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioSocketChannel ch = (NioSocketChannel) k.attachment();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioClientSocketChannel ch = (NioClientSocketChannel) k.attachment();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioWorker.close(ch, succeededFuture(ch));
&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;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-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioDatagramWorker.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -653,26 +653,12 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;static void close(final NioDatagramChannel channel,
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;final ChannelFuture future) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioDatagramWorker worker = channel.worker;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Selector selector = worker.selector;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean connected = channel.isConnected();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean bound = channel.isBound();
&lt;br&gt;&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;// It is necessary to cancel all keys before closing a socket
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// because the shutdown flag in the Selector loop is set only when
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// all keys are cancelled. &amp;nbsp;Thus, DatagramChannel.close() and
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// SelectionKey.cancel() must be placed in a synchronized block.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Otherwise DatagramChannel.register() in RegisterTask can be called
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// after cancel(), but before close(), resulting in the infinite
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Selector loop that refuses to shut down due to the dangling keys.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;synchronized (channel.interestOpsLock) {
&lt;br&gt;- &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;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;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;}
&lt;br&gt;- &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;}
&lt;br&gt;+ &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;worker.cancelledKeys ++;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (channel.setClosed()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.setSuccess();
&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-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioSocketChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -49,8 +49,6 @@
&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;nbsp; * &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;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;&amp;nbsp; *
&lt;br&gt;@@ -147,32 +145,4 @@
&lt;br&gt;&amp;nbsp; &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; &amp;nbsp; */
&lt;br&gt;&amp;nbsp; &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; * @deprecated This property has been replaced by the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@code writeBufferHighWaterMark} and {@code writeBufferLowWaterMark}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Returns {@code true} if and only if an I/O thread should do its effort
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * to balance the ratio of read and write operations. &amp;nbsp;Assuring
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * the read-write fairness is sometimes necessary in a high speed network
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * because a certain channel can spend too much time on flushing the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * large number of write requests not giving enough time for other channels
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * to perform I/O. &amp;nbsp;The default value is {@code false}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;boolean isReadWriteFair();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;/**
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * @deprecated This property has been replaced by the
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@code writeBufferHighWaterMark} and {@code writeBufferLowWaterMark}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; *
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * Sets if an I/O thread should balance the ratio of read and write
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * operations. &amp;nbsp;Assuring the read-write fairness is sometimes necessary
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * in a high speed network because a certain channel can spend too much
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * time on flushing the large number of write requests not giving enough
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * time for other channels to perform I/O. &amp;nbsp;The default value is
&lt;br&gt;- &amp;nbsp; &amp;nbsp; * {@code false}.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; */
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;void setReadWriteFair(boolean fair);
&lt;br&gt;&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-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/socket/nio/NioWorker.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -573,26 +573,12 @@
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;static void close(NioSocketChannel channel, ChannelFuture future) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;NioWorker worker = channel.worker;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Selector selector = worker.selector;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean connected = channel.isConnected();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;boolean bound = channel.isBound();
&lt;br&gt;&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;// It is necessary to cancel all keys before closing a socket
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// because the shutdown flag in the Selector loop is set only when
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// all keys are cancelled. &amp;nbsp;Thus, SocketChannel.close() and
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// SelectionKey.cancel() must be placed in a synchronized block.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Otherwise SocketChannel.register() in RegisterTask can be called
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// after cancel(), but before close(), resulting in the infinite
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Selector loop that refuses to shut down due to the dangling keys.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;synchronized (channel.interestOpsLock) {
&lt;br&gt;- &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;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;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;}
&lt;br&gt;- &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;}
&lt;br&gt;+ &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;worker.cancelledKeys ++;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (channel.setClosed()) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.setSuccess();
&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-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/channel/xnio/DefaultXnioChannelConfig.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -213,14 +213,4 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;public void setConnectTimeoutMillis(int connectTimeoutMillis) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Preconfigured by XNIO.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public int getWriteTimeoutMillis() {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;@Deprecated
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public void setWriteTimeoutMillis(int writeTimeoutMillis) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Unused.
&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/example/http/snoop/HttpClient.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClient.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClient.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -1,110 +1,66 @@
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;- * JBoss, Home of Professional Open Source
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
&lt;br&gt;- * by the @author tags. See the COPYRIGHT.txt in the distribution for a
&lt;br&gt;- * full listing of individual contributors.
&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;&amp;nbsp; *
&lt;br&gt;- * This is free software; you can redistribute it and/or modify it
&lt;br&gt;- * under the terms of the GNU Lesser General Public License as
&lt;br&gt;- * published by the Free Software Foundation; either version 2.1 of
&lt;br&gt;- * the License, or (at your option) any later version.
&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;&amp;nbsp; *
&lt;br&gt;- * This software is distributed in the hope that it will be useful,
&lt;br&gt;- * but WITHOUT ANY WARRANTY; without even the implied warranty of
&lt;br&gt;- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
&lt;br&gt;- * Lesser General Public License for more details.
&lt;br&gt;- *
&lt;br&gt;- * You should have received a copy of the GNU Lesser General Public
&lt;br&gt;- * License along with this software; if not, write to the Free
&lt;br&gt;- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
&lt;br&gt;- * 02110-1301 USA, or see the FSF site: &lt;a href=&quot;http://www.fsf.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.fsf.org&lt;/a&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;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.example.http.snoop;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;-import java.io.File;
&lt;br&gt;&amp;nbsp;import java.net.InetSocketAddress;
&lt;br&gt;&amp;nbsp;import java.net.URI;
&lt;br&gt;-import java.net.URISyntaxException;
&lt;br&gt;-import java.util.List;
&lt;br&gt;-import java.util.Map;
&lt;br&gt;&amp;nbsp;import java.util.concurrent.Executors;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.bootstrap.ClientBootstrap;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.Channel;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.ChannelFuture;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.QueryStringEncoder;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.CookieEncoder;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.DefaultHttpDataFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.DefaultHttpRequest;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.DiskAttribute;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.DiskFileUpload;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.InterfaceHttpData;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpPostRequestEncoder;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpDataFactory;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpHeaders;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpMethod;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpRequest;
&lt;br&gt;&amp;nbsp;import org.jboss.netty.handler.codec.http.HttpVersion;
&lt;br&gt;-import org.jboss.netty.handler.codec.http.HttpPostRequestEncoder.ErrorDataEncoderException;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp;/**
&lt;br&gt;+ * A simple HTTP client that prints out the content of the HTTP response to
&lt;br&gt;+ * {@link System#out} to test {@link HttpServer}.
&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=4042358&amp;i=0&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=4042358&amp;i=1&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=4042358&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=4042358&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;&amp;nbsp; * @version $Rev$, $Date$
&lt;br&gt;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;public class HttpClient {
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp;public static void main(String[] args) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (args.length != 2) {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp;public static void main(String[] args) throws Exception {
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (args.length != 1) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.err.println(
&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;Usage: &amp;quot; + HttpClient.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;quot; baseURI Filepath&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;quot; &amp;lt;URL&amp;gt;&amp;quot;);
&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;String baseURI = args[0];
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String postSimple, postFile, get;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (baseURI.endsWith(&amp;quot;/&amp;quot;)) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;postSimple = baseURI+&amp;quot;formpost&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;postFile = baseURI+&amp;quot;formpostmultipart&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get = baseURI+&amp;quot;formget&amp;quot;;
&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;postSimple = baseURI+&amp;quot;/formpost&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;postFile = baseURI+&amp;quot;/formpostmultipart&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;get = baseURI+&amp;quot;/formget&amp;quot;;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URI uriSimple;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uriSimple = new URI(postSimple);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (URISyntaxException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.err.println(&amp;quot;Error: &amp;quot;+e.getMessage());
&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;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String scheme = uriSimple.getScheme() == null? &amp;quot;http&amp;quot; : uriSimple.getScheme();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String host = uriSimple.getHost() == null? &amp;quot;localhost&amp;quot; : uriSimple.getHost();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int port = uriSimple.getPort() == -1? 80 : uriSimple.getPort();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URI uri = new URI(args[0]);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String scheme = uri.getScheme() == null? &amp;quot;http&amp;quot; : uri.getScheme();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;String host = uri.getHost() == null? &amp;quot;localhost&amp;quot; : uri.getHost();
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int port = uri.getPort() == -1? 80 : uri.getPort();
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!scheme.equals(&amp;quot;http&amp;quot;)) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// We can actually support HTTPS fairly easily by inserting
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// an SslHandler to the pipeline - left as an exercise.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.err.println(&amp;quot;Only HTTP is supported.&amp;quot;);
&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; &amp;nbsp; &amp;nbsp; &amp;nbsp;URI uriFile;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uriFile = new URI(postFile);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (URISyntaxException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.err.println(&amp;quot;Error: &amp;quot;+e.getMessage());
&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;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;File file = new File(args[1]);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (! file.canRead()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.err.println(&amp;quot;A correct path is needed&amp;quot;);
&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;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Configure the client.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ClientBootstrap bootstrap = new ClientBootstrap(
&lt;br&gt;@@ -115,18 +71,9 @@
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Set up the event pipeline factory.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootstrap.setPipelineFactory(new HttpClientPipelineFactory());
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// set the factory
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpDataFactory factory = new DefaultHttpDataFactory(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DefaultHttpDataFactory.MINSIZE); // Disk if size exceed MINSIZE
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DiskFileUpload.deleteOnExitTemporaryFile = true; // should delete file on exit (in normal exit)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DiskFileUpload.baseDirectory = null; // system temp directory
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DiskAttribute.deleteOnExitTemporaryFile = true; // should delete file on exit (in normal exit)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DiskAttribute.baseDirectory = null; // system temp directory
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX /formget
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// No use of HttpPostRequestEncoder since not a POST
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Start the connection attempt.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ChannelFuture future = bootstrap.connect(new InetSocketAddress(host, port));
&lt;br&gt;+
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wait until the connection attempt succeeds or fails.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Channel channel = future.awaitUninterruptibly().getChannel();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!future.isSuccess()) {
&lt;br&gt;@@ -135,774 +82,22 @@
&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;// Prepare the HTTP request.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;QueryStringEncoder encoder = new QueryStringEncoder(get);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// add Form attribute
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.addParam(&amp;quot;getform&amp;quot;,&amp;quot;GET&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.addParam(&amp;quot;info&amp;quot;,&amp;quot;first value&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.addParam(&amp;quot;secondinfo&amp;quot;,&amp;quot;secondvalue ���&amp;&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// not the big one since it is not compatible with GET size
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// encoder.addParam(&amp;quot;thirdinfo&amp;quot;, textArea);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.addParam(&amp;quot;thirdinfo&amp;quot;, &amp;quot;third value\r\ntest second line\r\n\r\nnew line\r\n&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;encoder.addParam(&amp;quot;Send&amp;quot;,&amp;quot;Send&amp;quot;);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;URI uriGet;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;uriGet = new URI(encoder.toString());
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (URISyntaxException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;System.err.println(&amp;quot;Error: &amp;quot;+e.getMessage());
&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;// Send the HTTP request.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpRequest request = new DefaultHttpRequest(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpVersion.HTTP_1_1, HttpMethod.GET, uriGet.toASCIIString());
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Accept&amp;quot;,&amp;quot;text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Accept-Charset&amp;quot;,&amp;quot;ISO-8859-1,utf-8;q=0.7,*;q=0.7&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Accept-Encoding&amp;quot;,&amp;quot;gzip,deflate&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Accept-Language&amp;quot;,&amp;quot;fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Connection&amp;quot;,&amp;quot;keep-alive&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Keep-Alive&amp;quot;,&amp;quot;300&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;Referer&amp;quot;,&amp;quot;&lt;a href=&quot;http://127.0.0.1:8080/&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://127.0.0.1:8080/&lt;/a&gt;&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(&amp;quot;User-Agent&amp;quot;,&amp;quot;Netty Simple Http Client side&amp;quot;);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpVersion.HTTP_1_1, HttpMethod.GET, uri.toASCIIString());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.HOST, host);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.CONNECTION, HttpHeaders.Values.CLOSE);
&lt;br&gt;+ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.ACCEPT_ENCODING, HttpHeaders.Values.GZIP);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CookieEncoder httpCookieEncoder = new CookieEncoder(false);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;httpCookieEncoder.addCookie(&amp;quot;my-cookie&amp;quot;, &amp;quot;foo&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;httpCookieEncoder.addCookie(&amp;quot;another-cookie&amp;quot;, &amp;quot;bar&amp;quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeader(HttpHeaders.Names.COOKIE, httpCookieEncoder.encode());
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Map&amp;lt;String, List&amp;lt;String&amp;gt;&amp;gt; headers = request.getHeaders();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// send request
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(request);
&lt;br&gt;&amp;nbsp;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wait for the server to close the connection.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.getCloseFuture().awaitUninterruptibly();
&lt;br&gt;&amp;nbsp;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX /formpost
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Start the connection attempt.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future = bootstrap.connect(new InetSocketAddress(host, port));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wait until the connection attempt succeeds or fails.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = future.awaitUninterruptibly().getChannel();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!future.isSuccess()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.getCause().printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootstrap.releaseExternalResources();
&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;// Prepare the HTTP request.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request = new DefaultHttpRequest(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpVersion.HTTP_1_1, HttpMethod.POST, uriSimple.toASCIIString());
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Use the PostBody encoder
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpPostRequestEncoder bodyRequestEncoder = null;
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder = new HttpPostRequestEncoder(factory,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request, false); &amp;nbsp;// false =&amp;gt; not multipart
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (NullPointerException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// should not be since args are not null
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (ErrorDataEncoderException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// test if method is a POST method
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&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;// it is legal to add directly header or cookie into the request until finalize
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeaders(headers);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// add Form attribute
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.addBodyAttribute(&amp;quot;getform&amp;quot;,&amp;quot;POST&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.addBodyAttribute(&amp;quot;info&amp;quot;,&amp;quot;first value&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.addBodyAttribute(&amp;quot;secondinfo&amp;quot;,&amp;quot;secondvalue ���&amp;&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.addBodyAttribute(&amp;quot;thirdinfo&amp;quot;, textArea);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.addBodyFileUpload(&amp;quot;myfile&amp;quot;, file, &amp;quot;application/x-zip-compressed&amp;quot;, false);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.addBodyAttribute(&amp;quot;Send&amp;quot;,&amp;quot;Send&amp;quot;);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (NullPointerException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// should not be since not null args
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (ErrorDataEncoderException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if an encoding error occurs
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&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;// finalize request
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request = bodyRequestEncoder.finalizeRequest();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (ErrorDataEncoderException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if an encoding error occurs
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;List&amp;lt;InterfaceHttpData&amp;gt; bodylist = bodyRequestEncoder.getBodyListAttributes();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// send request
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(request);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// test if request was chunked
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bodyRequestEncoder.isChunked()) { // could do either request.isChunked()
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// either do it through ChunkedWriteHandler
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(bodyRequestEncoder);
&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;// Do not clear here since we will reuse the InterfaceHttpData on the next request for the example
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// bodyRequestEncoder.cleanFiles();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wait for the server to close the connection.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.getCloseFuture().awaitUninterruptibly();
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// XXX /formpostmultipart
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Start the connection attempt.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future = bootstrap.connect(new InetSocketAddress(host, port));
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wait until the connection attempt succeeds or fails.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel = future.awaitUninterruptibly().getChannel();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!future.isSuccess()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;future.getCause().printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootstrap.releaseExternalResources();
&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;// Prepare the HTTP request.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request = new DefaultHttpRequest(
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;HttpVersion.HTTP_1_1, HttpMethod.POST, uriFile.toASCIIString());
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Use the PostBody encoder
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder = new HttpPostRequestEncoder(factory,
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request, true); // true =&amp;gt; multipart
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (NullPointerException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// should not be since no null args
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (ErrorDataEncoderException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// test if method is a POST method
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&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;// it is legal to add directly header or cookie into the request until finalize
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;request.setHeaders(headers);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// add Form attribute
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.setBodyHttpDatas(bodylist);
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (NullPointerException e1) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// should not be since previously created
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e1.printStackTrace();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (ErrorDataEncoderException e1) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// again should not be since previously encoded (except if an error occurs previously)
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e1.printStackTrace();
&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;// finalize request
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;try {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.finalizeRequest();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} catch (ErrorDataEncoderException e) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// if an encoding error occurs
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;e.printStackTrace();
&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;// send request
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(request);
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// test if request was chunked
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (bodyRequestEncoder.isChunked()) {
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.write(bodyRequestEncoder);
&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;// Now no more use of file representation
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bodyRequestEncoder.cleanFiles();
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Wait for the server to close the connection.
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;channel.getCloseFuture().awaitUninterruptibly();
&lt;br&gt;-
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// Shut down executor threads to exit.
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;bootstrap.releaseExternalResources();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}
&lt;br&gt;-
&lt;br&gt;- &amp;nbsp; &amp;nbsp;// use to simulate a big TEXTAREA field in a form
&lt;br&gt;- &amp;nbsp; &amp;nbsp;private static String textArea =
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;lkjlkjlKJLKJLKJLKJLJlkj lklkj\r\n\r\nLKJJJJJJJJKKKKKKKKKKKKKKK ����&amp;\r\n\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;+
&lt;br&gt;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM\r\n&amp;quot;;
&lt;br&gt;-
&lt;br&gt;-}
&lt;br&gt;\ No newline at end of file
&lt;br&gt;+}
&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-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpClientPipelineFactory.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -1,24 +1,17 @@
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;- * JBoss, Home of Professional Open Source
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
&lt;br&gt;- * by the @author tags. See the COPYRIGHT.txt in the distribution for a
&lt;br&gt;- * full listing of individual contributors.
&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;&amp;nbsp; *
&lt;br&gt;- * This is free software; you can redistribute it and/or modify it
&lt;br&gt;- * under the terms of the GNU Lesser General Public License as
&lt;br&gt;- * published by the Free Software Foundation; either version 2.1 of
&lt;br&gt;- * the License, or (at your option) any later version.
&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;&amp;nbsp; *
&lt;br&gt;- * This software is distributed in the hope that it will be useful,
&lt;br&gt;- * but WITHOUT ANY WARRANTY; without even the implied warranty of
&lt;br&gt;- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
&lt;br&gt;- * Lesser General Public License for more details.
&lt;br&gt;- *
&lt;br&gt;- * You should have received a copy of the GNU Lesser General Public
&lt;br&gt;- * License along with this software; if not, write to the Free
&lt;br&gt;- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
&lt;br&gt;- * 02110-1301 USA, or see the FSF site: &lt;a href=&quot;http://www.fsf.org&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;http://www.fsf.org&lt;/a&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;&amp;nbsp; */
&lt;br&gt;&amp;nbsp;package org.jboss.netty.example.http.snoop;
&lt;br&gt;&amp;nbsp;
&lt;br&gt;@@ -29,7 +22,6 @@
&lt;br&gt;&amp;nbsp;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;-import org.jboss.netty.handler.stream.ChunkedWriteHandler;
&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=4042358&amp;i=4&quot; target=&quot;_top&quot; rel=&quot;nofollow&quot;&gt;[hidden email]&lt;/a&gt;)
&lt;br&gt;@@ -48,7 +40,6 @@
&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;- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;chunkedWriter&amp;quot;, new ChunkedWriteHandler());
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pipeline.addLast(&amp;quot;handler&amp;quot;, new HttpResponseHandler());
&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/http/snoop/HttpRequestHandler.java
&lt;br&gt;===================================================================
&lt;br&gt;--- branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpRequestHandler.java	2009-11-20 04:12:16 UTC (rev 1901)
&lt;br&gt;+++ branches/httpPost/src/main/java/org/jboss/netty/example/http/snoop/HttpRequestHandler.java	2009-11-21 11:56:42 UTC (rev 1902)
&lt;br&gt;@@ -1,74 +1,51 @@
&lt;br&gt;&amp;nbsp;/*
&lt;br&gt;- * JBoss, Home of Professional Open Source
&lt;br&gt;+ * Copyright 2009 Red Hat, Inc.
&lt;br&gt;&amp;nbsp; *
&lt;br&gt;- * Copyright 2009, Red Hat Middleware LLC, and individual contributors
&lt;br&gt;- * by the @author tags. See the COPYRIGHT.txt in the distribution for a
&lt;br&gt;- * full listing of individual contributors.
&lt;br&gt;+ * Red Hat licenses this file to you under the Apache License, ve