You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ol...@apache.org on 2005/01/14 20:40:39 UTC

cvs commit: jakarta-commons/httpclient/src/test/org/apache/commons/httpclient TestRedirects.java

olegk       2005/01/14 11:40:39

  Modified:    httpclient/src/java/org/apache/commons/httpclient
                        HttpMethodDirector.java
               httpclient/src/test/org/apache/commons/httpclient
                        TestRedirects.java
  Added:       httpclient/src/java/org/apache/commons/httpclient
                        CircularRedirectException.java
  Log:
  PR #33021 (ALLOW_CIRCULAR_REDIRECTS has no effect if references include query string)
  
  Contributed by Ilya Kharmatsky <ilyak at mainsoft.com>
  Reviewed by Oleg Kalnichevski, Michael Becke
  
  Revision  Changes    Path
  1.34      +14 -6     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.33
  retrieving revision 1.34
  diff -u -r1.33 -r1.34
  --- HttpMethodDirector.java	19 Dec 2004 16:21:42 -0000	1.33
  +++ HttpMethodDirector.java	14 Jan 2005 19:40:39 -0000	1.34
  @@ -593,9 +593,18 @@
                   this.redirectLocations = new HashSet();
               }
               this.redirectLocations.add(currentUri);
  +            try {
  +                if(redirectUri.hasQuery()) {
  +                    redirectUri.setQuery(null);
  +                }
  +            } catch (URIException e) {
  +                // Should never happen
  +                return false;
  +            }
  +
               if (this.redirectLocations.contains(redirectUri)) {
  -                throw new RedirectException("Circular redirect to '" +
  -                    redirectUri + "'");   
  +                throw new CircularRedirectException("Circular redirect to '" +
  +                    redirectUri + "'");
               }
           }
   
  @@ -603,7 +612,6 @@
   			LOG.debug("Redirecting from '" + currentUri.getEscapedURI()
   				+ "' to '" + redirectUri.getEscapedURI());
   		}
  -
           //And finally invalidate the actual authentication scheme
           method.getHostAuthState().invalidate(); 
   		return true;
  
  
  
  1.1                  jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/CircularRedirectException.java
  
  Index: CircularRedirectException.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/CircularRedirectException.java,v 1.1 2005/01/14 19:40:39 olegk Exp $
   * $Revision: 1.1 $
   * $Date: 2005/01/14 19:40:39 $
   *
   * ====================================================================
   *
   *  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;
  
  /**
   * Signals a circular redirect
   * 
   * @author <a href="mailto:oleg@ural.ru">Oleg Kalnichevski</a>
   * 
   * @since 3.0
   */
  public class CircularRedirectException extends RedirectException {
  
      /**
       * Creates a new CircularRedirectException with a <tt>null</tt> detail message. 
       */
      public CircularRedirectException() {
          super();
      }
  
      /**
       * Creates a new CircularRedirectException with the specified detail message.
       * 
       * @param message The exception detail message
       */
      public CircularRedirectException(String message) {
          super(message);
      }
  
      /**
       * Creates a new CircularRedirectException 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 CircularRedirectException(String message, Throwable cause) {
          super(message, cause);
      }
  }
  
  
  
  1.9       +13 -13    jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestRedirects.java
  
  Index: TestRedirects.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestRedirects.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- TestRedirects.java	13 Nov 2004 12:21:28 -0000	1.8
  +++ TestRedirects.java	14 Jan 2005 19:40:39 -0000	1.9
  @@ -113,21 +113,23 @@
   
       private class CircularRedirectService implements HttpService {
   
  +        private int invocations = 0;
  +        
           public CircularRedirectService() {
               super();
           }
  -
  +        
           public boolean process(final SimpleRequest request, final SimpleResponse response)
               throws IOException
           {
               RequestLine reqline = request.getRequestLine();
               HttpVersion ver = reqline.getHttpVersion();
  -            if (reqline.getUri().equals("/circular-oldlocation/")) {
  +            if (reqline.getUri().startsWith("/circular-oldlocation")) {
                   response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
  -                response.addHeader(new Header("Location", "/circular-location2/"));
  -            } else if (reqline.getUri().equals("/circular-location2/")) {
  +                response.addHeader(new Header("Location", "/circular-location2?invk=" + (++this.invocations)));
  +            } else if (reqline.getUri().startsWith("/circular-location2")) {
                   response.setStatusLine(ver, HttpStatus.SC_MOVED_TEMPORARILY);
  -                response.addHeader(new Header("Location", "/circular-oldlocation/"));
  +                response.addHeader(new Header("Location", "/circular-oldlocation?invk=" + (++this.invocations)));
               } else {
                   response.setStatusLine(ver, HttpStatus.SC_NOT_FOUND);
               }
  @@ -348,10 +350,8 @@
           try {
               this.client.getParams().setBooleanParameter(HttpClientParams.ALLOW_CIRCULAR_REDIRECTS, false);
               this.client.executeMethod(httpget);
  -            fail("RedirectException exception should have been thrown");
  -        }
  -        catch (RedirectException e) {
  -            // expected
  +            fail("CircularRedirectException exception should have been thrown");
  +        } catch (CircularRedirectException expected) {
           } finally {
               httpget.releaseConnection();
           }
  
  
  

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