If CredentialsProvider is not interactive, but programmatic (e.g. fetches 
credentials from database) and credentials are wrong the httpclient will 
attempt to connect until network connections limit is exhausted on the machine 
and will not fail.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: HTTPCLIENT-620
                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-620
             Project: HttpComponents HttpClient
          Issue Type: Bug
          Components: HttpClient
    Affects Versions: 3.0.1
         Environment: Windows XP, Java 5.
            Reporter: Andriy Proskuryakov


Happens if CredentialsProvider is not interactive (does not bring dialog every 
time it is asked for credentials), but programmatic (e.g. fetches credentials 
from database).
If credentials returned by provider are wrong the httpclient will not fail 
after few attempts to connect, but will continue attempts to connect until 
network connections limit is exhausted on the machine.

Instrumenting getCredentials method shows it being called hundreds of times in 
a matter of few seconds, netstat will show hundreds of connections in the 
TIME_WAIT state.

I believe the executeMethod of the HttpMethodDirector is responsible (loop on 
line 141). If processAuthenticationResponse (line 192) fails, the retry is set 
to true and it attempts to connect again.

Here is stack trace dumped from getCredentials:

java.lang.Exception: Stack trace
        at java.lang.Thread.dumpStack(Unknown Source)
        at 
com.beacon.proxy.impl.CredentialPreferences.getCredentials(CredentialPreferences.java:30)
        at 
org.apache.commons.httpclient.HttpMethodDirector.promptForProxyCredentials(HttpMethodDirector.java:892)
        at 
org.apache.commons.httpclient.HttpMethodDirector.processProxyAuthChallenge(HttpMethodDirector.java:772)
        at 
org.apache.commons.httpclient.HttpMethodDirector.processAuthenticationResponse(HttpMethodDirector.java:665)
        at 
org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:192)
        at 
org.apache.commons.httpclient.ProxyClient.connect(ProxyClient.java:202)
        at 
com.beacon.proxy.impl.TunnelingSocketFactory.createSocket(TunnelingSocketFactory.java:101)
        at 
com.beacon.proxy.impl.SecureSocketFactory.createSocket(SecureSocketFactory.java:89)
        at 
com.beacon.proxy.impl.SecureSocketFactory.createSocket(SecureSocketFactory.java:65)
        at 
com.beacon.commons.net.ConnectionTypeSocketFactory.createSocket(ConnectionTypeSocketFactory.java:26)
        at com.beacon.proxy.ConnectionChecker$1.run(ConnectionChecker.java:72)


We made a hack to circumvent this for our use (just allow few attempts) and 
then exit. Below is the patch.
You would certainly want something better for the fix, but the patch can help 
in understanding the problem:

Index: src/java/org/apache/commons/httpclient/HttpMethodDirector.java
===================================================================
--- src/java/org/apache/commons/httpclient/HttpMethodDirector.java      
(revision 11183)
+++ src/java/org/apache/commons/httpclient/HttpMethodDirector.java      
(working copy)
@@ -138,7 +138,11 @@
         try {
             int maxRedirects = 
this.params.getIntParameter(HttpClientParams.MAX_REDIRECTS, 100);
 
-            for (int redirectCount = 0;;) {
+            int authattempts = 0;
+            // Stop trying to connect if the number of authentication attempts 
exceeds 6.
+            // Chose 6, an even number twice 3, because NTLM requires two 
challenges per
+            // authentication attempt.
+            for (int redirectCount = 0; authattempts < 6;) {
 
                 // make sure the connection we have is appropriate
                 if (this.conn != null && 
!hostConfiguration.hostEquals(this.conn)) {
@@ -191,6 +195,7 @@
                 if (isAuthenticationNeeded(method)) {
                     if (processAuthenticationResponse(method)) {
                         LOG.debug("Retry authentication");
+                        ++authattempts;
                         retry = true;
                     }
                 }


-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to