Greetings, With HttpClient, I'm using the MultiThreadedHttpConnectionManager, with all timeout values set to 30s, and I'm seeing a problem against a server that discards unused connections after several minutes. It seems the connection close isn't detected by the HttpConnection.isStale() method, which causes a delay in processing as stream reading blocks waiting for the socket timeout. In HttpConnection.isStale, the stream read throws a SocketTimeoutException which indicates the socket is still alive, so the connection is reused in HttpMethodBase.processRequest without closing the socket first.
The request is successfully written via writeRequest, but readResponse throws a java.net.SocketTimeoutException, after delaying for 30s. private void processRequest(HttpState state, HttpConnection connection) throws HttpException, IOException { LOG.trace("enter HttpMethodBase.processRequest(HttpState, HttpConnection)"); ... if (!connection.isOpen()) { // returns true LOG.debug("Opening the connection."); connection.open(); } writeRequest(state, connection); requestSent = true; readResponse(state, connection); // the response read times out // the method has successfully executed used = true; break; There is a pattern - this happens only after connections have not been used for a certain period of time, where I presume the origin server is closing the unused persistent connection. If connections are reused frequently, then there are no problems - the timeout occurs only when connections lay idle for a few minutes. The externally visible behavior to users is that the request takes at least 30s to execute - the request is retried, so it eventually succeeds. Any ideas how I go about fixing this? I'm not entirely sure if this is a problem with HTTPClient or with the origin server (which is running MS IIS 4.0, not under my control.) I've included below a simple test case to demonstrate the problem. Thanks for any help! mat mcgowan import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.*; import java.io.IOException; import junit.framework.TestCase; public class TestJakartaHttpClient extends TestCase { public void testNorgeNo() throws InterruptedException, IOException { httpServer("http://norge.no", 5*1000*60); } public void httpServer(String uri, int delay) throws IOException, InterruptedException { HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager()); int timeout = 30*1000; client.setConnectionTimeout(timeout); client.setHttpConnectionFactoryTimeout(timeout) ; client.setTimeout(timeout); GetMethod m = new GetMethod(uri); m.setStrictMode(false); m.setFollowRedirects(false); m.setDoAuthentication(false); m.setHttp11(true); // read data client.executeMethod(m); m.getResponseBody(); Thread.sleep(delay); try { m = new GetMethod(uri); m.setStrictMode(false); m.setFollowRedirects(false); m.setDoAuthentication(false); m.setHttp11(true); client.executeMethod(m); m.getResponseBody(); } catch (HttpRecoverableException ex) { fail(ex.toString()); } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]