Return-Path: X-Original-To: apmail-hc-commits-archive@www.apache.org Delivered-To: apmail-hc-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9871889C3 for ; Fri, 12 Aug 2011 10:36:26 +0000 (UTC) Received: (qmail 44253 invoked by uid 500); 12 Aug 2011 10:36:25 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 44111 invoked by uid 500); 12 Aug 2011 10:36:20 -0000 Mailing-List: contact commits-help@hc.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: "HttpComponents Project" Delivered-To: mailing list commits@hc.apache.org Received: (qmail 43196 invoked by uid 99); 12 Aug 2011 10:35:59 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Aug 2011 10:35:59 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 12 Aug 2011 10:35:54 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id A9A8B2388897 for ; Fri, 12 Aug 2011 10:35:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1157038 [1/2] - in /httpcomponents/httpcore/trunk: httpcore-nio/src/examples/org/apache/http/examples/nio/ httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/ httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/ httpcore-nio/... Date: Fri, 12 Aug 2011 10:35:33 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110812103534.A9A8B2388897@eris.apache.org> Author: olegk Date: Fri Aug 12 10:35:32 2011 New Revision: 1157038 URL: http://svn.apache.org/viewvc?rev=1157038&view=rev Log: Replaced HttpParams with IOReactorConfig java bean as a configuration mechanism for I/O reactors; deprecated NIOReactorPNames and related classes; deprecated throttling protocol handlers Added: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java (with props) Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/ElementalEchoServer.java httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultConnectingIOReactor.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultListeningIOReactor.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorPNames.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParamBean.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParams.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpClientHandler.java httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpServiceHandler.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/reactor/TestDefaultListeningIOReactor.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpClientNio.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpSSLClient.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpSSLServer.java httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/testserver/HttpServerNio.java httpcomponents/httpcore/trunk/httpcore/src/main/java/org/apache/http/impl/pool/BasicConnPool.java Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/ElementalEchoServer.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/ElementalEchoServer.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/ElementalEchoServer.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/ElementalEchoServer.java Fri Aug 12 10:35:32 2011 @@ -31,20 +31,17 @@ import java.io.InterruptedIOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; -import org.apache.http.params.SyncBasicHttpParams; import org.apache.http.impl.nio.reactor.DefaultListeningIOReactor; import org.apache.http.nio.reactor.EventMask; import org.apache.http.nio.reactor.IOEventDispatch; import org.apache.http.nio.reactor.IOSession; import org.apache.http.nio.reactor.ListeningIOReactor; -import org.apache.http.params.HttpParams; public class ElementalEchoServer { public static void main(String[] args) throws Exception { - HttpParams params = new SyncBasicHttpParams(); IOEventDispatch ioEventDispatch = new DefaultIoEventDispatch(); - ListeningIOReactor ioReactor = new DefaultListeningIOReactor(2, params); + ListeningIOReactor ioReactor = new DefaultListeningIOReactor(); ioReactor.listen(new InetSocketAddress(8080)); try { ioReactor.execute(ioEventDispatch); @@ -55,11 +52,11 @@ public class ElementalEchoServer { } System.out.println("Shutdown"); } - + static class DefaultIoEventDispatch implements IOEventDispatch { private final ByteBuffer buffer = ByteBuffer.allocate(1024); - + public void connected(IOSession session) { System.out.println("connected"); session.setEventMask(EventMask.READ); @@ -101,10 +98,10 @@ public class ElementalEchoServer { System.out.println("timeout"); session.close(); } - + public void disconnected(final IOSession session) { System.out.println("disconnected"); } } - + } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java Fri Aug 12 10:35:32 2011 @@ -28,6 +28,7 @@ package org.apache.http.examples.nio; import java.io.IOException; import java.io.InterruptedIOException; +import java.nio.channels.SelectionKey; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -42,11 +43,11 @@ import org.apache.http.impl.nio.pool.Bas import org.apache.http.impl.nio.pool.BasicNIOPoolEntry; import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; import org.apache.http.message.BasicHttpRequest; -import org.apache.http.nio.NHttpConnection; import org.apache.http.nio.protocol.BufferingHttpClientHandler; import org.apache.http.nio.protocol.HttpRequestExecutionHandler; import org.apache.http.nio.reactor.ConnectingIOReactor; import org.apache.http.nio.reactor.IOEventDispatch; +import org.apache.http.nio.reactor.IOSession; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; @@ -69,6 +70,7 @@ import org.apache.http.protocol.RequestU public class NHttpClient { public static void main(String[] args) throws Exception { + final ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); HttpParams params = new SyncBasicHttpParams(); params .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000) @@ -78,9 +80,8 @@ public class NHttpClient { .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true) .setParameter(CoreProtocolPNames.USER_AGENT, "Test/1.1"); - final ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(2, params); - BasicNIOConnPool pool = new BasicNIOConnPool(ioReactor, params); + BasicNIOConnPool pool = new BasicNIOConnPool(ioReactor); // Limit total number of connections to just two pool.setDefaultMaxPerRoute(2); pool.setMaxTotal(2); @@ -166,9 +167,9 @@ public class NHttpClient { public void completed(final BasicNIOPoolEntry entry) { this.poolEntry = entry; - NHttpConnection conn = entry.getConnection(); - conn.getContext().setAttribute("executor", this); - conn.requestOutput(); + IOSession session = entry.getConnection(); + session.setAttribute("executor", this); + session.setEvent(SelectionKey.OP_WRITE); System.out.println(this.poolEntry.getRoute() + ": obtained connection from the pool"); } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java Fri Aug 12 10:35:32 2011 @@ -50,6 +50,7 @@ import org.apache.http.impl.nio.DefaultC import org.apache.http.impl.nio.DefaultServerIOEventDispatch; import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; import org.apache.http.impl.nio.reactor.DefaultListeningIOReactor; +import org.apache.http.impl.nio.reactor.IOReactorConfig; import org.apache.http.nio.ContentDecoder; import org.apache.http.nio.ContentEncoder; import org.apache.http.nio.IOControl; @@ -85,14 +86,14 @@ import org.apache.http.protocol.Response * Rudimentary HTTP/1.1 reverse proxy based on the non-blocking I/O model. *

