vmassol     01/07/05 07:24:45

  Modified:    cactus/src/framework/servlet23/org/apache/commons/cactus/server
                        HttpServletRequestWrapper.java
  Log:
  changed implementation of HttpServletRequestWrapper.getRequestDispatcher() for 
Servlet API 2.3
  
  Revision  Changes    Path
  1.4       +41 -1     
jakarta-commons/cactus/src/framework/servlet23/org/apache/commons/cactus/server/HttpServletRequestWrapper.java
  
  Index: HttpServletRequestWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/cactus/src/framework/servlet23/org/apache/commons/cactus/server/HttpServletRequestWrapper.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HttpServletRequestWrapper.java    2001/07/04 09:17:30     1.3
  +++ HttpServletRequestWrapper.java    2001/07/05 14:24:45     1.4
  @@ -414,8 +414,18 @@
   
           } else {
   
  -            fullPath = getServletPath() + "/../" + thePath;
  +         String pI = getPathInfo();
  +         if (pI == null) {
  +                fullPath = catPath(getServletPath(), thePath);
  +            } else {
  +                 fullPath = catPath(getServletPath() + pI, thePath);
  +            }
   
  +             if (fullPath == null) {
  +                m_Logger.exit("getRequestDispatcher");
  +                return null;
  +            }
  +
           }
                   
           m_Logger.debug("Computed full path : [" + fullPath + "]");
  @@ -425,6 +435,36 @@
   
           m_Logger.exit("getRequestDispatcher");
           return dispatcher;
  +    }
  +
  +    /**
  +     * Will concatenate 2 paths, dealing with ..
  +     * ( /a/b/c + d = /a/b/d, /a/b/c + ../d = /a/d ). Code borrowed from 
  +     * Tomcat 3.2.2 !
  +     *
  +     * @return null if error occurs
  +     */
  +    private String catPath(String lookupPath, String path)
  +    {
  +     // Cut off the last slash and everything beyond
  +         int index = lookupPath.lastIndexOf("/");
  +         lookupPath = lookupPath.substring(0, index);
  +     
  +         // Deal with .. by chopping dirs off the lookup path
  +         while (path.startsWith("../")) { 
  +             if (lookupPath.length() > 0) {
  +                     index = lookupPath.lastIndexOf("/");
  +                     lookupPath = lookupPath.substring(0, index);
  +             } else {
  +             // More ..'s than dirs, return null
  +             return null;
  +             }
  +         
  +         index = path.indexOf("../") + 3;
  +             path = path.substring(index);
  +         }
  +     
  +         return lookupPath + "/" + path;
       }
   
       public String getRemoteHost()
  
  
  

Reply via email to