remm        2003/03/25 10:54:40

  Modified:    util/java/org/apache/tomcat/util/http/mapper Mapper.java
  Log:
  - The wildcard mapping algorithm was incorrect. This should fix it.
  
  Revision  Changes    Path
  1.13      +42 -13    
jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/mapper/Mapper.java
  
  Index: Mapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/util/java/org/apache/tomcat/util/http/mapper/Mapper.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- Mapper.java       25 Mar 2003 17:52:56 -0000      1.12
  +++ Mapper.java       25 Mar 2003 18:54:40 -0000      1.13
  @@ -709,24 +709,31 @@
        */
       private final void internalMapWildcardWrapper
           (Wrapper[] wrappers, CharChunk path, MappingData mappingData) {
  +
  +        int pathEnd = path.getEnd();
  +        int pathOffset = path.getOffset();
  +
           int length = -1;
           int pos = find(wrappers, path);
           if (pos != -1) {
  +            int lastSlash = pathEnd;
               boolean found = false;
  -            while (path.startsWith(wrappers[pos].name)) {
  -                length = wrappers[pos].name.length();
  -                if (path.getLength() == length) {
  -                    found = true;
  -                    break;
  -                } else if (path.startsWithIgnoreCase("/", length)) {
  -                    found = true;
  -                    break;
  -                }
  -                pos--;
  -                if (pos < 0) {
  -                    break;
  -                }
  +            while (pos >= 0) {
  +                if (path.startsWith(wrappers[pos].name)) {
  +                    length = wrappers[pos].name.length();
  +                    if (path.getLength() == length) {
  +                        found = true;
  +                        break;
  +                    } else if (path.startsWithIgnoreCase("/", length)) {
  +                        found = true;
  +                        break;
  +                    }
  +                }
  +                lastSlash = lastSlash(path);
  +                path.setEnd(lastSlash);
  +                pos = find(wrappers, path);
               }
  +            path.setEnd(pathEnd);
               if (found) {
                   mappingData.wrapperPath.setString(wrappers[pos].name);
                   if (path.getLength() > length) {
  @@ -742,6 +749,7 @@
           }
       }
   
  +
       /**
        * Extension mappings.
        */
  @@ -916,6 +924,27 @@
               }
           }
           return result;
  +    }
  +
  +
  +    /**
  +     * Find the position of the last slash in the given char chunk.
  +     */
  +    private static final int lastSlash(CharChunk name) {
  +
  +        char[] c = name.getBuffer();
  +        int end = name.getEnd();
  +        int start = name.getStart();
  +        int pos = end;
  +
  +        while (pos > start) {
  +            if (c[--pos] == '/') {
  +                break;
  +            }
  +        }
  +
  +        return (pos);
  +
       }
   
   
  
  
  

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

Reply via email to