You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hc.apache.org by bu...@apache.org on 2004/10/08 20:50:20 UTC

DO NOT REPLY [Bug 31606] New: - Access to SO_TIMEOUT for open connections

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=31606>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=31606

Access to SO_TIMEOUT for open connections

           Summary: Access to SO_TIMEOUT for open connections
           Product: Commons
           Version: 3.0 Alpha 2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: HttpClient
        AssignedTo: commons-httpclient-dev@jakarta.apache.org
        ReportedBy: ghexsel@uol.com.br


I'm trying to access a set of pages in order, for which I have a maximum delay
permissible.  The complete operation includes following all redirects and
fetching the complete page content.  What I need, which doesn't seem to be
doable right now (according to the common-users list) is to reset the SO_TIMEOUT
property of the socket before each read to the inputstream.  I'd need an access
to the HttpConnection, or a way to set the parameters for that object.

This is a simplified version of what I'm doing:
-----
HttpURL url = new HttpURL(urlString);
method.setURI(url);
method.setFollowRedirects(false);
method.getParams().setSoTimeout(remainingTime);
HostConfiguration hostConfig = new HostConfiguration();
hostConfig.setHost(url);
method.setHostConfiguration(hostConfig);
timeoutChecker.getRemainingTime());

int statusCode = client.executeMethod(hostConfig, method, state);
String pageContent;

if (isRedirect(statusCode)) {
    if (timeoutChecker.isTimeout()) {
        throw new TimeoutException("Total execution time for fetch exceeded
timeout parameter");
    } else {
        Header locationHeader = method.getResponseHeader("location");
        HttpURL nextLocation = new HttpURL(locationHeader.getValue().toCharArray());
        pageContent = fetchGet(nextLocation.getEscapedURI(), addressHolder,
timeoutChecker, state);
    }
} else if (isSuccess(statusCode)) {
    // at least 4K buffers, might be as big as the webpage
    int responseSize = Math.max(getResponseSize(method), DEFAULT_RESPONSE_SIZE);
    InputStream response = method.getResponseBodyAsStream();
    ByteArrayOutputStream outstream = new ByteArrayOutputStream(responseSize);
    byte[] buffer = new byte[responseSize];
    int len;
    do {
        // ***TODO need to reset the SO_TIMEOUT to the remaining time
        len = response.read(buffer);
        outstream.write(buffer, 0, len);
    while ((len > 0) && !timeoutChecker.isTimeout());
    outstream.close();
    pageContent = EncodingUtil.getString(outstream.toByteArray(),
method.getResponseCharSet());
    response.close();
} else {
    ...
}

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-httpclient-dev-help@jakarta.apache.org