You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by se...@apache.org on 2009/02/14 17:38:14 UTC
svn commit: r744516 - in /httpcomponents/httpcore/trunk:
module-main/src/examples/org/apache/http/examples/
module-nio/src/examples/org/apache/http/examples/nio/
Author: sebb
Date: Sat Feb 14 16:38:14 2009
New Revision: 744516
URL: http://svn.apache.org/viewvc?rev=744516&view=rev
Log:
Remove @author tags (following vote by PMC)
Modified:
httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpGet.java
httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpPost.java
httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpServer.java
httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalReverseProxy.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClientConnManagement.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpFileServer.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java
httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java
Modified: httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpGet.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpGet.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpGet.java (original)
+++ httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpGet.java Sat Feb 14 16:38:14 2009
@@ -61,7 +61,6 @@
* 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 client.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
*
* <!-- empty lines above to avoid 'svn diff' context problems -->
Modified: httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpPost.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpPost.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpPost.java (original)
+++ httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpPost.java Sat Feb 14 16:38:14 2009
@@ -66,7 +66,6 @@
* 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 client.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
*
* <!-- empty lines above to avoid 'svn diff' context problems -->
Modified: httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpServer.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpServer.java (original)
+++ httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalHttpServer.java Sat Feb 14 16:38:14 2009
@@ -78,7 +78,6 @@
* 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 file server.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/
Modified: httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalReverseProxy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalReverseProxy.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalReverseProxy.java (original)
+++ httpcomponents/httpcore/trunk/module-main/src/examples/org/apache/http/examples/ElementalReverseProxy.java Sat Feb 14 16:38:14 2009
@@ -78,7 +78,6 @@
* 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.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision: $
*/
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java Sat Feb 14 16:38:14 2009
@@ -72,7 +72,6 @@
* 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 client.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClientConnManagement.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClientConnManagement.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClientConnManagement.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClientConnManagement.java Sat Feb 14 16:38:14 2009
@@ -1,576 +1,575 @@
-/*
- * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java $
- * $Revision: 741603 $
- * $Date: 2009-02-06 16:57:10 +0100 (Fri, 06 Feb 2009) $
- *
- * ====================================================================
- * 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
- * <http://www.apache.org/>.
- *
- */
-package org.apache.http.examples.nio;
-
-import java.io.IOException;
-import java.io.InterruptedIOException;
-import java.net.InetSocketAddress;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.Queue;
-import java.util.Set;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpException;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpRequest;
-import org.apache.http.HttpResponse;
-import org.apache.http.HttpVersion;
-import org.apache.http.impl.DefaultConnectionReuseStrategy;
-import org.apache.http.impl.nio.DefaultClientIOEventDispatch;
-import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
-import org.apache.http.message.BasicHttpRequest;
-import org.apache.http.nio.ContentDecoder;
-import org.apache.http.nio.ContentEncoder;
-import org.apache.http.nio.NHttpClientConnection;
-import org.apache.http.nio.NHttpClientHandler;
-import org.apache.http.nio.NHttpConnection;
-import org.apache.http.nio.protocol.BufferingHttpClientHandler;
-import org.apache.http.nio.protocol.EventListener;
-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.IOReactorException;
-import org.apache.http.nio.reactor.SessionRequest;
-import org.apache.http.nio.reactor.SessionRequestCallback;
-import org.apache.http.params.BasicHttpParams;
-import org.apache.http.params.CoreConnectionPNames;
-import org.apache.http.params.CoreProtocolPNames;
-import org.apache.http.params.HttpParams;
-import org.apache.http.protocol.BasicHttpProcessor;
-import org.apache.http.protocol.HttpContext;
-import org.apache.http.protocol.RequestConnControl;
-import org.apache.http.protocol.RequestContent;
-import org.apache.http.protocol.RequestExpectContinue;
-import org.apache.http.protocol.RequestTargetHost;
-import org.apache.http.protocol.RequestUserAgent;
-import org.apache.http.util.EntityUtils;
-
-/**
- * Example of a very simple asynchronous connection manager that maintains a pool of persistent
- * connections to one target host.
- * <p>
- * 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 client.
- *
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
- *
- * @version $Revision:$
- */
-public class NHttpClientConnManagement {
-
- public static void main(String[] args) throws Exception {
- HttpParams params = new BasicHttpParams();
- params
- .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
- .setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
- .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
- .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
- .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
- .setParameter(CoreProtocolPNames.USER_AGENT, "HttpComponents/1.1");
-
- BasicHttpProcessor httpproc = new BasicHttpProcessor();
- httpproc.addInterceptor(new RequestContent());
- httpproc.addInterceptor(new RequestTargetHost());
- httpproc.addInterceptor(new RequestConnControl());
- httpproc.addInterceptor(new RequestUserAgent());
- httpproc.addInterceptor(new RequestExpectContinue());
-
- // Set up protocol handler
- BufferingHttpClientHandler protocolHandler = new BufferingHttpClientHandler(
- httpproc,
- new MyHttpRequestExecutionHandler(),
- new DefaultConnectionReuseStrategy(),
- params);
- protocolHandler.setEventListener(new EventLogger());
-
- // Limit the total maximum of concurrent connections to 5
- int maxTotalConnections = 5;
-
- // Use the connection manager to maintain a pool of connections to localhost:8080
- final AsyncConnectionManager connMgr = new AsyncConnectionManager(
- new HttpHost("localhost", 8080),
- maxTotalConnections,
- protocolHandler,
- params);
-
- // Start the I/O reactor in a separate thread
- Thread t = new Thread(new Runnable() {
-
- public void run() {
- try {
- connMgr.execute();
- } catch (InterruptedIOException ex) {
- System.err.println("Interrupted");
- } catch (IOException e) {
- System.err.println("I/O error: " + e.getMessage());
- }
- System.out.println("I/O reactor terminated");
- }
-
- });
- t.start();
-
- // Submit 50 requests using maximum 5 concurrent connections
- Queue<RequestHandle> queue = new LinkedList<RequestHandle>();
- for (int i = 0; i < 50; i++) {
- AsyncConnectionRequest connRequest = connMgr.requestConnection();
- connRequest.waitFor();
- NHttpClientConnection conn = connRequest.getConnection();
- if (conn == null) {
- System.err.println("Failed to obtain connection");
- break;
- }
-
- HttpContext context = conn.getContext();
- BasicHttpRequest httpget = new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1);
- RequestHandle handle = new RequestHandle(connMgr, conn);
-
- context.setAttribute("request", httpget);
- context.setAttribute("request-handle", handle);
-
- queue.add(handle);
- conn.requestOutput();
- }
-
- // Wait until all requests have been completed
- while (!queue.isEmpty()) {
- RequestHandle handle = queue.remove();
- handle.waitFor();
- }
-
- // Give the I/O reactor 10 sec to shut down
- connMgr.shutdown(10000);
- System.out.println("Done");
- }
-
- static class MyHttpRequestExecutionHandler implements HttpRequestExecutionHandler {
-
- public MyHttpRequestExecutionHandler() {
- super();
- }
-
- public void initalizeContext(final HttpContext context, final Object attachment) {
- }
-
- public void finalizeContext(final HttpContext context) {
- RequestHandle handle = (RequestHandle) context.removeAttribute("request-handle");
- if (handle != null) {
- handle.cancel();
- }
- }
-
- public HttpRequest submitRequest(final HttpContext context) {
- HttpRequest request = (HttpRequest) context.removeAttribute("request");
- return request;
- }
-
- public void handleResponse(final HttpResponse response, final HttpContext context) {
- HttpEntity entity = response.getEntity();
- try {
- String content = EntityUtils.toString(entity);
-
- System.out.println("--------------");
- System.out.println(response.getStatusLine());
- System.out.println("--------------");
- System.out.println("Document length: " + content.length());
- System.out.println("--------------");
- } catch (IOException ex) {
- System.err.println("I/O error: " + ex.getMessage());
- }
- RequestHandle handle = (RequestHandle) context.removeAttribute("request-handle");
- if (handle != null) {
- handle.completed();
- }
- }
-
- }
-
- static class AsyncConnectionRequest {
-
- private volatile boolean completed;
- private volatile NHttpClientConnection conn;
-
- public AsyncConnectionRequest() {
- super();
- }
-
- public boolean isCompleted() {
- return this.completed;
- }
-
- public void setConnection(NHttpClientConnection conn) {
- if (this.completed) {
- return;
- }
- this.completed = true;
- synchronized (this) {
- this.conn = conn;
- notifyAll();
- }
- }
-
- public NHttpClientConnection getConnection() {
- return this.conn;
- }
-
- public void cancel() {
- if (this.completed) {
- return;
- }
- this.completed = true;
- synchronized (this) {
- notifyAll();
- }
- }
-
- public void waitFor() throws InterruptedException {
- if (this.completed) {
- return;
- }
- synchronized (this) {
- while (!this.completed) {
- wait();
- }
- }
- }
-
- }
-
- static class AsyncConnectionManager {
-
- private final HttpHost target;
- private final int maxConnections;
- private final NHttpClientHandler handler;
- private final HttpParams params;
- private final ConnectingIOReactor ioreactor;
- private final Object lock;
- private final Set<NHttpClientConnection> allConns;
- private final Queue<NHttpClientConnection> availableConns;
- private final Queue<AsyncConnectionRequest> pendingRequests;
-
- private volatile boolean shutdown;
-
- public AsyncConnectionManager(
- HttpHost target,
- int maxConnections,
- NHttpClientHandler handler,
- HttpParams params) throws IOReactorException {
- super();
- this.target = target;
- this.maxConnections = maxConnections;
- this.handler = handler;
- this.params = params;
- this.lock = new Object();
- this.allConns = new HashSet<NHttpClientConnection>();
- this.availableConns = new LinkedList<NHttpClientConnection>();
- this.pendingRequests = new LinkedList<AsyncConnectionRequest>();
- this.ioreactor = new DefaultConnectingIOReactor(2, params);
- }
-
- public void execute() throws IOException {
- IOEventDispatch dispatch = new DefaultClientIOEventDispatch(
- new ManagedClientHandler(this.handler, this), this.params);
- this.ioreactor.execute(dispatch);
- }
-
- public void shutdown(long waitMs) throws IOException {
- synchronized (this.lock) {
- if (!this.shutdown) {
- this.shutdown = true;
- while (!this.pendingRequests.isEmpty()) {
- AsyncConnectionRequest request = this.pendingRequests.remove();
- request.cancel();
- }
- this.availableConns.clear();
- this.allConns.clear();
- }
- }
- this.ioreactor.shutdown(waitMs);
- }
-
- void addConnection(NHttpClientConnection conn) {
- if (conn == null) {
- return;
- }
- if (this.shutdown) {
- return;
- }
- synchronized (this.lock) {
- this.allConns.add(conn);
- }
- }
-
- void removeConnection(NHttpClientConnection conn) {
- if (conn == null) {
- return;
- }
- if (this.shutdown) {
- return;
- }
- synchronized (this.lock) {
- if (this.allConns.remove(conn)) {
- this.availableConns.remove(conn);
- }
- processRequests();
- }
- }
-
- public AsyncConnectionRequest requestConnection() {
- if (this.shutdown) {
- throw new IllegalStateException("Connection manager has been shut down");
- }
- AsyncConnectionRequest request = new AsyncConnectionRequest();
- synchronized (this.lock) {
- while (!this.availableConns.isEmpty()) {
- NHttpClientConnection conn = this.availableConns.remove();
- if (conn.isOpen()) {
- System.out.println("Re-using persistent connection");
- request.setConnection(conn);
- break;
- } else {
- this.allConns.remove(conn);
- }
- }
- if (!request.isCompleted()) {
- this.pendingRequests.add(request);
- processRequests();
- }
- }
- return request;
- }
-
- public void releaseConnection(NHttpClientConnection conn) {
- if (conn == null) {
- return;
- }
- if (this.shutdown) {
- return;
- }
- synchronized (this.lock) {
- if (this.allConns.contains(conn)) {
- if (conn.isOpen()) {
- conn.setSocketTimeout(0);
- AsyncConnectionRequest request = this.pendingRequests.poll();
- if (request != null) {
- System.out.println("Re-using persistent connection");
- request.setConnection(conn);
- } else {
- this.availableConns.add(conn);
- }
- } else {
- this.allConns.remove(conn);
- processRequests();
- }
- }
- }
- }
-
- private void processRequests() {
- while (this.allConns.size() < this.maxConnections) {
- AsyncConnectionRequest request = this.pendingRequests.poll();
- if (request == null) {
- break;
- }
- InetSocketAddress address = new InetSocketAddress(
- this.target.getHostName(),
- this.target.getPort());
- ConnRequestCallback callback = new ConnRequestCallback(request);
- System.out.println("Opening new connection");
- this.ioreactor.connect(address, null, request, callback);
- }
- }
-
- }
-
- static class ManagedClientHandler implements NHttpClientHandler {
-
- private final NHttpClientHandler handler;
- private final AsyncConnectionManager connMgr;
-
- public ManagedClientHandler(NHttpClientHandler handler, AsyncConnectionManager connMgr) {
- super();
- this.handler = handler;
- this.connMgr = connMgr;
- }
-
- public void connected(NHttpClientConnection conn, Object attachment) {
- AsyncConnectionRequest request = (AsyncConnectionRequest) attachment;
- this.handler.connected(conn, attachment);
- this.connMgr.addConnection(conn);
- request.setConnection(conn);
- }
-
- public void closed(NHttpClientConnection conn) {
- this.connMgr.removeConnection(conn);
- this.handler.closed(conn);
- }
-
- public void requestReady(NHttpClientConnection conn) {
- this.handler.requestReady(conn);
- }
-
- public void outputReady(NHttpClientConnection conn, ContentEncoder encoder) {
- this.handler.outputReady(conn, encoder);
- }
-
- public void responseReceived(NHttpClientConnection conn) {
- this.handler.responseReceived(conn);
- }
-
- public void inputReady(NHttpClientConnection conn, ContentDecoder decoder) {
- this.handler.inputReady(conn, decoder);
- }
-
- public void exception(NHttpClientConnection conn, HttpException ex) {
- this.handler.exception(conn, ex);
- }
-
- public void exception(NHttpClientConnection conn, IOException ex) {
- this.handler.exception(conn, ex);
- }
-
- public void timeout(NHttpClientConnection conn) {
- this.handler.timeout(conn);
- }
-
- }
-
- static class RequestHandle {
-
- private final AsyncConnectionManager connMgr;
- private final NHttpClientConnection conn;
-
- private volatile boolean completed;
-
- public RequestHandle(AsyncConnectionManager connMgr, NHttpClientConnection conn) {
- super();
- this.connMgr = connMgr;
- this.conn = conn;
- }
-
- public boolean isCompleted() {
- return this.completed;
- }
-
- public void completed() {
- if (this.completed) {
- return;
- }
- this.completed = true;
- this.connMgr.releaseConnection(this.conn);
- synchronized (this) {
- notifyAll();
- }
- }
-
- public void cancel() {
- if (this.completed) {
- return;
- }
- this.completed = true;
- synchronized (this) {
- notifyAll();
- }
- }
-
- public void waitFor() throws InterruptedException {
- if (this.completed) {
- return;
- }
- synchronized (this) {
- while (!this.completed) {
- wait();
- }
- }
- }
-
- }
-
- static class ConnRequestCallback implements SessionRequestCallback {
-
- private final AsyncConnectionRequest request;
-
- ConnRequestCallback(AsyncConnectionRequest request) {
- super();
- this.request = request;
- }
-
- public void completed(SessionRequest request) {
- System.out.println(request.getRemoteAddress() + " - request successful");
- }
-
- public void cancelled(SessionRequest request) {
- System.out.println(request.getRemoteAddress() + " - request cancelled");
- this.request.cancel();
- }
-
- public void failed(SessionRequest request) {
- System.err.println(request.getRemoteAddress() + " - request failed");
- IOException ex = request.getException();
- if (ex != null) {
- ex.printStackTrace();
- }
- this.request.cancel();
- }
-
- public void timeout(SessionRequest request) {
- System.out.println(request.getRemoteAddress() + " - request timed out");
- this.request.cancel();
- }
-
- }
-
- static class EventLogger implements EventListener {
-
- public void connectionOpen(final NHttpConnection conn) {
- System.out.println("Connection open: " + conn);
- }
-
- public void connectionTimeout(final NHttpConnection conn) {
- System.out.println("Connection timed out: " + conn);
- }
-
- public void connectionClosed(final NHttpConnection conn) {
- System.out.println("Connection closed: " + conn);
- }
-
- public void fatalIOException(final IOException ex, final NHttpConnection conn) {
- System.err.println("I/O error: " + ex.getMessage());
- }
-
- public void fatalProtocolException(final HttpException ex, final NHttpConnection conn) {
- System.err.println("HTTP error: " + ex.getMessage());
- }
-
- }
-
-}
+/*
+ * $HeadURL: http://svn.apache.org/repos/asf/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpClient.java $
+ * $Revision: 741603 $
+ * $Date: 2009-02-06 16:57:10 +0100 (Fri, 06 Feb 2009) $
+ *
+ * ====================================================================
+ * 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
+ * <http://www.apache.org/>.
+ *
+ */
+package org.apache.http.examples.nio;
+
+import java.io.IOException;
+import java.io.InterruptedIOException;
+import java.net.InetSocketAddress;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.Queue;
+import java.util.Set;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpException;
+import org.apache.http.HttpHost;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpVersion;
+import org.apache.http.impl.DefaultConnectionReuseStrategy;
+import org.apache.http.impl.nio.DefaultClientIOEventDispatch;
+import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
+import org.apache.http.message.BasicHttpRequest;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.NHttpClientHandler;
+import org.apache.http.nio.NHttpConnection;
+import org.apache.http.nio.protocol.BufferingHttpClientHandler;
+import org.apache.http.nio.protocol.EventListener;
+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.IOReactorException;
+import org.apache.http.nio.reactor.SessionRequest;
+import org.apache.http.nio.reactor.SessionRequestCallback;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreConnectionPNames;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.apache.http.protocol.BasicHttpProcessor;
+import org.apache.http.protocol.HttpContext;
+import org.apache.http.protocol.RequestConnControl;
+import org.apache.http.protocol.RequestContent;
+import org.apache.http.protocol.RequestExpectContinue;
+import org.apache.http.protocol.RequestTargetHost;
+import org.apache.http.protocol.RequestUserAgent;
+import org.apache.http.util.EntityUtils;
+
+/**
+ * Example of a very simple asynchronous connection manager that maintains a pool of persistent
+ * connections to one target host.
+ * <p>
+ * 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 client.
+ *
+ *
+ * @version $Revision:$
+ */
+public class NHttpClientConnManagement {
+
+ public static void main(String[] args) throws Exception {
+ HttpParams params = new BasicHttpParams();
+ params
+ .setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
+ .setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
+ .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
+ .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
+ .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
+ .setParameter(CoreProtocolPNames.USER_AGENT, "HttpComponents/1.1");
+
+ BasicHttpProcessor httpproc = new BasicHttpProcessor();
+ httpproc.addInterceptor(new RequestContent());
+ httpproc.addInterceptor(new RequestTargetHost());
+ httpproc.addInterceptor(new RequestConnControl());
+ httpproc.addInterceptor(new RequestUserAgent());
+ httpproc.addInterceptor(new RequestExpectContinue());
+
+ // Set up protocol handler
+ BufferingHttpClientHandler protocolHandler = new BufferingHttpClientHandler(
+ httpproc,
+ new MyHttpRequestExecutionHandler(),
+ new DefaultConnectionReuseStrategy(),
+ params);
+ protocolHandler.setEventListener(new EventLogger());
+
+ // Limit the total maximum of concurrent connections to 5
+ int maxTotalConnections = 5;
+
+ // Use the connection manager to maintain a pool of connections to localhost:8080
+ final AsyncConnectionManager connMgr = new AsyncConnectionManager(
+ new HttpHost("localhost", 8080),
+ maxTotalConnections,
+ protocolHandler,
+ params);
+
+ // Start the I/O reactor in a separate thread
+ Thread t = new Thread(new Runnable() {
+
+ public void run() {
+ try {
+ connMgr.execute();
+ } catch (InterruptedIOException ex) {
+ System.err.println("Interrupted");
+ } catch (IOException e) {
+ System.err.println("I/O error: " + e.getMessage());
+ }
+ System.out.println("I/O reactor terminated");
+ }
+
+ });
+ t.start();
+
+ // Submit 50 requests using maximum 5 concurrent connections
+ Queue<RequestHandle> queue = new LinkedList<RequestHandle>();
+ for (int i = 0; i < 50; i++) {
+ AsyncConnectionRequest connRequest = connMgr.requestConnection();
+ connRequest.waitFor();
+ NHttpClientConnection conn = connRequest.getConnection();
+ if (conn == null) {
+ System.err.println("Failed to obtain connection");
+ break;
+ }
+
+ HttpContext context = conn.getContext();
+ BasicHttpRequest httpget = new BasicHttpRequest("GET", "/", HttpVersion.HTTP_1_1);
+ RequestHandle handle = new RequestHandle(connMgr, conn);
+
+ context.setAttribute("request", httpget);
+ context.setAttribute("request-handle", handle);
+
+ queue.add(handle);
+ conn.requestOutput();
+ }
+
+ // Wait until all requests have been completed
+ while (!queue.isEmpty()) {
+ RequestHandle handle = queue.remove();
+ handle.waitFor();
+ }
+
+ // Give the I/O reactor 10 sec to shut down
+ connMgr.shutdown(10000);
+ System.out.println("Done");
+ }
+
+ static class MyHttpRequestExecutionHandler implements HttpRequestExecutionHandler {
+
+ public MyHttpRequestExecutionHandler() {
+ super();
+ }
+
+ public void initalizeContext(final HttpContext context, final Object attachment) {
+ }
+
+ public void finalizeContext(final HttpContext context) {
+ RequestHandle handle = (RequestHandle) context.removeAttribute("request-handle");
+ if (handle != null) {
+ handle.cancel();
+ }
+ }
+
+ public HttpRequest submitRequest(final HttpContext context) {
+ HttpRequest request = (HttpRequest) context.removeAttribute("request");
+ return request;
+ }
+
+ public void handleResponse(final HttpResponse response, final HttpContext context) {
+ HttpEntity entity = response.getEntity();
+ try {
+ String content = EntityUtils.toString(entity);
+
+ System.out.println("--------------");
+ System.out.println(response.getStatusLine());
+ System.out.println("--------------");
+ System.out.println("Document length: " + content.length());
+ System.out.println("--------------");
+ } catch (IOException ex) {
+ System.err.println("I/O error: " + ex.getMessage());
+ }
+ RequestHandle handle = (RequestHandle) context.removeAttribute("request-handle");
+ if (handle != null) {
+ handle.completed();
+ }
+ }
+
+ }
+
+ static class AsyncConnectionRequest {
+
+ private volatile boolean completed;
+ private volatile NHttpClientConnection conn;
+
+ public AsyncConnectionRequest() {
+ super();
+ }
+
+ public boolean isCompleted() {
+ return this.completed;
+ }
+
+ public void setConnection(NHttpClientConnection conn) {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ synchronized (this) {
+ this.conn = conn;
+ notifyAll();
+ }
+ }
+
+ public NHttpClientConnection getConnection() {
+ return this.conn;
+ }
+
+ public void cancel() {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ public void waitFor() throws InterruptedException {
+ if (this.completed) {
+ return;
+ }
+ synchronized (this) {
+ while (!this.completed) {
+ wait();
+ }
+ }
+ }
+
+ }
+
+ static class AsyncConnectionManager {
+
+ private final HttpHost target;
+ private final int maxConnections;
+ private final NHttpClientHandler handler;
+ private final HttpParams params;
+ private final ConnectingIOReactor ioreactor;
+ private final Object lock;
+ private final Set<NHttpClientConnection> allConns;
+ private final Queue<NHttpClientConnection> availableConns;
+ private final Queue<AsyncConnectionRequest> pendingRequests;
+
+ private volatile boolean shutdown;
+
+ public AsyncConnectionManager(
+ HttpHost target,
+ int maxConnections,
+ NHttpClientHandler handler,
+ HttpParams params) throws IOReactorException {
+ super();
+ this.target = target;
+ this.maxConnections = maxConnections;
+ this.handler = handler;
+ this.params = params;
+ this.lock = new Object();
+ this.allConns = new HashSet<NHttpClientConnection>();
+ this.availableConns = new LinkedList<NHttpClientConnection>();
+ this.pendingRequests = new LinkedList<AsyncConnectionRequest>();
+ this.ioreactor = new DefaultConnectingIOReactor(2, params);
+ }
+
+ public void execute() throws IOException {
+ IOEventDispatch dispatch = new DefaultClientIOEventDispatch(
+ new ManagedClientHandler(this.handler, this), this.params);
+ this.ioreactor.execute(dispatch);
+ }
+
+ public void shutdown(long waitMs) throws IOException {
+ synchronized (this.lock) {
+ if (!this.shutdown) {
+ this.shutdown = true;
+ while (!this.pendingRequests.isEmpty()) {
+ AsyncConnectionRequest request = this.pendingRequests.remove();
+ request.cancel();
+ }
+ this.availableConns.clear();
+ this.allConns.clear();
+ }
+ }
+ this.ioreactor.shutdown(waitMs);
+ }
+
+ void addConnection(NHttpClientConnection conn) {
+ if (conn == null) {
+ return;
+ }
+ if (this.shutdown) {
+ return;
+ }
+ synchronized (this.lock) {
+ this.allConns.add(conn);
+ }
+ }
+
+ void removeConnection(NHttpClientConnection conn) {
+ if (conn == null) {
+ return;
+ }
+ if (this.shutdown) {
+ return;
+ }
+ synchronized (this.lock) {
+ if (this.allConns.remove(conn)) {
+ this.availableConns.remove(conn);
+ }
+ processRequests();
+ }
+ }
+
+ public AsyncConnectionRequest requestConnection() {
+ if (this.shutdown) {
+ throw new IllegalStateException("Connection manager has been shut down");
+ }
+ AsyncConnectionRequest request = new AsyncConnectionRequest();
+ synchronized (this.lock) {
+ while (!this.availableConns.isEmpty()) {
+ NHttpClientConnection conn = this.availableConns.remove();
+ if (conn.isOpen()) {
+ System.out.println("Re-using persistent connection");
+ request.setConnection(conn);
+ break;
+ } else {
+ this.allConns.remove(conn);
+ }
+ }
+ if (!request.isCompleted()) {
+ this.pendingRequests.add(request);
+ processRequests();
+ }
+ }
+ return request;
+ }
+
+ public void releaseConnection(NHttpClientConnection conn) {
+ if (conn == null) {
+ return;
+ }
+ if (this.shutdown) {
+ return;
+ }
+ synchronized (this.lock) {
+ if (this.allConns.contains(conn)) {
+ if (conn.isOpen()) {
+ conn.setSocketTimeout(0);
+ AsyncConnectionRequest request = this.pendingRequests.poll();
+ if (request != null) {
+ System.out.println("Re-using persistent connection");
+ request.setConnection(conn);
+ } else {
+ this.availableConns.add(conn);
+ }
+ } else {
+ this.allConns.remove(conn);
+ processRequests();
+ }
+ }
+ }
+ }
+
+ private void processRequests() {
+ while (this.allConns.size() < this.maxConnections) {
+ AsyncConnectionRequest request = this.pendingRequests.poll();
+ if (request == null) {
+ break;
+ }
+ InetSocketAddress address = new InetSocketAddress(
+ this.target.getHostName(),
+ this.target.getPort());
+ ConnRequestCallback callback = new ConnRequestCallback(request);
+ System.out.println("Opening new connection");
+ this.ioreactor.connect(address, null, request, callback);
+ }
+ }
+
+ }
+
+ static class ManagedClientHandler implements NHttpClientHandler {
+
+ private final NHttpClientHandler handler;
+ private final AsyncConnectionManager connMgr;
+
+ public ManagedClientHandler(NHttpClientHandler handler, AsyncConnectionManager connMgr) {
+ super();
+ this.handler = handler;
+ this.connMgr = connMgr;
+ }
+
+ public void connected(NHttpClientConnection conn, Object attachment) {
+ AsyncConnectionRequest request = (AsyncConnectionRequest) attachment;
+ this.handler.connected(conn, attachment);
+ this.connMgr.addConnection(conn);
+ request.setConnection(conn);
+ }
+
+ public void closed(NHttpClientConnection conn) {
+ this.connMgr.removeConnection(conn);
+ this.handler.closed(conn);
+ }
+
+ public void requestReady(NHttpClientConnection conn) {
+ this.handler.requestReady(conn);
+ }
+
+ public void outputReady(NHttpClientConnection conn, ContentEncoder encoder) {
+ this.handler.outputReady(conn, encoder);
+ }
+
+ public void responseReceived(NHttpClientConnection conn) {
+ this.handler.responseReceived(conn);
+ }
+
+ public void inputReady(NHttpClientConnection conn, ContentDecoder decoder) {
+ this.handler.inputReady(conn, decoder);
+ }
+
+ public void exception(NHttpClientConnection conn, HttpException ex) {
+ this.handler.exception(conn, ex);
+ }
+
+ public void exception(NHttpClientConnection conn, IOException ex) {
+ this.handler.exception(conn, ex);
+ }
+
+ public void timeout(NHttpClientConnection conn) {
+ this.handler.timeout(conn);
+ }
+
+ }
+
+ static class RequestHandle {
+
+ private final AsyncConnectionManager connMgr;
+ private final NHttpClientConnection conn;
+
+ private volatile boolean completed;
+
+ public RequestHandle(AsyncConnectionManager connMgr, NHttpClientConnection conn) {
+ super();
+ this.connMgr = connMgr;
+ this.conn = conn;
+ }
+
+ public boolean isCompleted() {
+ return this.completed;
+ }
+
+ public void completed() {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ this.connMgr.releaseConnection(this.conn);
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ public void cancel() {
+ if (this.completed) {
+ return;
+ }
+ this.completed = true;
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ public void waitFor() throws InterruptedException {
+ if (this.completed) {
+ return;
+ }
+ synchronized (this) {
+ while (!this.completed) {
+ wait();
+ }
+ }
+ }
+
+ }
+
+ static class ConnRequestCallback implements SessionRequestCallback {
+
+ private final AsyncConnectionRequest request;
+
+ ConnRequestCallback(AsyncConnectionRequest request) {
+ super();
+ this.request = request;
+ }
+
+ public void completed(SessionRequest request) {
+ System.out.println(request.getRemoteAddress() + " - request successful");
+ }
+
+ public void cancelled(SessionRequest request) {
+ System.out.println(request.getRemoteAddress() + " - request cancelled");
+ this.request.cancel();
+ }
+
+ public void failed(SessionRequest request) {
+ System.err.println(request.getRemoteAddress() + " - request failed");
+ IOException ex = request.getException();
+ if (ex != null) {
+ ex.printStackTrace();
+ }
+ this.request.cancel();
+ }
+
+ public void timeout(SessionRequest request) {
+ System.out.println(request.getRemoteAddress() + " - request timed out");
+ this.request.cancel();
+ }
+
+ }
+
+ static class EventLogger implements EventListener {
+
+ public void connectionOpen(final NHttpConnection conn) {
+ System.out.println("Connection open: " + conn);
+ }
+
+ public void connectionTimeout(final NHttpConnection conn) {
+ System.out.println("Connection timed out: " + conn);
+ }
+
+ public void connectionClosed(final NHttpConnection conn) {
+ System.out.println("Connection closed: " + conn);
+ }
+
+ public void fatalIOException(final IOException ex, final NHttpConnection conn) {
+ System.err.println("I/O error: " + ex.getMessage());
+ }
+
+ public void fatalProtocolException(final HttpException ex, final NHttpConnection conn) {
+ System.err.println("HTTP error: " + ex.getMessage());
+ }
+
+ }
+
+}
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpFileServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpFileServer.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpFileServer.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpFileServer.java Sat Feb 14 16:38:14 2009
@@ -82,7 +82,6 @@
* 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 file server.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpReverseProxy.java Sat Feb 14 16:38:14 2009
@@ -89,7 +89,6 @@
* 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.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLClient.java Sat Feb 14 16:38:14 2009
@@ -74,7 +74,6 @@
* 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 client.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpSSLServer.java Sat Feb 14 16:38:14 2009
@@ -86,7 +86,6 @@
* 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 server.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/
Modified: httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java?rev=744516&r1=744515&r2=744516&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java (original)
+++ httpcomponents/httpcore/trunk/module-nio/src/examples/org/apache/http/examples/nio/NHttpServer.java Sat Feb 14 16:38:14 2009
@@ -76,7 +76,6 @@
* 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 server.
*
- * @author <a href="mailto:oleg at ural.ru">Oleg Kalnichevski</a>
*
* @version $Revision$
*/