olegk       2004/07/05 15:46:59

  Modified:    httpclient/src/java/org/apache/commons/httpclient
                        ConnectTimeoutException.java
                        DefaultMethodRetryHandler.java HttpConnection.java
                        HttpConnectionManager.java HttpMethod.java
                        HttpMethodBase.java HttpMethodDirector.java
                        HttpRecoverableException.java
                        MethodRetryHandler.java
                        MultiThreadedHttpConnectionManager.java
               httpclient/src/java/org/apache/commons/httpclient/auth
                        CredentialsProvider.java
               httpclient/src/java/org/apache/commons/httpclient/params
                        DefaultHttpParamsFactory.java
               httpclient/src/test/org/apache/commons/httpclient
                        NoHostHttpConnectionManager.java
                        TestIdleConnectionTimeout.java
  Added:       httpclient/src/java/org/apache/commons/httpclient
                        ConnectionPoolTimeoutException.java
                        DefaultHttpMethodRetryHandler.java
                        HttpMethodRetryHandler.java
                        NoHttpResponseException.java
  Removed:     httpclient/src/java/org/apache/commons/httpclient
                        HttpTimeoutException.java IOTimeoutException.java
  Log:
  PR #29874 (Auto method retrial broken)
  
  Changelog:
  * fixes broken 'request sent' logic, albeit at the expense of adding (yet another) 
method to the HttpMethod interface
  * deprecates HttpRecoverableException, MethodRetryHandler, DefaultMethodRetryHandler 
classes, HttpMethodBase#setMethodRetryHandler and HttpMethodBase#getMethodRetryHandler 
methods
  * adds new HttpMethodRetryHandler interface that acts on plain IOExceptions
  * eliminates superfluous HttpTimeoutException & IOTimeoutException classes
  * ConnectTimeoutException now subclasses the standard InterruptedIOException, which 
is more consistent with the overall Java exception handling framework
  * HttpConnectionManager classes now throw a more specific 
