Thanks for the fix, there is one problem with the fix and some other 
problems.

I think that the fix needs an else:

                     // if we get an exception while sending the request,
                     // and the connection is a keepalive connection, it 
may
                     // have been timed out by the server. Try again.
                     if (client.keepalive) {
                         client.closeConnection ();
                         client.initConnection ();
                         in = client.sendRequest (request);
                     }
                     else {     <<<<<<<<<<<------- need to throw here if 
not keep alive.
                       throw iox;
                     }

Without the else you get all sort of fun null pointers when you don't have 
keepalive.

If keep alive is not set on the client there is another problem.

At or around line 187 is this code.
                 // client keepalive is always false if XmlRpc.keepalive 
is false
                 if (!client.keepalive)
                     client.closeConnection ();

The client needs to be nulled:


                 // client keepalive is always false if XmlRpc.keepalive 
is false
                 if (!client.keepalive) {
                     client.closeConnection ();
                     client = null;
                 }

BUT I think that there is a larger problem that I have no suggested fix 
for.  The client.keepalive is a necessary but not a sufficient condition.  
The correct condition is whether the server is honoring the keepalive.  
You only know the answer to this if the server tells you, that is, if the 
server sends a "Connection: close" in the response (or a keep-alive, but 
that works correctly).   So if client.keepalive is true, but the server 
does not honor it and returns a close, then this code still needs to be 
executed.  The close is caught much deeper in the code and so isn't known 
at this point.

Jim

-- 

Jim Redman
(505) 662 5156
http://www.ergotech.com

Reply via email to