I agree, The goal is to have one single instance of HttpClient here to be able to reuse the connections. At the moment, the HttpClientHandler isn't a singleton, so the easiest way for me was to make it static.
But maybe we can wait to see if the change solves the problem. If it doesn't, we can revert it, but if it solves to problem, we can refactor it to some cleaner solution. Maarten ----- Original Message ---- From: Xavier Hanin <[EMAIL PROTECTED]> To: dev@ant.apache.org Sent: Thursday, July 24, 2008 9:08:32 AM Subject: Re: svn commit: r679208 - /ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java On Thu, Jul 24, 2008 at 12:06 AM, <[EMAIL PROTECTED]> wrote: > Author: maartenc > Date: Wed Jul 23 15:06:48 2008 > New Revision: 679208 > > URL: http://svn.apache.org/viewvc?rev=679208&view=rev > Log: > Attempt to fix connection leak reported in IVY-854 by caching the > HttpClient instance. > > Modified: > > ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java > > Modified: > ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java > URL: > http://svn.apache.org/viewvc/ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java?rev=679208&r1=679207&r2=679208&view=diff > > ============================================================================== > --- > ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java > (original) > +++ > ant/ivy/core/trunk/src/java/org/apache/ivy/util/url/HttpClientHandler.java > Wed Jul 23 15:06:48 2008 > @@ -33,6 +33,7 @@ > import org.apache.commons.httpclient.HttpException; > import org.apache.commons.httpclient.HttpMethodBase; > import org.apache.commons.httpclient.HttpStatus; > +import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; > import org.apache.commons.httpclient.UsernamePasswordCredentials; > import org.apache.commons.httpclient.auth.AuthPolicy; > import org.apache.commons.httpclient.methods.GetMethod; > @@ -61,6 +62,8 @@ > private String proxyPasswd = null; > > private HttpClientHelper httpClientHelper; > + > + private static HttpClient httpClient; I'm not sure reusing always the same (static) instance of httpClient is safe. In the context of IvyDE, we will have the same instance of httpClient whatever the number of settings we use. I know we have other similar problems about using static stuff which shouldn't be, but I dislike introducing new ones. WDYT? Xavier > > public HttpClientHandler() { > configureProxy(); > @@ -204,28 +207,39 @@ > } > > private HttpClient getClient(URL url) { > - HttpClient client = new HttpClient(); > - > - List authPrefs = new ArrayList(2); > - authPrefs.add(AuthPolicy.DIGEST); > - authPrefs.add(AuthPolicy.BASIC); > - // Exclude the NTLM authentication scheme because it is not > supported by this class > - client.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, > authPrefs); > - > - if (useProxy()) { > - client.getHostConfiguration().setProxy(proxyHost, proxyPort); > - if (useProxyAuthentication()) { > - client.getState().setProxyCredentials(proxyRealm, > proxyHost, > - new UsernamePasswordCredentials(proxyUserName, > proxyPasswd)); > + if (httpClient == null) { > + final MultiThreadedHttpConnectionManager connManager = new > MultiThreadedHttpConnectionManager(); > + httpClient = new HttpClient(connManager); > + > + Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() > { > + public void run() { > + connManager.shutdown(); > + } > + })); > + > + List authPrefs = new ArrayList(2); > + authPrefs.add(AuthPolicy.DIGEST); > + authPrefs.add(AuthPolicy.BASIC); > + // Exclude the NTLM authentication scheme because it is not > supported by this class > + > httpClient.getParams().setParameter(AuthPolicy.AUTH_SCHEME_PRIORITY, > authPrefs); > + > + if (useProxy()) { > + httpClient.getHostConfiguration().setProxy(proxyHost, > proxyPort); > + if (useProxyAuthentication()) { > + httpClient.getState().setProxyCredentials(proxyRealm, > proxyHost, > + new UsernamePasswordCredentials(proxyUserName, > proxyPasswd)); > + } > } > } > + > Credentials c = getCredentials(url); > if (c != null) { > Message.debug("found credentials for " + url + ": " + c); > - client.getState().setCredentials(c.getRealm(), c.getHost(), > + httpClient.getState().setCredentials(c.getRealm(), > c.getHost(), > new UsernamePasswordCredentials(c.getUserName(), > c.getPasswd())); > } > - return client; > + > + return httpClient; > } > > private boolean useProxy() { > @@ -243,7 +257,7 @@ > private boolean useProxyAuthentication() { > return (proxyUserName != null && proxyUserName.trim().length() > > 0); > } > - > + > private static final class GETInputStream extends InputStream { > private InputStream is; > > > > -- Xavier Hanin - Independent Java Consultant http://xhab.blogspot.com/ http://ant.apache.org/ivy/ http://www.xoocode.org/ --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]