ConnectionPoolTimeoutException derived from ConnectTimeoutException. There can be 
cases when socket connect timeout needs to be differentiated from that of the 
connection pool
  
  Contributed by Oleg Kalnichevski
  Reviewed by Michael Becke
  
  Revision  Changes    Path
  1.5       +11 -5     
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/ConnectTimeoutException.java
  
  Index: ConnectTimeoutException.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/ConnectTimeoutException.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ConnectTimeoutException.java      13 May 2004 04:03:25 -0000      1.4
  +++ ConnectTimeoutException.java      5 Jul 2004 22:46:58 -0000       1.5
  @@ -29,6 +29,10 @@
   
   package org.apache.commons.httpclient;
   
  +import java.io.InterruptedIOException;
  +
  +import org.apache.commons.httpclient.util.ExceptionUtil;
  +
   /**
    * A timeout while connecting to an HTTP server or waiting for an
    * available connection from an HttpConnectionManager.
  @@ -37,7 +41,7 @@
    * 
    * @since 3.0
    */
  -public class ConnectTimeoutException extends HttpTimeoutException {
  +public class ConnectTimeoutException extends InterruptedIOException {
   
       /**
        * Creates a ConnectTimeoutException with a <tt>null</tt> detail message.
  @@ -63,7 +67,9 @@
        * if the cause is unavailable, unknown, or not a <tt>Throwable</tt>
        */
       public ConnectTimeoutException(String message, Throwable cause) {
  -        super(message, cause);
  +        super(message);
  +        // If we're running on JDK 1.4 or later, tell Throwable what the cause was
  +        ExceptionUtil.initCause(this, cause);
       }
   
   }
  
  
  
  1.4       +5 -3      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/DefaultMethodRetryHandler.java
  
  Index: DefaultMethodRetryHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/DefaultMethodRetryHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- DefaultMethodRetryHandler.java    18 Apr 2004 23:51:34 -0000      1.3
  +++ DefaultMethodRetryHandler.java    5 Jul 2004 22:46:58 -0000       1.4
  @@ -35,6 +35,8 @@
    * @author Michael Becke
    * 
    * @see HttpMethodBase#setMethodRetryHandler(MethodRetryHandler)
  + * 
  + * @deprecated use [EMAIL PROTECTED] 
org.apache.commons.httpclient.DefaultHttpMethodRetryHandler}
    */
   public class DefaultMethodRetryHandler implements MethodRetryHandler {
   
  
  
  
  1.96      +10 -169   
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java
  
  Index: HttpConnection.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java,v
  retrieving revision 1.95
  retrieving revision 1.96
  diff -u -r1.95 -r1.96
  --- HttpConnection.java       25 Jun 2004 03:34:56 -0000      1.95
  +++ HttpConnection.java       5 Jul 2004 22:46:58 -0000       1.96
  @@ -484,7 +484,7 @@
                           socket.setSoTimeout(this.params.getSoTimeout());
                       }
                   }
  -            } catch (IOTimeoutException e) {
  +            } catch (InterruptedIOException e) {
                   // aha - the connection is NOT stale - continue on!
               } catch (IOException e) {
                   // oops - the connection is stale, the read or soTimeout failed.
  @@ -687,16 +687,11 @@
                   socket.setReceiveBufferSize(rcvBufSize);
               }        
               inputStream = new PushbackInputStream(
  -                new WrappedInputStream(socket.getInputStream()));
  +                socket.getInputStream());
               outputStream = new BufferedOutputStream(
  -                new WrappedOutputStream(socket.getOutputStream()),
  -                socket.getSendBufferSize()
  -            );
  +                socket.getOutputStream(), socket.getSendBufferSize());
               isOpen = true;
               used = false;
  -        } catch (InterruptedIOException e) {
  -            closeSocketAndStreams();
  -            throw new ConnectTimeoutException("Open connection interrupted", e);
           } catch (IOException e) {
               // Connection wasn't opened properly
               // so close everything out
  @@ -741,11 +736,9 @@
               socket.setReceiveBufferSize(rcvBufSize);
           }        
           inputStream = new PushbackInputStream(
  -            new WrappedInputStream(socket.getInputStream()));
  +            socket.getInputStream());
           outputStream = new BufferedOutputStream(
  -            new WrappedOutputStream(socket.getOutputStream()),
  -            socket.getSendBufferSize()
  -        );
  +            socket.getOutputStream(), socket.getSendBufferSize());
           usingSecureSocket = true;
           tunnelEstablished = true;
           LOG.debug("Secure tunnel created");
  @@ -849,7 +842,7 @@
                   } else {
                       LOG.debug("Input data not available");
                   }
  -            } catch (IOTimeoutException e) {
  +            } catch (InterruptedIOException e) {
                   if (LOG.isDebugEnabled()) {
                       LOG.debug("Input data not available after " + timeout + " ms");
                   }
  @@ -1238,158 +1231,6 @@
        */
       public void setSendBufferSize(int sendBufferSize) throws SocketException {
           this.params.setSendBufferSize(sendBufferSize);
  -    }
  -
  -    /**
  -     * A wrapper for output streams that closes the connection and converts 
  -     * to HttpClient specific exceptions as appropriable when an IOException occurs.
  -     */
  -    private class WrappedOutputStream extends OutputStream {
  -
  -        /** the actual output stream */
  -        private OutputStream out;
  -
  -        /**
  -         * @param out the output stream to wrap
  -         */
  -        public WrappedOutputStream(OutputStream out) {
  -            this.out = out;
  -        }
  -
  -        /**
  -         * Closes the connection and conditionally converts exception to 
recoverable.
  -         * @param ioe the exception that occurred
  -         * @return the exception to be thrown
  -         */
  -        private IOException handleException(final IOException ioe) {
  -            // keep the original value of used, as it will be set to false by 
close().
  -            boolean isRecoverable = HttpConnection.this.used;
  -            HttpConnection.this.close();
  -            if (ioe instanceof InterruptedIOException) {
  -                return new IOTimeoutException(ioe.getMessage(), ioe); 
  -            } else if (isRecoverable) {
  -                LOG.debug(
  -                    "Output exception occurred on a used connection.  Will treat as 
recoverable.", 
  -                    ioe
  -                );
  -                return new HttpRecoverableException(ioe.getMessage(), ioe);         
       
  -            } else {
  -                return ioe;
  -            }            
  -        }
  -
  -        public void write(int b) throws IOException {
  -            try {
  -                out.write(b);
  -                HttpConnection.this.used = true;            
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -        
  -        public void flush() throws IOException {
  -            try {
  -                out.flush();            
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
  -        public void close() throws IOException {
  -            try {
  -                out.close();            
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
  -        public void write(byte[] b, int off, int len) throws IOException {
  -            try {
  -                out.write(b, off, len);
  -                HttpConnection.this.used = true;            
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
  -        public void write(byte[] b) throws IOException {
  -            try {
  -                out.write(b);            
  -                HttpConnection.this.used = true;            
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
  -    }
  -
  -    /**
  -     * A wrapper for input streams that converts to HTTPClient
  -     * specific exceptions as appropriable when an IOException occurs.
  -     */
  -    private class WrappedInputStream extends InputStream {
  -
  -        /** the actual inpuit stream */
  -        private InputStream in;
  -
  -        /**
  -         * @param in the input stream to wrap
  -         */
  -        public WrappedInputStream(InputStream in) {
  -            this.in = in;
  -        }
  -
  -        /**
  -         * Conditionally converts exception to HttpClient specific 
  -         * exception.
  -         * @param ioe the exception that occurred
  -         * @return the exception to be thrown
  -         */
  -        private IOException handleException(final IOException ioe) {
  -            if (ioe instanceof InterruptedIOException) {
  -                return new IOTimeoutException(ioe.getMessage(), ioe); 
  -            } else {
  -                return ioe;
  -            }            
  -        }
  -
  -        public int read() throws IOException {
  -            try {
  -                return in.read();
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -        
  -        public void close() throws IOException {
  -            in.close();            
  -        }
  -
  -        public int read(byte[] b, int off, int len) throws IOException {
  -            try {
  -                return in.read(b, off, len);
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
  -        public int read(byte[] b) throws IOException {
  -            try {
  -                return in.read(b);            
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
  -        public int available() throws IOException
  -        {
  -            try {
  -                return in.available();
  -            } catch (IOException ioe) {
  -                throw handleException(ioe);
  -            }
  -        }
  -
       }
   
       // ------------------------------------------------------- Static Variable
  
  
  
  1.24      +5 -5      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnectionManager.java
  
  Index: HttpConnectionManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnectionManager.java,v
  retrieving revision 1.23
  retrieving revision 1.24
  diff -u -r1.23 -r1.24
  --- HttpConnectionManager.java        17 May 2004 21:46:03 -0000      1.23
  +++ HttpConnectionManager.java        5 Jul 2004 22:46:58 -0000       1.24
  @@ -101,7 +101,7 @@
         * 
         * @return an HttpConnection for the given configuraiton
         * 
  -      * @throws ConnectTimeoutException if no connection becomes available before 
the
  +      * @throws ConnectionPoolTimeoutException if no connection becomes available 
before the
         * timeout expires
         * 
         * @see HttpConnection#setHttpConnectionManager(HttpConnectionManager)
  @@ -109,7 +109,7 @@
        * @since 3.0
         */
        HttpConnection getConnectionWithTimeout(HostConfiguration hostConfiguration, 
long timeout)
  -             throws ConnectTimeoutException;
  +             throws ConnectionPoolTimeoutException;
   
       /**
        * Releases the given HttpConnection for use by other requests.
  
  
  
  1.41      +14 -22    
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethod.java
  
  Index: HttpMethod.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethod.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- HttpMethod.java   13 Jun 2004 20:22:18 -0000      1.40
  +++ HttpMethod.java   5 Jul 2004 22:46:58 -0000       1.41
  @@ -544,24 +544,6 @@
       public void setParams(final HttpMethodParams params);
   
       /**
  -     * Returns the [EMAIL PROTECTED] MethodRetryHandler retry handler} for this 
HTTP method
  -     * 
  -     * @return the methodRetryHandler
  -     * 
  -     * @since 3.0
  -     */
  -    public MethodRetryHandler getMethodRetryHandler();
  -
  -    /**
  -     * Sets the [EMAIL PROTECTED] MethodRetryHandler retry handler} for this HTTP 
method
  -     * 
  -     * @param handler the methodRetryHandler to use when this method executed
  -     * 
  -     * @since 3.0
  -     */
  -    public void setMethodRetryHandler(MethodRetryHandler handler);
  -
  -    /**
        * Returns the target host [EMAIL PROTECTED] AuthState authentication state}
        * 
        * @return host authentication state
  @@ -578,5 +560,15 @@
        * @since 3.0
        */
       public AuthState getProxyAuthState();
  +
  +    /**
  +     * Returns <tt>true</tt> if the HTTP has been transmitted to the target
  +     * server in its entirety, <tt>false</tt> otherwise. This flag can be useful 
  +     * for recovery logic. If the request has not been transmitted in its entirety,
  +     * it is safe to retry the failed method.
  +     * 
  +     * @return <tt>true</tt> if the request has been sent, <tt>false</tt> otherwise
  +     */
  +    boolean isRequestSent();
   
   }
  
  
  
  1.210     +38 -16    
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java
  
  Index: HttpMethodBase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodBase.java,v
  retrieving revision 1.209
  retrieving revision 1.210
  diff -u -r1.209 -r1.210
  --- HttpMethodBase.java       24 Jun 2004 21:39:52 -0000      1.209
  +++ HttpMethodBase.java       5 Jul 2004 22:46:58 -0000       1.210
  @@ -33,6 +33,7 @@
   import java.io.ByteArrayOutputStream;
   import java.io.IOException;
   import java.io.InputStream;
  +import java.io.InterruptedIOException;
   
   import org.apache.commons.httpclient.auth.AuthState;
   import org.apache.commons.httpclient.cookie.CookiePolicy;
  @@ -156,6 +157,8 @@
   
       /**
        * Handles method retries
  +     * 
  +     * @deprecated no loner used
        */
       private MethodRetryHandler methodRetryHandler;
   
  @@ -171,6 +174,9 @@
       /** Whether the execution of this method has been aborted */
       private transient boolean aborted = false;
   
  +    /** Whether the HTTP request has been transmitted to the target
  +     * server it its entirety */
  +    private boolean requestSent = false;
       // ----------------------------------------------------------- Constructors
   
       /**
  @@ -971,9 +977,8 @@
               this.effectiveVersion = this.params.getVersion(); 
           }
   
  -        boolean requestSent = false;
           writeRequest(state, conn);
  -        requestSent = true;
  +        this.requestSent = true;
           readResponse(state, conn);
           // the method has successfully executed
           used = true; 
  @@ -1040,6 +1045,7 @@
           connectionCloseForced = false;
           hostAuthState.invalidate();
           proxyAuthState.invalidate();
  +        requestSent = false;
       }
   
       /**
  @@ -1783,6 +1789,11 @@
           String s;
           do {
               s = conn.readLine(getParams().getHttpElementCharset());
  +            if (s == null && count == 0) {
  +                // The server just dropped connection on us
  +                throw new NoHttpResponseException("The server " + conn.getHost() + 
  +                    " failed to respond");
  +            }
               if (Wire.HEADER_WIRE.enabled()) {
                   Wire.HEADER_WIRE.input(s + "\r\n");
               }
  @@ -1791,9 +1802,8 @@
                   break;
               } else if (s == null || count >= maxGarbageLines) {
                   // Giving up
  -                throw new HttpRecoverableException("Error in parsing the status "
  -                    + " line from the response: unable to find line starting with"
  -                    + " \"HTTP\"");
  +                throw new ProtocolException("The server " + conn.getHost() + 
  +                        " failed to respond with a valid HTTP response");
               }
               count++;
           } while(true);
  @@ -1897,7 +1907,7 @@
                       } else {
                           return;
                       }
  -                } catch (IOTimeoutException e) {
  +                } catch (InterruptedIOException e) {
                       // Most probably Expect header is not recongnized
                       // Remove the header to signal the method 
                       // that it's okay to go ahead with sending data
  @@ -2256,13 +2266,10 @@
        * Returns the [EMAIL PROTECTED] MethodRetryHandler retry handler} for this 
HTTP method
        * 
        * @return the methodRetryHandler
  +     * 
  +     * @deprecated use [EMAIL PROTECTED] HttpMethodParams}
        */
       public MethodRetryHandler getMethodRetryHandler() {
  -        
  -        if (methodRetryHandler == null) {
  -            methodRetryHandler = new DefaultMethodRetryHandler();
  -        }
  -
           return methodRetryHandler;
       }
   
  @@ -2270,6 +2277,8 @@
        * Sets the [EMAIL PROTECTED] MethodRetryHandler retry handler} for this HTTP 
method
        * 
        * @param handler the methodRetryHandler to use when this method executed
  +     * 
  +     * @deprecated use [EMAIL PROTECTED] HttpMethodParams}
        */
       public void setMethodRetryHandler(MethodRetryHandler handler) {
           methodRetryHandler = handler;
  @@ -2328,5 +2337,18 @@
        */
       public boolean isAborted() {
           return this.aborted;
  -    }    
  +    }
  +    
  +    /**
  +     * Returns <tt>true</tt> if the HTTP has been transmitted to the target
  +     * server in its entirety, <tt>false</tt> otherwise. This flag can be useful 
  +     * for recovery logic. If the request has not been transmitted in its entirety,
  +     * it is safe to retry the failed method.
  +     * 
  +     * @return <tt>true</tt> if the request has been sent, <tt>false</tt> otherwise
  +     */
  +    public boolean isRequestSent() {
  +        return this.requestSent;
  +    }
  +    
   }
  
  
  
  1.28      +44 -28    
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
  
  Index: HttpMethodDirector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodDirector.java,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- HttpMethodDirector.java   25 Jun 2004 03:34:56 -0000      1.27
  +++ HttpMethodDirector.java   5 Jul 2004 22:46:58 -0000       1.28
  @@ -336,17 +336,12 @@
           throws IOException, HttpException {
           
           /** How many times did this transparently handle a recoverable exception? */
  -        int recoverableExceptionCount = 0;
           int execCount = 0;
  -        // TODO: how do we get requestSent?
  -        boolean requestSent = false;
  -        
           // loop until the method is successfully processed, the retryHandler 
           // returns false or a non-recoverable exception is thrown
           try {
               while (true) {
                   execCount++;
  -                requestSent = false;
   
                   if (LOG.isTraceEnabled()) {
                       LOG.trace("Attempt number " + execCount + " to process 
request");
  @@ -382,31 +377,52 @@
                   try {
                       method.execute(state, this.conn);
                       break;
  -                } catch (HttpRecoverableException httpre) {
  +                } catch (HttpException e) {
  +                    // filter out protocol exceptions which cannot be recovered from
  +                    throw e;
  +                } catch (IOException e) {
                       LOG.debug("Closing the connection.");
                       this.conn.close();
  -                    LOG.info("Recoverable exception caught when processing 
request");
  -                    // update the recoverable exception count.
  -                    recoverableExceptionCount++;
  -                
  -                    // test if this method should be retried                
  -                    MethodRetryHandler handler = method.getMethodRetryHandler();
  +                    // test if this method should be retried
  +                    // ========================================
  +                    // this code is provided for backward compatibility with 2.0
  +                    // will be removed in the next major release
  +                    if (method instanceof HttpMethodBase) {
  +                        MethodRetryHandler handler = 
  +                            ((HttpMethodBase)method).getMethodRetryHandler();
  +                        if (handler != null) {
  +                            if (!handler.retryMethod(
  +                                    method,
  +                                    this.conn, 
  +                                    new HttpRecoverableException(e.getMessage()),
  +                                    execCount, 
  +                                    method.isRequestSent())) {
  +                                LOG.debug("Method retry handler returned false. "
  +                                        + "Automatic recovery will not be 
attempted");
  +                                throw e;
  +                            }
  +                        }
  +                    }
  +                    // ========================================
  +                    HttpMethodRetryHandler handler = 
  +                        (HttpMethodRetryHandler)method.getParams().getParameter(
  +                                HttpMethodRetryHandler.HANDLER);
                       if (handler == null) {
  -                        handler = new DefaultMethodRetryHandler();
  +                        handler = new DefaultHttpMethodRetryHandler();
  +                    }
  +                    if (!handler.retryMethod(method, e, execCount)) {
  +                        LOG.debug("Method retry handler returned false. "
  +                                + "Automatic recovery will not be attempted");
  +                        throw e;
  +                    }
  +                    if (LOG.isInfoEnabled()) {
  +                        LOG.info("I/O exception caught when processing request: "
  +                                + e.getMessage());
                       }
  -                    if (!handler.retryMethod(
  -                            method, 
  -                            this.conn, 
  -                            httpre, 
  -                            execCount, 
  -                            requestSent)
  -                    ) {
  -                        LOG.warn(
  -                            "Recoverable exception caught but 
MethodRetryHandler.retryMethod() "
  -                            + "returned false, rethrowing exception"
  -                        );
  -                        throw httpre;
  +                    if (LOG.isDebugEnabled()) {
  +                        LOG.debug(e.getMessage(), e);
                       }
  +                    LOG.info("Retrying request");
                   }
               }
           } catch (IOException e) {
  
  
  
  1.15      +8 -23     
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpRecoverableException.java
  
  Index: HttpRecoverableException.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpRecoverableException.java,v
  retrieving revision 1.14
  retrieving revision 1.15
  diff -u -r1.14 -r1.15
  --- HttpRecoverableException.java     13 May 2004 04:03:25 -0000      1.14
  +++ HttpRecoverableException.java     5 Jul 2004 22:46:58 -0000       1.15
  @@ -29,10 +29,6 @@
   
   package org.apache.commons.httpclient;
   
  -import java.io.IOException;
  -
  -import org.apache.commons.httpclient.util.ExceptionUtil;
  -
   /**
    * <p>
    * Signals that an HTTP or HttpClient exception has occurred.  This
  @@ -40,10 +36,13 @@
    * may be retried.  It may be possible to retrieve the underlying transient
    * error via the inherited [EMAIL PROTECTED] HttpException#getCause()} method.
    * </p>
  + * 
  + * @deprecated no longer used
  + * 
    * @author Unascribed
    * @version $Revision$ $Date$
    */
  -public class HttpRecoverableException extends IOException {
  +public class HttpRecoverableException extends HttpException {
   
       /**
        * Creates a new HttpRecoverableException with a <tt>null</tt> detail message.
  @@ -61,18 +60,4 @@
           super(message);
       }
   
  -    /**
  -     * Creates a new HttpRecoverableException with the specified detail message and 
cause.
  -     *
  -     * @param message the exception detail message
  -     * @param cause the <tt>Throwable</tt> that caused this exception, or 
<tt>null</tt>
  -     * if the cause is unavailable, unknown, or not a <tt>Throwable</tt>
  -     * 
  -     * @since 3.0
  -     */
  -    public HttpRecoverableException(String message, Throwable cause) {
  -        super(message);
  -        // If we're running on JDK 1.4 or later, tell Throwable what the cause was
  -        ExceptionUtil.initCause(this, cause);
  -    }
   }
  
  
  
  1.5       +7 -4      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MethodRetryHandler.java
  
  Index: MethodRetryHandler.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MethodRetryHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- MethodRetryHandler.java   18 Apr 2004 23:51:35 -0000      1.4
  +++ MethodRetryHandler.java   5 Jul 2004 22:46:58 -0000       1.5
  @@ -36,6 +36,8 @@
    * @see HttpMethod#execute(HttpState, HttpConnection)
    * @see HttpRecoverableException
    * 
  + * @deprecated use [EMAIL PROTECTED] HttpMethodRetryHandler}
  + * 
    * @author Michael Becke
    */
   public interface MethodRetryHandler {
  @@ -49,7 +51,8 @@
        * @param recoverableException the exception that occurred
        * @param executionCount the number of times this method has been 
        * unsuccessfully executed
  -     * @param requestSent a flag indicating if the request has been fully sent or 
not
  +     * @param requestSent this argument is unused and will be removed in the 
future. 
  +     *   [EMAIL PROTECTED] HttpMethod#isRequestSent()} should be used instead
        * 
        * @return <code>true</code> if the method should be retried, <code>false</code>
        * otherwise
  
  
  
  1.41      +8 -8      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java
  
  Index: MultiThreadedHttpConnectionManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- MultiThreadedHttpConnectionManager.java   25 Jun 2004 03:34:56 -0000      1.40
  +++ MultiThreadedHttpConnectionManager.java   5 Jul 2004 22:46:58 -0000       1.41
  @@ -356,7 +356,7 @@
           while (true) {
               try {
                   return getConnectionWithTimeout(hostConfiguration, 0);
  -            } catch (ConnectTimeoutException e) {
  +            } catch (ConnectionPoolTimeoutException e) {
                   // we'll go ahead and log this, but it should never happen. 
HttpExceptions
                   // are only thrown when the timeout occurs and since we have no 
timeout
                   // it should never happen.
  @@ -374,7 +374,7 @@
        * @since 3.0
        */
       public HttpConnection getConnectionWithTimeout(HostConfiguration 
hostConfiguration, 
  -        long timeout) throws ConnectTimeoutException {
  +        long timeout) throws ConnectionPoolTimeoutException {
   
           LOG.trace("enter 
HttpConnectionManager.getConnectionWithTimeout(HostConfiguration, long)");
   
  @@ -405,7 +405,7 @@
                LOG.trace("enter 
HttpConnectionManager.getConnection(HostConfiguration, long)");
                try {
                        return getConnectionWithTimeout(hostConfiguration, timeout);
  -             } catch(ConnectTimeoutException e) {
  +             } catch(ConnectionPoolTimeoutException e) {
                        throw new HttpException(e.getMessage());
                }
        }
  @@ -426,7 +426,7 @@
        * 'timeout' milliseconds
        */
       private HttpConnection doGetConnection(HostConfiguration hostConfiguration, 
  -        long timeout) throws ConnectTimeoutException {
  +        long timeout) throws ConnectionPoolTimeoutException {
   
           HttpConnection connection = null;
   
  @@ -487,7 +487,7 @@
                       try {
                           
                           if (useTimeout && timeToWait <= 0) {
  -                            throw new ConnectTimeoutException("Timeout waiting for 
connection");
  +                            throw new ConnectionPoolTimeoutException("Timeout 
waiting for connection");
                           }
                           
                           if (LOG.isDebugEnabled()) {
  
  
  
  1.1                  
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/ConnectionPoolTimeoutException.java
  
  Index: ConnectionPoolTimeoutException.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/ConnectionPoolTimeoutException.java,v
 1.1 2004/07/05 22:46:58 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/05 22:46:58 $
   *
   * ====================================================================
   *
   *  Copyright 1999-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.httpclient;
  
  /**
   * A timeout while connecting waiting for an available connection 
   * from an HttpConnectionManager.
   * 
   * @author <a href="mailto:[EMAIL PROTECTED]">Laura Werner</a>
   * 
   * @since 3.0
   */
  public class ConnectionPoolTimeoutException extends ConnectTimeoutException {
  
      /**
       * Creates a ConnectTimeoutException with a <tt>null</tt> detail message.
       */
      public ConnectionPoolTimeoutException() {
          super();
      }
  
      /**
       * Creates a ConnectTimeoutException with the specified detail message.
       * 
       * @param message The exception detail message 
       */
      public ConnectionPoolTimeoutException(String message) {
          super(message);
      }
  
      /**
       * Creates a new ConnectTimeoutException with the specified detail message and 
cause.
       * 
       * @param message the exception detail message
       * @param cause the <tt>Throwable</tt> that caused this exception, or 
<tt>null</tt>
       * if the cause is unavailable, unknown, or not a <tt>Throwable</tt>
       */
      public ConnectionPoolTimeoutException(String message, Throwable cause) {
          super(message, cause);
      }
  
  }
  
  
  
  1.1                  
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/DefaultHttpMethodRetryHandler.java
  
  Index: DefaultHttpMethodRetryHandler.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/DefaultHttpMethodRetryHandler.java,v
 1.1 2004/07/05 22:46:58 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/05 22:46:58 $
   *
   * ====================================================================
   *
   *  Copyright 1999-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.httpclient;
  
  import java.io.IOException;
  
  /**
   * The default [EMAIL PROTECTED] HttpMethodRetryHandler} used by [EMAIL PROTECTED] 
HttpMethod}s.
   * 
   * @author Michael Becke
   * @author <a href="mailto:oleg -at- ural.ru">Oleg Kalnichevski</a>
   */
  public class DefaultHttpMethodRetryHandler implements HttpMethodRetryHandler {
  
      /** the number of times a method will be retried */
      private int retryCount;
      
      /** Whether or not methods that have successfully sent their request will be 
retried */
      private boolean requestSentRetryEnabled;
      
      /**
       * Default constructor
       */
      public DefaultHttpMethodRetryHandler(int retryCount, boolean 
requestSentRetryEnabled) {
          super();
          this.retryCount = retryCount;
          this.requestSentRetryEnabled = requestSentRetryEnabled;
      }
      
      /**
       * Default constructor
       */
      public DefaultHttpMethodRetryHandler() {
          this(3, false);
      }
      /** 
       * Used <code>retryCount</code> and <code>requestSentRetryEnabled</code> to 
determine
       * if the given method should be retried.
       * 
       * @see HttpMethodRetryHandler#retryMethod(HttpMethod, IOException, int)
       */
      public boolean retryMethod(
          final HttpMethod method, 
          final IOException exception, 
          int executionCount) {
          if (method == null) {
              throw new IllegalArgumentException("HTTP method may not be null");
          }
          if (exception == null) {
              throw new IllegalArgumentException("Exception parameter may not be 
null");
          }
          if (executionCount >= this.retryCount) {
              // Do not retry if over max retry count
              return false;
          }
          if (exception instanceof NoHttpResponseException) {
              // Retry if the server dropped connection on us
              return true;
          }
          if (!method.isRequestSent() || this.requestSentRetryEnabled) {
              // Retry if the request has not been sent fully or
              // if it's OK to retry methods that have been sent
              return true;
          }
          // otherwise do not retry
          return false;
      }
      
      /**
       * @return <code>true</code> if this handler will retry methods that have 
       * successfully sent their request, <code>false</code> otherwise
       */
      public boolean isRequestSentRetryEnabled() {
          return requestSentRetryEnabled;
      }
  
      /**
       * @return the maximum number of times a method will be retried
       */
      public int getRetryCount() {
          return retryCount;
      }
  }
  
  
  
  1.1                  
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodRetryHandler.java
  
  Index: HttpMethodRetryHandler.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodRetryHandler.java,v
 1.1 2004/07/05 22:46:58 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/05 22:46:58 $
   *
   * ====================================================================
   *
   *  Copyright 1999-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.httpclient;
  
  import java.io.IOException;
  
  /**
   * A handler for determining if an HttpMethod should be retried after a 
   * recoverable exception during execution.
   * 
   * <p>
   * Classes implementing this interface must synchronize access to shared
   * data as methods of this interfrace may be executed from multiple threads 
   * </p>
   * 
   * @see HttpMethod#execute(HttpState, HttpConnection)
   * @see HttpRecoverableException
   * 
   * @author Michael Becke
   * @author <a href="mailto:oleg -at- ural.ru">Oleg Kalnichevski</a>
   */
  public interface HttpMethodRetryHandler {
  
      /**
       * Sets the method retry handler parameter.
       * <p>
       * This parameter expects a value of type [EMAIL PROTECTED] 
HttpMethodRetryHandler}.
       * </p>
       */ 
      public static final String HANDLER = "http.method.retry-handler";
      
      /**
       * Determines if a method should be retried after an HttpRecoverableException
       * occurs during execution.
       * 
       * @param method the method being executed
       * @param exception the exception that occurred
       * @param executionCount the number of times this method has been 
       * unsuccessfully executed
       * 
       * @return <code>true</code> if the method should be retried, <code>false</code>
       * otherwise
       */
      boolean retryMethod(HttpMethod method, IOException exception, int 
executionCount);
  
  }
  
  
  
  1.1                  
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/NoHttpResponseException.java
  
  Index: NoHttpResponseException.java
  ===================================================================
  /*
   * $Header: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/NoHttpResponseException.java,v
 1.1 2004/07/05 22:46:58 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2004/07/05 22:46:58 $
   *
   * ====================================================================
   *
   *  Copyright 1999-2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.httpclient;
  
  import java.io.IOException;
  
  import org.apache.commons.httpclient.util.ExceptionUtil;
  
  /**
   * <p>
   * Signals that the target server failed to respond with a valid HTTP response.
   * </p>
   * 
   * @author <a href="mailto:oleg -at- ural.ru">Oleg Kalnichevski</a>
   * 
   * @version $Revision: 1.1 $
   */
  public class NoHttpResponseException extends IOException {
  
      /**
       * Creates a new NoHttpResponseException with a <tt>null</tt> detail message.
       */
      public NoHttpResponseException() {
          super();
      }
  
      /**
       * Creates a new NoHttpResponseException with the specified detail message.
       *
       * @param message exception message
       */
      public NoHttpResponseException(String message) {
          super(message);
      }
  
      /**
       * Creates a new NoHttpResponseException with the specified detail message and 
cause.
       *
       * @param message the exception detail message
       * @param cause the <tt>Throwable</tt> that caused this exception, or 
<tt>null</tt>
       * if the cause is unavailable, unknown, or not a <tt>Throwable</tt>
       * 
       * @since 3.0
       */
      public NoHttpResponseException(String message, Throwable cause) {
          super(message);
          // If we're running on JDK 1.4 or later, tell Throwable what the cause was
          ExceptionUtil.initCause(this, cause);
      }
  }
  
  
  
  1.6       +6 -3      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/CredentialsProvider.java
  
  Index: CredentialsProvider.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/auth/CredentialsProvider.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- CredentialsProvider.java  13 May 2004 04:02:00 -0000      1.5
  +++ CredentialsProvider.java  5 Jul 2004 22:46:59 -0000       1.6
  @@ -39,6 +39,9 @@
    * or given credentials are incorrect. 
    * </p>
    * 
  + * Classes implementing this interface must synchronize access to shared
  + * data as methods of this interfrace may be executed from multiple threads 
  + * 
    * @author Ortwin Glueck
    * @author <a href="mailto:[EMAIL PROTECTED]">Oleg Kalnichevski</a>
    * 
  
  
  
  1.11      +7 -4      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/params/DefaultHttpParamsFactory.java
  
  Index: DefaultHttpParamsFactory.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/params/DefaultHttpParamsFactory.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- DefaultHttpParamsFactory.java     17 May 2004 03:46:44 -0000      1.10
  +++ DefaultHttpParamsFactory.java     5 Jul 2004 22:46:59 -0000       1.11
  @@ -32,6 +32,8 @@
   import java.util.ArrayList;
   import java.util.Arrays;
   
  +import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
  +import org.apache.commons.httpclient.HttpMethodRetryHandler;
   import org.apache.commons.httpclient.HttpVersion;
   import org.apache.commons.httpclient.SimpleHttpConnectionManager;
   import org.apache.commons.httpclient.cookie.CookiePolicy;
  @@ -73,7 +75,8 @@
           params.setCookiePolicy(CookiePolicy.RFC_2109);
           params.setHttpElementCharset("US-ASCII");
           params.setContentCharset("ISO-8859-1");
  -
  +        params.setParameter(HttpMethodRetryHandler.HANDLER, new 
DefaultHttpMethodRetryHandler());
  +        
           ArrayList datePatterns = new ArrayList();
           datePatterns.addAll(
               Arrays.asList(
  
  
  
  1.7       +4 -4      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/NoHostHttpConnectionManager.java
  
  Index: NoHostHttpConnectionManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/NoHostHttpConnectionManager.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- NoHostHttpConnectionManager.java  25 Apr 2004 21:49:35 -0000      1.6
  +++ NoHostHttpConnectionManager.java  5 Jul 2004 22:46:59 -0000       1.7
  @@ -110,7 +110,7 @@
       public HttpConnection getConnectionWithTimeout(
           HostConfiguration hostConfiguration,
           long timeout)
  -        throws ConnectTimeoutException {
  +        throws ConnectionPoolTimeoutException {
           return getConnection(hostConfiguration);
       }
   
  
  
  
  1.3       +4 -4      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestIdleConnectionTimeout.java
  
  Index: TestIdleConnectionTimeout.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestIdleConnectionTimeout.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- TestIdleConnectionTimeout.java    4 May 2004 21:24:51 -0000       1.2
  +++ TestIdleConnectionTimeout.java    5 Jul 2004 22:46:59 -0000       1.3
  @@ -147,7 +147,7 @@
           }
   
           public HttpConnection getConnectionWithTimeout(HostConfiguration 
hostConfiguration,
  -            long timeout) throws ConnectTimeoutException {
  +            long timeout) throws ConnectionPoolTimeoutException {
               return null;
           }
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to