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 771859E50 for ; Thu, 19 Jan 2012 12:16:11 +0000 (UTC) Received: (qmail 53230 invoked by uid 500); 19 Jan 2012 12:16:11 -0000 Delivered-To: apmail-hc-commits-archive@hc.apache.org Received: (qmail 53195 invoked by uid 500); 19 Jan 2012 12:16:11 -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 53188 invoked by uid 99); 19 Jan 2012 12:16:11 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 19 Jan 2012 12:16:11 +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; Thu, 19 Jan 2012 12:16:09 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 5058723889C5 for ; Thu, 19 Jan 2012 12:15:49 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1233307 - in /httpcomponents/httpclient/trunk/httpclient/src: main/java/org/apache/http/client/utils/HttpClientUtils.java test/java/org/apache/http/client/utils/TestHttpClientUtils.java Date: Thu, 19 Jan 2012 12:15:49 -0000 To: commits@hc.apache.org From: olegk@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120119121549.5058723889C5@eris.apache.org> Author: olegk Date: Thu Jan 19 12:15:48 2012 New Revision: 1233307 URL: http://svn.apache.org/viewvc?rev=1233307&view=rev Log: HTTPCLIENT-1159: HttpClientUtils - helper methods to release resources held by HttpClient / HttpResponse after use Contributed by Karthik K Added: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java (with props) httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java (with props) Added: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java?rev=1233307&view=auto ============================================================================== --- httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java (added) +++ httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java Thu Jan 19 12:15:48 2012 @@ -0,0 +1,107 @@ +/* + * ==================================================================== + * 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.client.utils; + +import java.io.IOException; + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.util.EntityUtils; + +/** + * Static helpers for dealing with {@link HttpResponse}s and {@link HttpClient}s. + * + * @since 4.2 + */ +public class HttpClientUtils { + + private HttpClientUtils() { + } + + /** + * Unconditionally close a response. + *

+ * Example Code: + * + *

+     * HttpResponse httpResponse = null;
+     * try {
+     *     httpResponse = httpClient.execute(httpGet);
+     * } catch (Exception e) {
+     *     // error handling
+     * } finally {
+     *     HttpClientUtils.closeQuietly(httpResponse);
+     * }
+     * 
+ * + * @param response + * the HttpResponse to release resources, may be null or already + * closed. + * + * @since 4.2 + */ + public static void closeQuietly(final HttpResponse response) { + if (response != null) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + try { + EntityUtils.consume(entity); + } catch (final IOException ex) { + } + } + } + } + + /** + * Unconditionally close a httpClient. Shuts down the underlying connection + * manager and releases the resources. + *

+ * Example Code: + * + *

+     * HttpClient httpClient = null;
+     * try {
+     *   httpClient = new DefaultHttpClient(...);
+     * } catch (Exception e) {
+     *   // error handling
+     * } finally {
+     *   HttpClientUtils.closeQuietly(httpClient);
+     * }
+     * 
+ * + * @param httpClient + * the HttpClient to close, may be null or already closed. + * @since 4.2 + */ + public static void closeQuietly(final HttpClient httpClient) { + if (httpClient != null) { + httpClient.getConnectionManager().shutdown(); + } + } + +} Propchange: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: httpcomponents/httpclient/trunk/httpclient/src/main/java/org/apache/http/client/utils/HttpClientUtils.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java URL: http://svn.apache.org/viewvc/httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java?rev=1233307&view=auto ============================================================================== --- httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java (added) +++ httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java Thu Jan 19 12:15:48 2012 @@ -0,0 +1,125 @@ +/* + * ==================================================================== + * 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.client.utils; + +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.PoolingClientConnectionManager; +import org.apache.http.localserver.BasicServerTestBase; +import org.apache.http.localserver.LocalTestServer; +import org.apache.http.protocol.BasicHttpProcessor; +import org.apache.http.protocol.ResponseConnControl; +import org.apache.http.protocol.ResponseContent; +import org.apache.http.protocol.ResponseDate; +import org.apache.http.protocol.ResponseServer; +import org.apache.http.util.EntityUtils; +import org.junit.Before; +import org.junit.Test; + +public class TestHttpClientUtils extends BasicServerTestBase { + + @Before + public void setUp() throws Exception { + BasicHttpProcessor httpproc = new BasicHttpProcessor(); + httpproc.addInterceptor(new ResponseDate()); + httpproc.addInterceptor(new ResponseServer()); + httpproc.addInterceptor(new ResponseContent()); + httpproc.addInterceptor(new ResponseConnControl()); + this.localServer = new LocalTestServer(httpproc, null); + } + + @Test + public void testCloseQuietlyClient() throws Exception { + HttpClient httpClient = new DefaultHttpClient(); + HttpClientUtils.closeQuietly(httpClient); + } + + @Test + public void testCloseQuietlyNullClient() throws Exception { + HttpClient httpClient = null; + HttpClientUtils.closeQuietly(httpClient); + } + + @Test + public void testCloseQuietlyClientTwice() { + PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); + HttpClient httpClient = new DefaultHttpClient(connectionManager); + HttpClientUtils.closeQuietly(httpClient); + HttpClientUtils.closeQuietly(httpClient); + } + + @Test + public void testCloseQuietlyResponse() throws Exception { + this.localServer.registerDefaultHandlers(); + this.localServer.start(); + PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); + HttpClient httpClient = new DefaultHttpClient(connectionManager); + HttpHost target = getServerHttp(); + HttpResponse response = httpClient.execute(target, new HttpGet("/")); + HttpClientUtils.closeQuietly(response); + HttpClientUtils.closeQuietly(httpClient); + } + + @Test + public void testCloseQuietlyResponseNull() throws Exception { + PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); + HttpClient httpClient = new DefaultHttpClient(connectionManager); + HttpResponse response = null; + HttpClientUtils.closeQuietly(response); + HttpClientUtils.closeQuietly(httpClient); + } + + @Test + public void testCloseQuietlyResponseTwice() throws Exception { + this.localServer.registerDefaultHandlers(); + this.localServer.start(); + PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); + HttpClient httpClient = new DefaultHttpClient(connectionManager); + HttpHost target = getServerHttp(); + HttpResponse response = httpClient.execute(target, new HttpGet("/")); + HttpClientUtils.closeQuietly(response); + HttpClientUtils.closeQuietly(response); + HttpClientUtils.closeQuietly(httpClient); + } + + @Test + public void testCloseQuietlyResponseAfterConsumeContent() throws Exception { + this.localServer.registerDefaultHandlers(); + this.localServer.start(); + PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(); + HttpClient httpClient = new DefaultHttpClient(connectionManager); + HttpHost target = getServerHttp(); + HttpResponse response = httpClient.execute(target, new HttpGet("/")); + EntityUtils.consume(response.getEntity()); + HttpClientUtils.closeQuietly(response); + HttpClientUtils.closeQuietly(httpClient); + } + +} Propchange: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: httpcomponents/httpclient/trunk/httpclient/src/test/java/org/apache/http/client/utils/TestHttpClientUtils.java ------------------------------------------------------------------------------ svn:mime-type = text/plain