funkman 2003/11/21 11:00:52 Modified: catalina/src/conf web.xml catalina/src/share/org/apache/catalina/servlets DefaultServlet.java Log: Allow welcome files and directory redirects to be urlEncoded to satisfy many tomcat-user complaints. I thought there were Bugzilla reports too but can't find them Default behavior is to not encode for backwards compatibility. Revision Changes Path 1.51 +3 -0 jakarta-tomcat-4.0/catalina/src/conf/web.xml Index: web.xml =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/conf/web.xml,v retrieving revision 1.50 retrieving revision 1.51 diff -u -r1.50 -r1.51 --- web.xml 18 Jun 2003 20:52:54 -0000 1.50 +++ web.xml 21 Nov 2003 19:00:52 -0000 1.51 @@ -39,6 +39,9 @@ <!-- readonly Is this context "read only", so HTTP --> <!-- commands like PUT and DELETE are --> <!-- rejected? [true] --> + <!-- --> + <!-- encodeRedirects Call encodeRedirectURL() on welcomefile or --> + <!-- directory redirects. [false] --> <servlet> <servlet-name>default</servlet-name> 1.60 +46 -28 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/DefaultServlet.java Index: DefaultServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/servlets/DefaultServlet.java,v retrieving revision 1.59 retrieving revision 1.60 diff -u -r1.59 -r1.60 --- DefaultServlet.java 8 Jan 2003 19:38:05 -0000 1.59 +++ DefaultServlet.java 21 Nov 2003 19:00:52 -0000 1.60 @@ -165,6 +165,12 @@ /** + * Calls encodeRedirectURL on redirects? default=false + */ + protected boolean encodeRedirects = false; + + + /** * The set of welcome files for this web application */ protected String welcomes[] = new String[0]; @@ -294,6 +300,12 @@ } catch (Throwable t) { ; } + try { + value = getServletConfig().getInitParameter("encodeRedirects"); + encodeRedirects = (new Boolean(value)).booleanValue(); + } catch (Throwable t) { + ; + } // Sanity check on the specified buffer sizes if (input < 256) @@ -627,12 +639,12 @@ /** - * Handle a partial PUT. New content specified in request is appended to - * existing content in oldRevisionContent (if present). This code does + * Handle a partial PUT. New content specified in request is appended to + * existing content in oldRevisionContent (if present). This code does * not support simultaneous partial updates to the same resource. */ - protected File executePartialPut(HttpServletRequest req, Range range, - String path) + protected File executePartialPut(HttpServletRequest req, Range range, + String path) throws IOException { // Append data specified in ranges to existing content for this @@ -648,7 +660,7 @@ contentFile.deleteOnExit(); } - RandomAccessFile randAccessContentFile = + RandomAccessFile randAccessContentFile = new RandomAccessFile(contentFile, "rw"); Resource oldResource = null; @@ -661,8 +673,8 @@ // Copy data in oldRevisionContent to contentFile if (oldResource != null) { - BufferedInputStream bufOldRevStream = - new BufferedInputStream(oldResource.streamContent(), + BufferedInputStream bufOldRevStream = + new BufferedInputStream(oldResource.streamContent(), BUFFER_SIZE); int numBytesRead; @@ -763,9 +775,9 @@ ResourceInfo resourceInfo) throws IOException { - return checkIfMatch(request, response, resourceInfo) - && checkIfModifiedSince(request, response, resourceInfo) - && checkIfNoneMatch(request, response, resourceInfo) + return checkIfMatch(request, response, resourceInfo) + && checkIfModifiedSince(request, response, resourceInfo) + && checkIfNoneMatch(request, response, resourceInfo) && checkIfUnmodifiedSince(request, response, resourceInfo); } @@ -784,7 +796,7 @@ } else if (resourceInfo.weakETag != null) { return resourceInfo.weakETag; } else { - return "W/\"" + resourceInfo.length + "-" + return "W/\"" + resourceInfo.length + "-" + resourceInfo.date + "\""; } } @@ -921,7 +933,7 @@ ResourceInfo resourceInfo = new ResourceInfo(path, resources); if (!resourceInfo.exists) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, + response.sendError(HttpServletResponse.SC_NOT_FOUND, request.getRequestURI()); return; } @@ -930,7 +942,7 @@ // ends with "/" or "\", return NOT FOUND if (!resourceInfo.collection) { if (path.endsWith("/") || (path.endsWith("\\"))) { - response.sendError(HttpServletResponse.SC_NOT_FOUND, + response.sendError(HttpServletResponse.SC_NOT_FOUND, request.getRequestURI()); return; } @@ -949,6 +961,9 @@ if (!(redirectPath.endsWith("/"))) redirectPath = redirectPath + "/"; redirectPath = appendParameters(request, redirectPath); + if (encodeRedirects) { + redirectPath = response.encodeRedirectURL(redirectPath); + } response.sendRedirect(redirectPath); return; } @@ -961,6 +976,9 @@ redirectPath = contextPath + redirectPath; } redirectPath = appendParameters(request, redirectPath); + if (encodeRedirects) { + redirectPath = response.encodeRedirectURL(redirectPath); + } response.sendRedirect(redirectPath); return; } @@ -970,7 +988,7 @@ // Checking If headers boolean included = (request.getAttribute(Globals.CONTEXT_PATH_ATTR) != null); - if (!included + if (!included && !checkIfHeaders(request, response, resourceInfo)) { return; } @@ -1183,7 +1201,7 @@ try { range.start = Long.parseLong(rangeHeader.substring(0, dashPos)); - range.end = + range.end = Long.parseLong(rangeHeader.substring(dashPos + 1, slashPos)); range.length = Long.parseLong (rangeHeader.substring(slashPos + 1, rangeHeader.length())); @@ -1300,7 +1318,7 @@ currentRange.start = fileLength + offset; currentRange.end = fileLength - 1; } catch (NumberFormatException e) { - response.addHeader("Content-Range", + response.addHeader("Content-Range", "bytes */" + fileLength); response.sendError (HttpServletResponse @@ -1320,7 +1338,7 @@ else currentRange.end = fileLength - 1; } catch (NumberFormatException e) { - response.addHeader("Content-Range", + response.addHeader("Content-Range", "bytes */" + fileLength); response.sendError (HttpServletResponse @@ -1555,7 +1573,7 @@ * @param response The servlet response we are creating * @param resourceInfo File object * @return boolean true if the resource meets the specified condition, - * and false if the condition is not satisfied, in which case request + * and false if the condition is not satisfied, in which case request * processing is stopped */ private boolean checkIfMatch(HttpServletRequest request, @@ -1600,7 +1618,7 @@ * @param response The servlet response we are creating * @param resourceInfo File object * @return boolean true if the resource meets the specified condition, - * and false if the condition is not satisfied, in which case request + * and false if the condition is not satisfied, in which case request * processing is stopped */ private boolean checkIfModifiedSince(HttpServletRequest request, @@ -1611,10 +1629,10 @@ long headerValue = request.getDateHeader("If-Modified-Since"); long lastModified = resourceInfo.date; if (headerValue != -1) { - + // If an If-None-Match header has been specified, if modified since // is ignored. - if ((request.getHeader("If-None-Match") == null) + if ((request.getHeader("If-None-Match") == null) && (lastModified <= headerValue + 1000)) { // The entity has not been modified since the date // specified by the client. This is not an error case. @@ -1637,7 +1655,7 @@ * @param response The servlet response we are creating * @param resourceInfo File object * @return boolean true if the resource meets the specified condition, - * and false if the condition is not satisfied, in which case request + * and false if the condition is not satisfied, in which case request * processing is stopped */ private boolean checkIfNoneMatch(HttpServletRequest request, @@ -1653,7 +1671,7 @@ if (!headerValue.equals("*")) { - StringTokenizer commaTokenizer = + StringTokenizer commaTokenizer = new StringTokenizer(headerValue, ","); while (!conditionSatisfied && commaTokenizer.hasMoreTokens()) { @@ -1695,7 +1713,7 @@ * @param response The servlet response we are creating * @param resourceInfo File object * @return boolean true if the resource meets the specified condition, - * and false if the condition is not satisfied, in which case request + * and false if the condition is not satisfied, in which case request * processing is stopped */ private boolean checkIfUnmodifiedSince(HttpServletRequest request,
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]