On Thu, Jul 24, 2008 at 9:25 AM, Maarten Coene <[EMAIL PROTECTED]> wrote:
> 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. It sounds like a good approach! Xavier > > > 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] > > -- Xavier Hanin - Independent Java Consultant http://xhab.blogspot.com/ http://ant.apache.org/ivy/ http://www.xoocode.org/