* Please note the purpose of this application is demonstrate the usage of HttpCore APIs. - * It is NOT intended to demonstrate the most efficient way of building an HTTP reverse proxy. - * + * It is NOT intended to demonstrate the most efficient way of building an HTTP reverse proxy. + * * */ public class NHttpReverseProxy { public static void main(String[] args) throws Exception { - + if (args.length < 1) { System.out.println("Usage: NHttpReverseProxy [port]"); System.exit(1); @@ -102,25 +103,24 @@ public class NHttpReverseProxy { if (args.length > 1) { port = Integer.parseInt(args[1]); } - + // Target host - HttpHost targetHost = new HttpHost(hostname, port); - + HttpHost targetHost = new HttpHost(hostname, port); + HttpParams params = new SyncBasicHttpParams(); params .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 30000) .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024) .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false) .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true) - .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "HttpComponents/1.1") - .setParameter(CoreProtocolPNames.USER_AGENT, "HttpComponents/1.1"); + .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "Test/1.1") + .setParameter(CoreProtocolPNames.USER_AGENT, "Test/1.1"); - final ConnectingIOReactor connectingIOReactor = new DefaultConnectingIOReactor( - 1, params); + IOReactorConfig config = new IOReactorConfig(); + config.setIoThreadCount(1); + final ConnectingIOReactor connectingIOReactor = new DefaultConnectingIOReactor(config); + final ListeningIOReactor listeningIOReactor = new DefaultListeningIOReactor(config); - final ListeningIOReactor listeningIOReactor = new DefaultListeningIOReactor( - 1, params); - // Set up HTTP protocol processor for incoming connections HttpProcessor inhttpproc = new ImmutableHttpProcessor( new HttpRequestInterceptor[] { @@ -130,7 +130,7 @@ public class NHttpReverseProxy { new RequestUserAgent(), new RequestExpectContinue() }); - + // Set up HTTP protocol processor for outgoing connections HttpProcessor outhttpproc = new ImmutableHttpProcessor( new HttpResponseInterceptor[] { @@ -139,7 +139,7 @@ public class NHttpReverseProxy { new ResponseContent(), new ResponseConnControl() }); - + NHttpClientHandler connectingHandler = new ConnectingHandler( inhttpproc, new DefaultConnectionReuseStrategy(), @@ -148,19 +148,19 @@ public class NHttpReverseProxy { NHttpServiceHandler listeningHandler = new ListeningHandler( targetHost, connectingIOReactor, - outhttpproc, + outhttpproc, new DefaultHttpResponseFactory(), new DefaultConnectionReuseStrategy(), params); - + final IOEventDispatch connectingEventDispatch = new DefaultClientIOEventDispatch( connectingHandler, params); final IOEventDispatch listeningEventDispatch = new DefaultServerIOEventDispatch( listeningHandler, params); - + Thread t = new Thread(new Runnable() { - + public void run() { try { connectingIOReactor.execute(connectingEventDispatch); @@ -170,10 +170,10 @@ public class NHttpReverseProxy { System.err.println("I/O error: " + e.getMessage()); } } - + }); t.start(); - + try { listeningIOReactor.listen(new InetSocketAddress(8888)); listeningIOReactor.execute(listeningEventDispatch); @@ -187,16 +187,16 @@ public class NHttpReverseProxy { static class ListeningHandler implements NHttpServiceHandler { private final HttpHost targetHost; - private final ConnectingIOReactor connectingIOReactor; + private final ConnectingIOReactor connectingIOReactor; private final HttpProcessor httpProcessor; private final HttpResponseFactory responseFactory; private final ConnectionReuseStrategy connStrategy; private final HttpParams params; - + public ListeningHandler( final HttpHost targetHost, final ConnectingIOReactor connectingIOReactor, - final HttpProcessor httpProcessor, + final HttpProcessor httpProcessor, final HttpResponseFactory responseFactory, final ConnectionReuseStrategy connStrategy, final HttpParams params) { @@ -213,26 +213,26 @@ public class NHttpReverseProxy { System.out.println(conn + " [client->proxy] conn open"); ProxyTask proxyTask = new ProxyTask(); - + synchronized (proxyTask) { // Initialize connection state proxyTask.setTarget(this.targetHost); proxyTask.setClientIOControl(conn); proxyTask.setClientState(ConnState.CONNECTED); - + HttpContext context = conn.getContext(); context.setAttribute(ProxyTask.ATTRIB, proxyTask); - + InetSocketAddress address = new InetSocketAddress( - this.targetHost.getHostName(), - this.targetHost.getPort()); - + this.targetHost.getHostName(), + this.targetHost.getPort()); + this.connectingIOReactor.connect( - address, - null, - proxyTask, - null); + address, + null, + proxyTask, + null); } } @@ -252,25 +252,25 @@ public class NHttpReverseProxy { try { HttpRequest request = conn.getHttpRequest(); - + System.out.println(conn + " [client->proxy] >> " + request.getRequestLine()); - + ProtocolVersion ver = request.getRequestLine().getProtocolVersion(); if (!ver.lessEquals(HttpVersion.HTTP_1_1)) { - // Downgrade protocol version if greater than HTTP/1.1 + // Downgrade protocol version if greater than HTTP/1.1 ver = HttpVersion.HTTP_1_1; } - + // Update connection state proxyTask.setRequest(request); proxyTask.setClientState(ConnState.REQUEST_RECEIVED); - + // See if the client expects a 100-Continue if (request instanceof HttpEntityEnclosingRequest) { if (((HttpEntityEnclosingRequest) request).expectContinue()) { HttpResponse ack = this.responseFactory.newHttpResponse( - ver, - HttpStatus.SC_CONTINUE, + ver, + HttpStatus.SC_CONTINUE, context); conn.submitResponse(ack); } @@ -278,13 +278,13 @@ public class NHttpReverseProxy { // No request content expected. Suspend client input conn.suspendInput(); } - + // If there is already a connection to the origin server // make sure origin output is active if (proxyTask.getOriginIOControl() != null) { proxyTask.getOriginIOControl().requestOutput(); } - + } catch (IOException ex) { shutdownConnection(conn); } catch (HttpException ex) { @@ -305,7 +305,7 @@ public class NHttpReverseProxy { && connState != ConnState.REQUEST_BODY_STREAM) { throw new IllegalStateException("Illegal client connection state: " + connState); } - + try { ByteBuffer dst = proxyTask.getInBuffer(); @@ -317,7 +317,7 @@ public class NHttpReverseProxy { // until the origin handler frees up some space in the buffer conn.suspendInput(); } - // If there is some content in the input buffer make sure origin + // If there is some content in the input buffer make sure origin // output is active if (dst.position() > 0) { if (proxyTask.getOriginIOControl() != null) { @@ -334,7 +334,7 @@ public class NHttpReverseProxy { } else { proxyTask.setClientState(ConnState.REQUEST_BODY_STREAM); } - + } catch (IOException ex) { shutdownConnection(conn); } @@ -350,7 +350,7 @@ public class NHttpReverseProxy { synchronized (proxyTask) { ConnState connState = proxyTask.getClientState(); if (connState == ConnState.IDLE) { - // Response not available + // Response not available return; } if (connState != ConnState.REQUEST_RECEIVED @@ -375,27 +375,27 @@ public class NHttpReverseProxy { response.removeHeaders("TE"); response.removeHeaders("Trailers"); response.removeHeaders("Upgrade"); - + response.setParams( new DefaultedHttpParams(response.getParams(), this.params)); - // Close client connection if the connection to the target + // Close client connection if the connection to the target // is no longer active / open if (proxyTask.getOriginState().compareTo(ConnState.CLOSING) >= 0) { - response.addHeader(HTTP.CONN_DIRECTIVE, "Close"); + response.addHeader(HTTP.CONN_DIRECTIVE, "Close"); } - + // Pre-process HTTP request context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ExecutionContext.HTTP_REQUEST, request); this.httpProcessor.process(response, context); - + conn.submitResponse(response); proxyTask.setClientState(ConnState.RESPONSE_SENT); System.out.println(conn + " [client<-proxy] << " + response.getStatusLine()); - + if (!canResponseHaveBody(request, response)) { conn.resetInput(); if (!this.connStrategy.keepAlive(response, context)) { @@ -409,7 +409,7 @@ public class NHttpReverseProxy { // Ready to deal with a new request } } - + } catch (IOException ex) { shutdownConnection(conn); } catch (HttpException ex) { @@ -417,21 +417,21 @@ public class NHttpReverseProxy { } } } - + private boolean canResponseHaveBody( final HttpRequest request, final HttpResponse response) { if (request != null && "HEAD".equalsIgnoreCase(request.getRequestLine().getMethod())) { return false; } - - int status = response.getStatusLine().getStatusCode(); - return status >= HttpStatus.SC_OK - && status != HttpStatus.SC_NO_CONTENT + + int status = response.getStatusLine().getStatusCode(); + return status >= HttpStatus.SC_OK + && status != HttpStatus.SC_NO_CONTENT && status != HttpStatus.SC_NOT_MODIFIED - && status != HttpStatus.SC_RESET_CONTENT; + && status != HttpStatus.SC_RESET_CONTENT; } - + public void outputReady(final NHttpServerConnection conn, final ContentEncoder encoder) { System.out.println(conn + " [client<-proxy] output ready"); @@ -449,7 +449,7 @@ public class NHttpReverseProxy { if (response == null) { throw new IllegalStateException("HTTP request is null"); } - + try { ByteBuffer src = proxyTask.getOutBuffer(); @@ -464,7 +464,7 @@ public class NHttpReverseProxy { if (proxyTask.getOriginState() == ConnState.RESPONSE_BODY_DONE) { encoder.complete(); } else { - // Input output is empty. Wait until the origin handler + // Input output is empty. Wait until the origin handler // fills up the buffer conn.suspendOutput(); } @@ -489,10 +489,10 @@ public class NHttpReverseProxy { // Make sure origin input is active proxyTask.getOriginIOControl().requestInput(); } - + } catch (IOException ex) { shutdownConnection(conn); - } + } } } @@ -515,7 +515,7 @@ public class NHttpReverseProxy { shutdownConnection(conn); return; } - + HttpContext context = conn.getContext(); try { @@ -528,11 +528,11 @@ public class NHttpReverseProxy { context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ExecutionContext.HTTP_REQUEST, null); this.httpProcessor.process(response, context); - + conn.submitResponse(response); conn.close(); - + } catch (IOException ex) { shutdownConnection(conn); } catch (HttpException ex) { @@ -544,12 +544,12 @@ public class NHttpReverseProxy { shutdownConnection(conn); System.out.println(conn + " [client->proxy] I/O error: " + ex.getMessage()); } - + public void timeout(final NHttpServerConnection conn) { System.out.println(conn + " [client->proxy] timeout"); closeConnection(conn); } - + private void shutdownConnection(final NHttpConnection conn) { try { conn.shutdown(); @@ -565,15 +565,15 @@ public class NHttpReverseProxy { } } - + static class ConnectingHandler implements NHttpClientHandler { private final HttpProcessor httpProcessor; private final ConnectionReuseStrategy connStrategy; private final HttpParams params; - + public ConnectingHandler( - final HttpProcessor httpProcessor, + final HttpProcessor httpProcessor, final ConnectionReuseStrategy connStrategy, final HttpParams params) { super(); @@ -581,10 +581,10 @@ public class NHttpReverseProxy { this.connStrategy = connStrategy; this.params = params; } - + public void connected(final NHttpClientConnection conn, final Object attachment) { System.out.println(conn + " [proxy->origin] conn open"); - + // The shared state object is expected to be passed as an attachment ProxyTask proxyTask = (ProxyTask) attachment; @@ -601,7 +601,7 @@ public class NHttpReverseProxy { context.setAttribute(ProxyTask.ATTRIB, proxyTask); // Update connection state proxyTask.setOriginState(ConnState.CONNECTED); - + if (proxyTask.getRequest() != null) { conn.requestOutput(); } @@ -616,7 +616,7 @@ public class NHttpReverseProxy { synchronized (proxyTask) { ConnState connState = proxyTask.getOriginState(); - if (connState == ConnState.REQUEST_SENT + if (connState == ConnState.REQUEST_SENT || connState == ConnState.REQUEST_BODY_DONE) { // Request sent but no response available yet return; @@ -631,7 +631,7 @@ public class NHttpReverseProxy { if (request == null) { throw new IllegalStateException("HTTP request is null"); } - + // Remove hop-by-hop headers request.removeHeaders(HTTP.CONTENT_LEN); request.removeHeaders(HTTP.TRANSFER_ENCODING); @@ -644,14 +644,14 @@ public class NHttpReverseProxy { request.removeHeaders("Upgrade"); // Remove host header request.removeHeaders(HTTP.TARGET_HOST); - + HttpHost targetHost = proxyTask.getTarget(); - + try { - + request.setParams( new DefaultedHttpParams(request.getParams(), this.params)); - + // Pre-process HTTP request context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn); context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, targetHost); @@ -661,21 +661,21 @@ public class NHttpReverseProxy { conn.submitRequest(request); // Update connection state proxyTask.setOriginState(ConnState.REQUEST_SENT); - + System.out.println(conn + " [proxy->origin] >> " + request.getRequestLine().toString()); - + } catch (IOException ex) { shutdownConnection(conn); } catch (HttpException ex) { shutdownConnection(conn); } - + } } public void outputReady(final NHttpClientConnection conn, final ContentEncoder encoder) { System.out.println(conn + " [proxy->origin] output ready"); - + HttpContext context = conn.getContext(); ProxyTask proxyTask = (ProxyTask) context.getAttribute(ProxyTask.ATTRIB); @@ -685,21 +685,21 @@ public class NHttpReverseProxy { && connState != ConnState.REQUEST_BODY_STREAM) { throw new IllegalStateException("Illegal target connection state: " + connState); } - + try { - + ByteBuffer src = proxyTask.getInBuffer(); src.flip(); int bytesWritten = encoder.write(src); System.out.println(conn + " [proxy->origin] " + bytesWritten + " bytes written"); System.out.println(conn + " [proxy->origin] " + encoder); src.compact(); - + if (src.position() == 0) { if (proxyTask.getClientState() == ConnState.REQUEST_BODY_DONE) { encoder.complete(); } else { - // Input buffer is empty. Wait until the client fills up + // Input buffer is empty. Wait until the client fills up // the buffer conn.suspendOutput(); } @@ -713,7 +713,7 @@ public class NHttpReverseProxy { // Make sure client input is active proxyTask.getClientIOControl().requestInput(); } - + } catch (IOException ex) { shutdownConnection(conn); } @@ -722,7 +722,7 @@ public class NHttpReverseProxy { public void responseReceived(final NHttpClientConnection conn) { System.out.println(conn + " [proxy<-origin] response received"); - + HttpContext context = conn.getContext(); ProxyTask proxyTask = (ProxyTask) context.getAttribute(ProxyTask.ATTRIB); @@ -737,18 +737,18 @@ public class NHttpReverseProxy { HttpRequest request = proxyTask.getRequest(); System.out.println(conn + " [proxy<-origin] << " + response.getStatusLine()); - + int statusCode = response.getStatusLine().getStatusCode(); if (statusCode < HttpStatus.SC_OK) { // Ignore 1xx response return; } try { - + // Update connection state proxyTask.setResponse(response); proxyTask.setOriginState(ConnState.RESPONSE_RECEIVED); - + if (!canResponseHaveBody(request, response)) { conn.resetInput(); if (!this.connStrategy.keepAlive(response, context)) { @@ -773,14 +773,14 @@ public class NHttpReverseProxy { if (request != null && "HEAD".equalsIgnoreCase(request.getRequestLine().getMethod())) { return false; } - - int status = response.getStatusLine().getStatusCode(); - return status >= HttpStatus.SC_OK - && status != HttpStatus.SC_NO_CONTENT + + int status = response.getStatusLine().getStatusCode(); + return status >= HttpStatus.SC_OK + && status != HttpStatus.SC_NO_CONTENT && status != HttpStatus.SC_NOT_MODIFIED - && status != HttpStatus.SC_RESET_CONTENT; + && status != HttpStatus.SC_RESET_CONTENT; } - + public void inputReady(final NHttpClientConnection conn, final ContentDecoder decoder) { System.out.println(conn + " [proxy<-origin] input ready"); @@ -796,22 +796,22 @@ public class NHttpReverseProxy { HttpResponse response = proxyTask.getResponse(); try { - + ByteBuffer dst = proxyTask.getOutBuffer(); int bytesRead = decoder.read(dst); System.out.println(conn + " [proxy<-origin] " + bytesRead + " bytes read"); System.out.println(conn + " [proxy<-origin] " + decoder); if (!dst.hasRemaining()) { - // Output buffer is full. Suspend origin input until + // Output buffer is full. Suspend origin input until // the client handler frees up some space in the buffer conn.suspendInput(); } - // If there is some content in the buffer make sure client output + // If there is some content in the buffer make sure client output // is active if (dst.position() > 0) { proxyTask.getClientIOControl().requestOutput(); } - + if (decoder.isCompleted()) { System.out.println(conn + " [proxy<-origin] response body received"); proxyTask.setOriginState(ConnState.RESPONSE_BODY_DONE); @@ -824,7 +824,7 @@ public class NHttpReverseProxy { } else { proxyTask.setOriginState(ConnState.RESPONSE_BODY_STREAM); } - + } catch (IOException ex) { shutdownConnection(conn); } @@ -852,19 +852,19 @@ public class NHttpReverseProxy { shutdownConnection(conn); System.out.println(conn + " [proxy->origin] I/O error: " + ex.getMessage()); } - + public void timeout(final NHttpClientConnection conn) { System.out.println(conn + " [proxy->origin] timeout"); closeConnection(conn); } - + private void shutdownConnection(final HttpConnection conn) { try { conn.shutdown(); } catch (IOException ignore) { } } - + private void closeConnection(final HttpConnection conn) { try { conn.shutdown(); @@ -872,8 +872,8 @@ public class NHttpReverseProxy { } } - } - + } + enum ConnState { IDLE, CONNECTED, @@ -888,25 +888,25 @@ public class NHttpReverseProxy { CLOSING, CLOSED } - + static class ProxyTask { - + public static final String ATTRIB = "nhttp.proxy-task"; - + private final ByteBuffer inBuffer; private final ByteBuffer outBuffer; private HttpHost target; - + private IOControl originIOControl; private IOControl clientIOControl; - + private ConnState originState; private ConnState clientState; - + private HttpRequest request; private HttpResponse response; - + public ProxyTask() { super(); this.originState = ConnState.IDLE; @@ -922,7 +922,7 @@ public class NHttpReverseProxy { public ByteBuffer getOutBuffer() { return this.outBuffer; } - + public HttpHost getTarget() { return this.target; } @@ -962,7 +962,7 @@ public class NHttpReverseProxy { public void setOriginIOControl(final IOControl originIOControl) { this.originIOControl = originIOControl; } - + public ConnState getOriginState() { return this.originState; } @@ -970,7 +970,7 @@ public class NHttpReverseProxy { public void setOriginState(final ConnState state) { this.originState = state; } - + public ConnState getClientState() { return this.clientState; } @@ -987,7 +987,7 @@ public class NHttpReverseProxy { this.request = null; this.response = null; } - + public void shutdown() { if (this.clientIOControl != null) { try { @@ -1004,5 +1004,5 @@ public class NHttpReverseProxy { } } - + } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java Fri Aug 12 10:35:32 2011 @@ -28,6 +28,7 @@ package org.apache.http.examples.nio; import java.io.IOException; import java.io.InterruptedIOException; +import java.nio.channels.SelectionKey; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -44,11 +45,11 @@ import org.apache.http.impl.nio.pool.Bas import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor; import org.apache.http.impl.nio.ssl.SSLClientIOEventDispatch; import org.apache.http.message.BasicHttpRequest; -import org.apache.http.nio.NHttpConnection; import org.apache.http.nio.protocol.BufferingHttpClientHandler; import org.apache.http.nio.protocol.HttpRequestExecutionHandler; import org.apache.http.nio.reactor.ConnectingIOReactor; import org.apache.http.nio.reactor.IOEventDispatch; +import org.apache.http.nio.reactor.IOSession; import org.apache.http.params.CoreConnectionPNames; import org.apache.http.params.CoreProtocolPNames; import org.apache.http.params.HttpParams; @@ -80,9 +81,9 @@ public class NHttpSSLClient { .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true) .setParameter(CoreProtocolPNames.USER_AGENT, "Test/1.1"); - final ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(2, params); + final ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(); - BasicNIOConnPool pool = new BasicNIOConnPool(ioReactor, params); + BasicNIOConnPool pool = new BasicNIOConnPool(ioReactor); // Limit total number of connections to just two pool.setDefaultMaxPerRoute(2); pool.setMaxTotal(2); @@ -175,9 +176,9 @@ public class NHttpSSLClient { public void completed(final BasicNIOPoolEntry entry) { this.poolEntry = entry; - NHttpConnection conn = entry.getConnection(); - conn.getContext().setAttribute("executor", this); - conn.requestOutput(); + IOSession session = entry.getConnection(); + session.setAttribute("executor", this); + session.setEvent(SelectionKey.OP_WRITE); System.out.println(this.poolEntry.getRoute() + ": obtained connection from the pool"); } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java Fri Aug 12 10:35:32 2011 @@ -138,7 +138,7 @@ public class NHttpSSLServer { sslcontext, params); - ListeningIOReactor ioReactor = new DefaultListeningIOReactor(2, params); + ListeningIOReactor ioReactor = new DefaultListeningIOReactor(); try { ioReactor.listen(new InetSocketAddress(8080)); ioReactor.execute(ioEventDispatch); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java Fri Aug 12 10:35:32 2011 @@ -115,7 +115,7 @@ public class NHttpServer { handler.setEventListener(new EventLogger()); IOEventDispatch ioEventDispatch = new DefaultServerIOEventDispatch(handler, params); - ListeningIOReactor ioReactor = new DefaultListeningIOReactor(2, params); + ListeningIOReactor ioReactor = new DefaultListeningIOReactor(); try { ioReactor.listen(new InetSocketAddress(8080)); ioReactor.execute(ioEventDispatch); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOConnPool.java Fri Aug 12 10:35:32 2011 @@ -26,42 +26,23 @@ */ package org.apache.http.impl.nio.pool; -import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.concurrent.atomic.AtomicLong; -import org.apache.http.HttpConnection; import org.apache.http.HttpHost; -import org.apache.http.HttpResponseFactory; import org.apache.http.annotation.ThreadSafe; -import org.apache.http.impl.DefaultHttpResponseFactory; -import org.apache.http.impl.nio.DefaultNHttpClientConnection; -import org.apache.http.nio.NHttpClientConnection; import org.apache.http.nio.pool.AbstractNIOConnPool; import org.apache.http.nio.reactor.ConnectingIOReactor; import org.apache.http.nio.reactor.IOSession; -import org.apache.http.nio.util.ByteBufferAllocator; -import org.apache.http.nio.util.HeapByteBufferAllocator; -import org.apache.http.params.HttpParams; @ThreadSafe -public class BasicNIOConnPool extends AbstractNIOConnPool { +public class BasicNIOConnPool extends AbstractNIOConnPool { private static AtomicLong COUNTER = new AtomicLong(); - private final HttpResponseFactory responseFactory; - private final ByteBufferAllocator allocator; - private final HttpParams params; - - public BasicNIOConnPool(final ConnectingIOReactor ioreactor, final HttpParams params) { + public BasicNIOConnPool(final ConnectingIOReactor ioreactor) { super(ioreactor, 2, 20); - if (params == null) { - throw new IllegalArgumentException("HTTP params may not be null"); - } - this.responseFactory = new DefaultHttpResponseFactory(); - this.allocator = new HeapByteBufferAllocator(); - this.params = params; } @Override @@ -75,23 +56,19 @@ public class BasicNIOConnPool extends Ab } @Override - protected NHttpClientConnection createConnection(final HttpHost route, final IOSession session) { - return new DefaultNHttpClientConnection(session, - this.responseFactory, this.allocator, this.params); + protected IOSession createConnection(final HttpHost route, final IOSession session) { + return session; } @Override - protected BasicNIOPoolEntry createEntry(final HttpHost host, final NHttpClientConnection conn) { + protected BasicNIOPoolEntry createEntry(final HttpHost host, final IOSession conn) { return new BasicNIOPoolEntry(Long.toString(COUNTER.getAndIncrement()), host, conn); } @Override protected void closeEntry(final BasicNIOPoolEntry entry) { - HttpConnection conn = entry.getConnection(); - try { - conn.close(); - } catch (IOException ignore) { - } + IOSession iosession = entry.getConnection(); + iosession.shutdown(); } } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/pool/BasicNIOPoolEntry.java Fri Aug 12 10:35:32 2011 @@ -28,13 +28,13 @@ package org.apache.http.impl.nio.pool; import org.apache.http.HttpHost; import org.apache.http.annotation.ThreadSafe; -import org.apache.http.nio.NHttpClientConnection; +import org.apache.http.nio.reactor.IOSession; import org.apache.http.pool.PoolEntry; @ThreadSafe -public class BasicNIOPoolEntry extends PoolEntry { +public class BasicNIOPoolEntry extends PoolEntry { - public BasicNIOPoolEntry(final String id, final HttpHost route, final NHttpClientConnection conn) { + public BasicNIOPoolEntry(final String id, final HttpHost route, final IOSession conn) { super(id, route, conn); } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractMultiworkerIOReactor.java Fri Aug 12 10:35:32 2011 @@ -50,6 +50,7 @@ import org.apache.http.nio.reactor.IORea import org.apache.http.nio.reactor.IOReactorException; import org.apache.http.nio.reactor.IOReactorExceptionHandler; import org.apache.http.nio.reactor.IOReactorStatus; +import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; @@ -104,12 +105,15 @@ import org.apache.http.params.HttpParams * * @since 4.0 */ +@SuppressWarnings("deprecation") @ThreadSafe // public methods only public abstract class AbstractMultiworkerIOReactor implements IOReactor { protected volatile IOReactorStatus status; + @Deprecated protected final HttpParams params; + protected final IOReactorConfig config; protected final Selector selector; protected final long selectTimeout; protected final boolean interestOpsQueueing; @@ -127,46 +131,97 @@ public abstract class AbstractMultiworke private int currentWorker = 0; /** - * Creates an instance of AbstractMultiworkerIOReactor. + * Creates an instance of AbstractMultiworkerIOReactor with the given configuration. * - * @param workerCount number of worker I/O reactors. + * @param config I/O reactor configuration. * @param threadFactory the factory to create threads. * Can be null. - * @param params HTTP parameters. * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 */ public AbstractMultiworkerIOReactor( - int workerCount, - final ThreadFactory threadFactory, - final HttpParams params) throws IOReactorException { + final IOReactorConfig config, + final ThreadFactory threadFactory) throws IOReactorException { super(); - if (workerCount <= 0) { - throw new IllegalArgumentException("Worker count may not be negative or zero"); - } - if (params == null) { - throw new IllegalArgumentException("HTTP parameters may not be null"); + if (config != null) { + try { + this.config = config.clone(); + } catch (CloneNotSupportedException ex) { + throw new IOReactorException("Unable to clone configuration"); + } + } else { + this.config = new IOReactorConfig(); } + this.params = new BasicHttpParams(); try { this.selector = Selector.open(); } catch (IOException ex) { throw new IOReactorException("Failure opening selector", ex); } - this.params = params; - this.selectTimeout = NIOReactorParams.getSelectInterval(params); - this.interestOpsQueueing = NIOReactorParams.getInterestOpsQueueing(params); + this.selectTimeout = this.config.getSelectInterval(); + this.interestOpsQueueing = this.config.isInterestOpQueued(); this.statusLock = new Object(); - this.workerCount = workerCount; if (threadFactory != null) { this.threadFactory = threadFactory; } else { this.threadFactory = new DefaultThreadFactory(); } + this.workerCount = this.config.getIoThreadCount(); this.dispatchers = new BaseIOReactor[workerCount]; this.workers = new Worker[workerCount]; this.threads = new Thread[workerCount]; this.status = IOReactorStatus.INACTIVE; } + /** + * Creates an instance of AbstractMultiworkerIOReactor with default configuration. + * + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ + public AbstractMultiworkerIOReactor() throws IOReactorException { + this(null, null); + } + + static IOReactorConfig convert(int workerCount, final HttpParams params) { + if (params == null) { + throw new IllegalArgumentException("HTTP parameters may not be null"); + } + IOReactorConfig config = new IOReactorConfig(); + config.setSelectInterval(NIOReactorParams.getSelectInterval(params)); + config.setShutdownGracePeriod(NIOReactorParams.getGracePeriod(params)); + config.setInterestOpQueued(NIOReactorParams.getInterestOpsQueueing(params)); + config.setIoThreadCount(workerCount); + config.setTcpNoDelay(HttpConnectionParams.getTcpNoDelay(params)); + config.setSoTimeout(HttpConnectionParams.getSoTimeout(params)); + config.setSoLinger(HttpConnectionParams.getLinger(params)); + config.setConnectTimeout(HttpConnectionParams.getConnectionTimeout(params)); + config.setSoReuseAddress(HttpConnectionParams.getSoReuseaddr(params)); + + return config; + } + + /** + * Creates an instance of AbstractMultiworkerIOReactor. + * + * @param workerCount number of worker I/O reactors. + * @param threadFactory the factory to create threads. + * Can be null. + * @param params HTTP parameters. + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @deprecated use {@link AbstractMultiworkerIOReactor#AbstractMultiworkerIOReactor(IOReactorConfig, ThreadFactory)} + */ + @Deprecated + public AbstractMultiworkerIOReactor( + int workerCount, + final ThreadFactory threadFactory, + final HttpParams params) throws IOReactorException { + this(convert(workerCount, params), threadFactory); + } + public IOReactorStatus getStatus() { return this.status; } @@ -400,7 +455,7 @@ public abstract class AbstractMultiworke dispatcher.gracefulShutdown(); } - long gracePeriod = NIOReactorParams.getGracePeriod(this.params); + long gracePeriod = this.config.getShutdownGracePeriod(); try { // Force shut down I/O dispatchers if they fail to terminate @@ -463,9 +518,9 @@ public abstract class AbstractMultiworke * @throws IOException in case of an I/O error. */ protected void prepareSocket(final Socket socket) throws IOException { - socket.setTcpNoDelay(HttpConnectionParams.getTcpNoDelay(this.params)); - socket.setSoTimeout(HttpConnectionParams.getSoTimeout(this.params)); - int linger = HttpConnectionParams.getLinger(this.params); + socket.setTcpNoDelay(this.config.isTcpNoDelay()); + socket.setSoTimeout(this.config.getSoTimeout()); + int linger = this.config.getSoLinger(); if (linger >= 0) { socket.setSoLinger(linger > 0, linger); } Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultConnectingIOReactor.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultConnectingIOReactor.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultConnectingIOReactor.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultConnectingIOReactor.java Fri Aug 12 10:35:32 2011 @@ -47,26 +47,12 @@ import org.apache.http.nio.reactor.IORea import org.apache.http.nio.reactor.IOReactorStatus; import org.apache.http.nio.reactor.SessionRequest; import org.apache.http.nio.reactor.SessionRequestCallback; -import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; /** * Default implementation of {@link ConnectingIOReactor}. This class extends * {@link AbstractMultiworkerIOReactor} with capability to connect to remote * hosts. - *

- * The following parameters can be used to customize the behavior of this - * class: - *

    - *
  • {@link org.apache.http.params.CoreConnectionPNames#TCP_NODELAY}
  • - *
  • {@link org.apache.http.params.CoreConnectionPNames#SO_TIMEOUT}
  • - *
  • {@link org.apache.http.params.CoreConnectionPNames#CONNECTION_TIMEOUT}
  • - *
  • {@link org.apache.http.params.CoreConnectionPNames#SO_LINGER}
  • - *
  • {@link org.apache.http.params.CoreConnectionPNames#SO_REUSEADDR}
  • - *
  • {@link org.apache.http.nio.params.NIOReactorPNames#SELECT_INTERVAL}
  • - *
  • {@link org.apache.http.nio.params.NIOReactorPNames#GRACE_PERIOD}
  • - *
  • {@link org.apache.http.nio.params.NIOReactorPNames#INTEREST_OPS_QUEUEING}
  • - *
* * @since 4.0 */ @@ -78,19 +64,65 @@ public class DefaultConnectingIOReactor private long lastTimeoutCheck; + /** + * Creates an instance of DefaultConnectingIOReactor with the given configuration. + * + * @param config I/O reactor configuration. + * @param threadFactory the factory to create threads. + * Can be null. + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ + public DefaultConnectingIOReactor( + final IOReactorConfig config, + final ThreadFactory threadFactory) throws IOReactorException { + super(config, threadFactory); + this.requestQueue = new ConcurrentLinkedQueue(); + this.lastTimeoutCheck = System.currentTimeMillis(); + } + + /** + * Creates an instance of DefaultConnectingIOReactor with the given configuration. + * + * @param config I/O reactor configuration. + * Can be null. + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ + public DefaultConnectingIOReactor(final IOReactorConfig config) throws IOReactorException { + this(config, null); + } + + /** + * Creates an instance of DefaultConnectingIOReactor with default configuration. + * + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ + public DefaultConnectingIOReactor() throws IOReactorException { + this(null, null); + } + + /** + * @deprecated use {@link DefaultConnectingIOReactor#DefaultConnectingIOReactor(IOReactorConfig, ThreadFactory)} + */ public DefaultConnectingIOReactor( int workerCount, final ThreadFactory threadFactory, final HttpParams params) throws IOReactorException { - super(workerCount, threadFactory, params); - this.requestQueue = new ConcurrentLinkedQueue(); - this.lastTimeoutCheck = System.currentTimeMillis(); + this(convert(workerCount, params), threadFactory); } + /** + * @deprecated use {@link DefaultConnectingIOReactor#DefaultConnectingIOReactor(IOReactorConfig)} + */ public DefaultConnectingIOReactor( int workerCount, final HttpParams params) throws IOReactorException { - this(workerCount, null, params); + this(convert(workerCount, params), null); } @Override @@ -196,7 +228,7 @@ public class DefaultConnectingIOReactor } SessionRequestImpl sessionRequest = new SessionRequestImpl( remoteAddress, localAddress, attachment, callback); - sessionRequest.setConnectTimeout(HttpConnectionParams.getConnectionTimeout(this.params)); + sessionRequest.setConnectTimeout(this.config.getConnectTimeout()); this.requestQueue.add(sessionRequest); this.selector.wakeup(); @@ -235,7 +267,7 @@ public class DefaultConnectingIOReactor if (request.getLocalAddress() != null) { Socket sock = socketChannel.socket(); - sock.setReuseAddress(HttpConnectionParams.getSoReuseaddr(this.params)); + sock.setReuseAddress(this.config.isSoReuseAddress()); sock.bind(request.getLocalAddress()); } boolean connected = socketChannel.connect(request.getRemoteAddress()); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultListeningIOReactor.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultListeningIOReactor.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultListeningIOReactor.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/DefaultListeningIOReactor.java Fri Aug 12 10:35:32 2011 @@ -52,17 +52,6 @@ import org.apache.http.params.HttpParams * Default implementation of {@link ListeningIOReactor}. This class extends * {@link AbstractMultiworkerIOReactor} with capability to listen for incoming * connections. - *

- * The following parameters can be used to customize the behavior of this - * class: - *

    - *
  • {@link org.apache.http.params.CoreConnectionPNames#TCP_NODELAY}
  • - *
  • {@link org.apache.http.params.CoreConnectionPNames#SO_TIMEOUT}
  • - *
  • {@link org.apache.http.params.CoreConnectionPNames#SO_LINGER}
  • - *
  • {@link org.apache.http.nio.params.NIOReactorPNames#SELECT_INTERVAL}
  • - *
  • {@link org.apache.http.nio.params.NIOReactorPNames#GRACE_PERIOD}
  • - *
  • {@link org.apache.http.nio.params.NIOReactorPNames#INTEREST_OPS_QUEUEING}
  • - *
* * @since 4.0 */ @@ -76,22 +65,67 @@ public class DefaultListeningIOReactor e private volatile boolean paused; + /** + * Creates an instance of DefaultListeningIOReactor with the given configuration. + * + * @param config I/O reactor configuration. + * @param threadFactory the factory to create threads. + * Can be null. + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ public DefaultListeningIOReactor( - int workerCount, - final ThreadFactory threadFactory, - final HttpParams params) throws IOReactorException { - super(workerCount, threadFactory, params); + final IOReactorConfig config, + final ThreadFactory threadFactory) throws IOReactorException { + super(config, threadFactory); this.requestQueue = new ConcurrentLinkedQueue(); this.endpoints = Collections.synchronizedSet(new HashSet()); this.pausedEndpoints = new HashSet(); } + /** + * Creates an instance of DefaultListeningIOReactor with the given configuration. + * + * @param config I/O reactor configuration. + * Can be null. + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ + public DefaultListeningIOReactor(final IOReactorConfig config) throws IOReactorException { + this(config, null); + } + + /** + * Creates an instance of DefaultListeningIOReactor with default configuration. + * + * @throws IOReactorException in case if a non-recoverable I/O error. + * + * @since 4.2 + */ + public DefaultListeningIOReactor() throws IOReactorException { + this(null, null); + } + + /** + * @deprecated use {@link DefaultListeningIOReactor#DefaultListeningIOReactor(IOReactorConfig, ThreadFactory)} + */ public DefaultListeningIOReactor( int workerCount, + final ThreadFactory threadFactory, final HttpParams params) throws IOReactorException { - this(workerCount, null, params); + this(convert(workerCount, params), threadFactory); } + /** + * @deprecated use {@link DefaultListeningIOReactor#DefaultListeningIOReactor(IOReactorConfig)} + */ + public DefaultListeningIOReactor( + int workerCount, + final HttpParams params) throws IOReactorException { + this(convert(workerCount, params), null); + } @Override protected void cancelRequests() throws IOReactorException { Added: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java?rev=1157038&view=auto ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java (added) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java Fri Aug 12 10:35:32 2011 @@ -0,0 +1,264 @@ +/* + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.http.impl.nio.reactor; + +import java.net.SocketOptions; +import java.nio.channels.SelectionKey; + +import org.apache.http.annotation.NotThreadSafe; + +/** + * I/O reactor configuration parameters. + * + * @since 4.2 + */ +@NotThreadSafe +public final class IOReactorConfig implements Cloneable { + + private long selectInterval; + private long shutdownGracePeriod; + private boolean interestOpQueued; + private int ioThreadCount; + private int soTimeout; + private boolean soReuseAddress; + private int soLinger; + private boolean tcpNoDelay; + private int connectTimeout; + + public IOReactorConfig() { + super(); + this.selectInterval = 1000; + this.shutdownGracePeriod = 500; + this.interestOpQueued = false; + this.ioThreadCount = 2; + this.soTimeout = 0; + this.soReuseAddress = false; + this.soLinger = -1; + this.tcpNoDelay = false; + this.connectTimeout = 0; + } + + /** + * Determines time interval in milliseconds at which the I/O reactor wakes up to check for + * timed out sessions and session requests. + *

+ * Default: 1000 milliseconds. + */ + public long getSelectInterval() { + return this.selectInterval; + } + + /** + * Defines time interval in milliseconds at which the I/O reactor wakes up to check for + * timed out sessions and session requests. May not be negative or zero. + */ + public void setSelectInterval(long selectInterval) { + if (selectInterval <= 0) { + throw new IllegalArgumentException("Select internal may not be negative or zero"); + } + this.selectInterval = selectInterval; + } + + /** + * Determines grace period in milliseconds the I/O reactors are expected to block waiting + * for individual worker threads to terminate cleanly. + *

+ * Default: 500 milliseconds. + */ + public long getShutdownGracePeriod() { + return this.shutdownGracePeriod; + } + + /** + * Defines grace period in milliseconds the I/O reactors are expected to block waiting + * for individual worker threads to terminate cleanly. May not be negative or zero. + */ + public void setShutdownGracePeriod(long gracePeriod) { + if (gracePeriod <= 0) { + throw new IllegalArgumentException("Shutdown grace period may not be negative or zero"); + } + this.shutdownGracePeriod = gracePeriod; + } + + /** + * Determines whether or not I/O interest operations are to be queued and executed + * asynchronously by the I/O reactor thread or to be applied to the underlying + * {@link SelectionKey} immediately. + *

+ * Default: false + * + * @see {@link SelectionKey} + * @see {@link SelectionKey#interestOps()} + * @see {@link SelectionKey#interestOps(int)} + */ + public boolean isInterestOpQueued() { + return this.interestOpQueued; + } + + /** + * Defines whether or not I/O interest operations are to be queued and executed + * asynchronously by the I/O reactor thread or to be applied to the underlying + * {@link SelectionKey} immediately. + * + * @see {@link SelectionKey} + * @see {@link SelectionKey#interestOps()} + * @see {@link SelectionKey#interestOps(int)} + */ + public void setInterestOpQueued(boolean interestOpQueued) { + this.interestOpQueued = interestOpQueued; + } + + /** + * Determines the number of I/O dispatch threads to be used by the I/O reactor. + *

+ * Default: 2 + */ + public int getIoThreadCount() { + return this.ioThreadCount; + } + + /** + * Defines the number of I/O dispatch threads to be used by the I/O reactor. + * May not be negative or zero. + */ + public void setIoThreadCount(int ioThreadCount) { + if (ioThreadCount <= 0) { + throw new IllegalArgumentException("I/O thread count may not be negative or zero"); + } + this.ioThreadCount = ioThreadCount; + } + + /** + * Determines the default socket timeout value for non-blocking I/O operations. + *

+ * Default: 0 (no timeout) + */ + public int getSoTimeout() { + return soTimeout; + } + + /** + * Defines the default socket timeout value for non-blocking I/O operations. + *

+ * Default: 0 (no timeout) + */ + public void setSoTimeout(int soTimeout) { + this.soTimeout = soTimeout; + } + + /** + * Determines the default value of the {@link SocketOptions#SO_REUSEADDR} parameter + * for newly created sockets. + *

+ * Default: false + */ + public boolean isSoReuseAddress() { + return soReuseAddress; + } + + /** + * Defines the default value of the {@link SocketOptions#SO_REUSEADDR} parameter + * for newly created sockets. + */ + public void setSoReuseAddress(boolean soReuseAddress) { + this.soReuseAddress = soReuseAddress; + } + + /** + * Determines the default value of the {@link SocketOptions#SO_LINGER} parameter + * for newly created sockets. + *

+ * Default: -1 + */ + public int getSoLinger() { + return soLinger; + } + + /** + * Defines the default value of the {@link SocketOptions#SO_LINGER} parameter + * for newly created sockets. + */ + public void setSoLinger(int soLinger) { + this.soLinger = soLinger; + } + + /** + * Determines the default value of the {@link SocketOptions#TCP_NODELAY} parameter + * for newly created sockets. + *

+ * Default: false + */ + public boolean isTcpNoDelay() { + return tcpNoDelay; + } + + /** + * Defines the default value of the {@link SocketOptions#TCP_NODELAY} parameter + * for newly created sockets. + */ + public void setTcpNoDelay(boolean tcpNoDelay) { + this.tcpNoDelay = tcpNoDelay; + } + + /** + * Determines the default connect timeout value for non-blocking connection requests. + *

+ * Default: 0 (no timeout) + */ + public int getConnectTimeout() { + return connectTimeout; + } + + /** + * Defines the default connect timeout value for non-blocking connection requests. + */ + public void setConnectTimeout(int connectTimeout) { + this.connectTimeout = connectTimeout; + } + + @Override + protected IOReactorConfig clone() throws CloneNotSupportedException { + return (IOReactorConfig) super.clone(); + } + + @Override + public String toString() { + StringBuilder builder = new StringBuilder(); + builder.append("[selectInterval=").append(this.selectInterval) + .append(", shutdownGracePeriod=").append(this.shutdownGracePeriod) + .append(", interestOpQueued=").append(this.interestOpQueued) + .append(", ioThreadCount=").append(this.ioThreadCount) + .append(", soTimeout=").append(this.soTimeout) + .append(", soReuseAddress=").append(this.soReuseAddress) + .append(", soLinger=").append(this.soLinger) + .append(", tcpNoDelay=").append(this.tcpNoDelay) + .append(", connectTimeout=").append(this.connectTimeout).append("]"); + return builder.toString(); + } + +} Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/reactor/IOReactorConfig.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorPNames.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorPNames.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorPNames.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorPNames.java Fri Aug 12 10:35:32 2011 @@ -27,11 +27,16 @@ package org.apache.http.nio.params; +import org.apache.http.impl.nio.reactor.IOReactorConfig; + /** * Parameter names for I/O reactors. * * @since 4.0 + * + * @deprecated use {@link IOReactorConfig} */ +@Deprecated public interface NIOReactorPNames { /** Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParamBean.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParamBean.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParamBean.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParamBean.java Fri Aug 12 10:35:32 2011 @@ -27,12 +27,16 @@ package org.apache.http.nio.params; +import org.apache.http.impl.nio.reactor.IOReactorConfig; import org.apache.http.params.HttpAbstractParamBean; import org.apache.http.params.HttpParams; /** * @since 4.0 + * + * @deprecated use {@link IOReactorConfig} */ +@Deprecated public class NIOReactorParamBean extends HttpAbstractParamBean { public NIOReactorParamBean (final HttpParams params) { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParams.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParams.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParams.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/params/NIOReactorParams.java Fri Aug 12 10:35:32 2011 @@ -27,6 +27,7 @@ package org.apache.http.nio.params; +import org.apache.http.impl.nio.reactor.IOReactorConfig; import org.apache.http.params.HttpParams; /** @@ -35,7 +36,10 @@ import org.apache.http.params.HttpParams * @since 4.0 * * @see NIOReactorPNames + * + * @deprecated use {@link IOReactorConfig} */ +@Deprecated public final class NIOReactorParams implements NIOReactorPNames { private NIOReactorParams() { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpClientHandler.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpClientHandler.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpClientHandler.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpClientHandler.java Fri Aug 12 10:35:32 2011 @@ -88,12 +88,15 @@ import org.apache.http.protocol.HttpProc * The following parameters can be used to customize the behavior of this * class: *

    - *
  • {@link org.apache.http.params.CoreProtocolPNames#WAIT_FOR_CONTINUE}
  • *
  • {@link org.apache.http.nio.params.NIOReactorPNames#CONTENT_BUFFER_SIZE}
  • + *
  • {@link org.apache.http.params.CoreProtocolPNames#WAIT_FOR_CONTINUE}
  • *
* * @since 4.0 + * + * @deprecated Use {@link AsyncNHttpClientHandler} */ +@Deprecated @ThreadSafe // provided injected dependencies are immutable or thread safe public class ThrottlingHttpClientHandler extends NHttpHandlerBase implements NHttpClientHandler { @@ -101,6 +104,8 @@ public class ThrottlingHttpClientHandler protected HttpRequestExecutionHandler execHandler; protected final Executor executor; + private final int bufsize; + public ThrottlingHttpClientHandler( final HttpProcessor httpProcessor, final HttpRequestExecutionHandler execHandler, @@ -117,6 +122,7 @@ public class ThrottlingHttpClientHandler } this.execHandler = execHandler; this.executor = executor; + this.bufsize = this.params.getIntParameter(NIOReactorPNames.CONTENT_BUFFER_SIZE, 20480); } public ThrottlingHttpClientHandler( @@ -134,9 +140,7 @@ public class ThrottlingHttpClientHandler initialize(conn, attachment); - int bufsize = this.params.getIntParameter( - NIOReactorPNames.CONTENT_BUFFER_SIZE, 20480); - ClientConnState connState = new ClientConnState(bufsize, conn, this.allocator); + ClientConnState connState = new ClientConnState(this.bufsize, conn, this.allocator); context.setAttribute(CONN_STATE, connState); if (this.eventListener != null) { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpServiceHandler.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpServiceHandler.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpServiceHandler.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/protocol/ThrottlingHttpServiceHandler.java Fri Aug 12 10:35:32 2011 @@ -95,12 +95,18 @@ import org.apache.http.util.EntityUtils; * will have to block only when processing large messages and the shared buffer * fills up. It is generally advisable to allocate shared buffers of a size of * an average content body for optimal performance. - * - * @see NIOReactorPNames#CONTENT_BUFFER_SIZE - * + *

+ * The following parameters can be used to customize the behavior of this + * class: + *

    + *
  • {@link org.apache.http.nio.params.NIOReactorPNames#CONTENT_BUFFER_SIZE}
  • + *
  • {@link org.apache.http.params.CoreProtocolPNames#WAIT_FOR_CONTINUE}
  • + *
* * @since 4.0 + * @deprecated Use {@link AsyncNHttpServiceHandler} */ +@Deprecated @ThreadSafe // provided injected dependencies are immutable or thread safe public class ThrottlingHttpServiceHandler extends NHttpHandlerBase implements NHttpServiceHandler { @@ -111,6 +117,8 @@ public class ThrottlingHttpServiceHandle protected HttpRequestHandlerResolver handlerResolver; protected HttpExpectationVerifier expectationVerifier; + private final int bufsize; + public ThrottlingHttpServiceHandler( final HttpProcessor httpProcessor, final HttpResponseFactory responseFactory, @@ -127,6 +135,7 @@ public class ThrottlingHttpServiceHandle } this.responseFactory = responseFactory; this.executor = executor; + this.bufsize = this.params.getIntParameter(NIOReactorPNames.CONTENT_BUFFER_SIZE, 20480); } public ThrottlingHttpServiceHandler( @@ -150,9 +159,7 @@ public class ThrottlingHttpServiceHandle public void connected(final NHttpServerConnection conn) { HttpContext context = conn.getContext(); - int bufsize = this.params.getIntParameter( - NIOReactorPNames.CONTENT_BUFFER_SIZE, 20480); - ServerConnState connState = new ServerConnState(bufsize, conn, allocator); + ServerConnState connState = new ServerConnState(this.bufsize, conn, allocator); context.setAttribute(CONN_STATE, connState); if (this.eventListener != null) { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/pool/TestBasicNIOConnPool.java Fri Aug 12 10:35:32 2011 @@ -28,10 +28,8 @@ package org.apache.http.impl.nio.pool; import org.apache.http.HttpHost; -import org.apache.http.nio.NHttpClientConnection; import org.apache.http.nio.reactor.ConnectingIOReactor; import org.apache.http.nio.reactor.IOSession; -import org.apache.http.params.HttpParams; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -41,9 +39,8 @@ import org.mockito.MockitoAnnotations; public class TestBasicNIOConnPool { private BasicNIOConnPool pool; - @Mock private ConnectingIOReactor reactor; - @Mock private HttpParams params; private HttpHost route; + @Mock private ConnectingIOReactor reactor; @Mock private IOSession session; @Before @@ -52,7 +49,7 @@ public class TestBasicNIOConnPool { route = new HttpHost("localhost", 80, "http"); - pool = new BasicNIOConnPool(reactor, params); + pool = new BasicNIOConnPool(reactor); } @After @@ -61,7 +58,7 @@ public class TestBasicNIOConnPool { @Test(expected=IllegalArgumentException.class) public void testNullConstructor() throws Exception { - pool = new BasicNIOConnPool(null, null); + pool = new BasicNIOConnPool(null); } @Test @@ -71,7 +68,7 @@ public class TestBasicNIOConnPool { @Test public void testCreateEntry() throws Exception { - NHttpClientConnection conn = pool.createConnection(route, session); + IOSession conn = pool.createConnection(route, session); BasicNIOPoolEntry entry = pool.createEntry(route, conn); pool.closeEntry(entry); Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/reactor/TestDefaultListeningIOReactor.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/reactor/TestDefaultListeningIOReactor.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/reactor/TestDefaultListeningIOReactor.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/impl/nio/reactor/TestDefaultListeningIOReactor.java Fri Aug 12 10:35:32 2011 @@ -82,7 +82,9 @@ public class TestDefaultListeningIOReact serviceHandler, params); - final ListeningIOReactor ioreactor = new DefaultListeningIOReactor(1, params); + IOReactorConfig config = new IOReactorConfig(); + config.setIoThreadCount(1); + final ListeningIOReactor ioreactor = new DefaultListeningIOReactor(config); Thread t = new Thread(new Runnable() { @@ -149,7 +151,9 @@ public class TestDefaultListeningIOReact serviceHandler, params); - final ListeningIOReactor ioreactor = new DefaultListeningIOReactor(1, params); + IOReactorConfig config = new IOReactorConfig(); + config.setIoThreadCount(1); + final ListeningIOReactor ioreactor = new DefaultListeningIOReactor(config); final CountDownLatch latch = new CountDownLatch(1); @@ -211,7 +215,9 @@ public class TestDefaultListeningIOReact serviceHandler, params); - final DefaultListeningIOReactor ioreactor = new DefaultListeningIOReactor(1, params); + IOReactorConfig config = new IOReactorConfig(); + config.setIoThreadCount(1); + final DefaultListeningIOReactor ioreactor = new DefaultListeningIOReactor(config); ioreactor.setExceptionHandler(new IOReactorExceptionHandler() { Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java?rev=1157038&r1=1157037&r2=1157038&view=diff ============================================================================== --- httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java (original) +++ httpcomponents/httpcore/trunk/httpcore-nio/src/test/java/org/apache/http/nio/protocol/TestThrottlingNHttpHandlers.java Fri Aug 12 10:35:32 2011 @@ -90,12 +90,14 @@ import org.apache.http.util.EncodingUtil import org.junit.After; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; /** * HttpCore NIO integration tests using throttling versions of the * protocol handlers. */ +@Deprecated public class TestThrottlingNHttpHandlers extends HttpCoreNIOTestBase { private ExecutorService execService; @@ -275,7 +277,7 @@ public class TestThrottlingNHttpHandlers * (under the control of a ThrottlingHttpServiceHandler) * terminates when a connection timeout occurs. */ - @Test + @Test @Ignore public void testExecutorTermination() throws Exception { final int SHORT_TIMEOUT = 100; final int DEFAULT_SERVER_SO_TIMEOUT = 60000;