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]

Reply via email to