Oleg, Roland, I tried to reproduce that last night (I'm on GMT+12) but failed, probably from going round too many circles and don't have a snapshot of the code when (I think) it happened. Perhaps we have got away from the original issue that calling getResponseBody() and calling getResponseBodyAsStream() can produce markedly different behaviour on Sucky Sockets (TM), albeit because of an apparent miss-handling of the http client.
Certainly the suggestions you gave on the correct way of using the client worked. So did the setHeader(). The code where I discovered the I was losing handles I can change, but I had delivered other s/w to a customer where it is running on Solaris having made it through test & qual to production. There is some cost associated with changing it now as I deliver and they test & promote. Does anybody have any idea if Solaris will be tidying up my lost socket connections for me? Thanks David PS. Could a finalizer be added to the connection managers to try to tidy up. -----Original Message----- From: Kalnichevski, Oleg [mailto:[EMAIL PROTECTED] Sent: Tuesday, 12 August 2003 8:40 p.m. To: Commons HttpClient Project Subject: RE: getMethod.getResponseBody() leaks handles David, Could you please post a code snippet that you think will reliably reproduce the problem? As far as I can tell HttpMethodBase#responseBodyConsumed() is reliably executed when HttpMethodBase#getResponseBody() is called. HttpMethodBase#getResponseBody() in its turn invokes HttpConnection#releaseConnection(). Everything seems just fine. I do have to agree with Mike that the problem appears to have been caused by the way you use HttpClient. You should seriously consider redesigning your application to re-use HttpClient's instance or at least that of the ConnectionManager See my test app's code below along with the resultant trace log package org.apache.commons.httpclient; import org.apache.commons.httpclient.methods.GetMethod; public class Test { public static void main(String[] args) throws Exception { HttpClient httpclient = new HttpClient(); GetMethod httpget = new GetMethod("http://www.yahoo.com"); httpclient.executeMethod(httpget); System.out.println(httpget.getStatusLine().toString()); httpget.getResponseBody(); } } [DEBUG] HttpClient - -Java version: 1.4.2 [DEBUG] HttpClient - -Java vendor: Sun Microsystems Inc. [DEBUG] HttpClient - -Java class path: D:\Data\jakarta-commons-httpclient-tests\bin;D:\Data\jakarta-commons-httpcli ent-2.0\bin;C:\java\apache.org\jakarta-commons\lib\commons-logging.jar;C:\ec lipse\plugins\org.junit_3.8.1\junit.jar [DEBUG] HttpClient - -Operating system name: Windows 2000 [DEBUG] HttpClient - -Operating system architecture: x86 [DEBUG] HttpClient - -Operating system version: 5.0 ... [TRACE] GetMethod - -enter GetMethod(String) [TRACE] HttpClient - -enter HttpClient.executeMethod(HttpMethod) [TRACE] HttpClient - -enter HttpClient.executeMethod(HostConfiguration,HttpMethod,HttpState) [DEBUG] HttpConnection - -HttpConnection.setSoTimeout(0) [TRACE] HttpConnection - -enter HttpConnection.open() [TRACE] HttpMethodBase - -enter HttpMethodBase.execute(HttpState, HttpConnection) [DEBUG] HttpMethodBase - -Execute loop try 1 [TRACE] HttpMethodBase - -enter HttpMethodBase.processRequest(HttpState, HttpConnection) [TRACE] HttpMethodBase - -Attempt number 1 to process request [TRACE] HttpMethodBase - -enter HttpMethodBase.writeRequest(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.writeRequestLine(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.generateRequestLine(HttpConnection, String, String, String, String) [TRACE] HttpConnection - -enter HttpConnection.print(String) [TRACE] HttpConnection - -enter HttpConnection.write(byte[]) [TRACE] HttpConnection - -enter HttpConnection.write(byte[], int, int) [TRACE] HttpMethodBase - -enter HttpMethodBase.writeRequestHeaders(HttpState,HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.addRequestHeaders(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.addUserAgentRequestHeaders(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.addHostRequestHeader(HttpState, HttpConnection) [DEBUG] HttpMethodBase - -Adding Host request header [TRACE] HttpMethodBase - -enter HttpMethodBase.addCookieRequestHeader(HttpState, HttpConnection) [TRACE] HttpState - -enter HttpState.getCookies() [TRACE] CookieSpec - -enter CookieSpecBase.match(String, int, String, boolean, Cookie[]) [TRACE] HttpMethodBase - -enter HttpMethodBase.addAuthorizationRequestHeader(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.addProxyAuthorizationRequestHeader(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.addProxyConnectionHeader(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.addContentLengthRequestHeader(HttpState, HttpConnection) [TRACE] HttpConnection - -enter HttpConnection.print(String) [TRACE] HttpConnection - -enter HttpConnection.write(byte[]) [TRACE] HttpConnection - -enter HttpConnection.write(byte[], int, int) [TRACE] HttpConnection - -enter HttpConnection.print(String) [TRACE] HttpConnection - -enter HttpConnection.write(byte[]) [TRACE] HttpConnection - -enter HttpConnection.write(byte[], int, int) [TRACE] HttpConnection - -enter HttpConnection.writeLine() [TRACE] HttpConnection - -enter HttpConnection.write(byte[]) [TRACE] HttpConnection - -enter HttpConnection.write(byte[], int, int) [TRACE] HttpConnection - -enter HttpConnection.flushRequestOutputStream() [TRACE] HttpConnection - -enter HttpConnection.flushRequestOutputStream() [TRACE] HttpMethodBase - -enter HttpMethodBase.readResponse(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.readStatusLine(HttpState, HttpConnection) [TRACE] HttpConnection - -enter HttpConnection.readLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpMethodBase - -enter HttpMethodBase.readResponseHeaders(HttpState,HttpConnection) [TRACE] HttpConnection - -enter HttpConnection.getResponseInputStream() [TRACE] HttpParser - -enter HeaderParser.parseHeaders(HttpConnection, HeaderGroup) [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpMethodBase - -enter HttpMethodBase.processResponseHeaders(HttpState, HttpConnection) [TRACE] GetMethod - -enter GetMethod.readResponseBody(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.readResponseBody(HttpState, HttpConnection) [TRACE] HttpMethodBase - -enter HttpMethodBase.readResponseBody(HttpState, HttpConnection) [TRACE] HttpConnection - -enter HttpConnection.getResponseInputStream() [TRACE] HeaderElement - -enter HeaderElement.parse(String) [TRACE] HeaderElement - -enter HeaderElement.parsePair(char[], int, int) [DEBUG] HttpConnection - -HttpConnection.getSoTimeout() [TRACE] HttpConnection - -enter HttpConnection.isResponseAvailable(int) HTTP/1.1 200 OK [DEBUG] HttpMethodBase - -Buffering response body [TRACE] HttpParser - -enter HeaderParser.parseHeaders(HttpConnection, HeaderGroup) [TRACE] HttpParser - -enter HttpParser.readLine() [TRACE] HttpParser - -enter HttpParser.readRawLine() [TRACE] HttpMethodBase - -enter responseBodyConsumed() [DEBUG] HttpMethodBase - -Should close connection in response to Connection: close [TRACE] HttpConnection - -enter HttpConnection.close() [TRACE] HttpConnection - -enter HttpConnection.closeSockedAndStreams() [TRACE] HttpConnection - -enter HttpConnection.releaseConnection() Cheers Oleg --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]