funkman 2004/09/18 18:20:10 Modified: catalina/src/share/org/apache/catalina/servlets DefaultServlet.java WebdavServlet.java Log: md5Helper, md5Encoder, and normalize are used by WebdavServlet, not DefaultServelt so move them into WebdavServlet. Remove unused method appendParameters Revision Changes Path 1.28 +16 -120 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/DefaultServlet.java Index: DefaultServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/DefaultServlet.java,v retrieving revision 1.27 retrieving revision 1.28 diff -u -r1.27 -r1.28 --- DefaultServlet.java 29 Aug 2004 16:46:12 -0000 1.27 +++ DefaultServlet.java 19 Sep 2004 01:20:10 -0000 1.28 @@ -1,12 +1,12 @@ /* * 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. @@ -32,8 +32,6 @@ import java.io.Reader; import java.io.StringReader; import java.io.StringWriter; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; import java.util.Enumeration; import java.util.StringTokenizer; import java.util.Vector; @@ -56,7 +54,6 @@ import javax.xml.transform.stream.StreamSource; import org.apache.catalina.Globals; -import org.apache.catalina.util.MD5Encoder; import org.apache.catalina.util.ServerInfo; import org.apache.catalina.util.StringManager; import org.apache.catalina.util.URLEncoder; @@ -113,18 +110,6 @@ /** - * MD5 message digest provider. - */ - protected static MessageDigest md5Helper; - - - /** - * The MD5 helper object for this class. - */ - protected static final MD5Encoder md5Encoder = new MD5Encoder(); - - - /** * Array containing the safe characters set. */ protected static URLEncoder urlEncoder; @@ -259,13 +244,6 @@ ", output buffer size=" + output); } - // Load the MD5 helper used to calculate signatures. - try { - md5Helper = MessageDigest.getInstance("MD5"); - } catch (NoSuchAlgorithmException e) { - throw new UnavailableException("No MD5"); - } - // Load the proxy dir context. try { resources = (ProxyDirContext) getServletContext() @@ -288,7 +266,7 @@ if (resources == null) { throw new UnavailableException("No resources"); } - + } @@ -345,7 +323,7 @@ serveResource(request, response, true); } catch( IOException ex ) { // we probably have this check somewhere else too. - if( ex.getMessage() != null + if( ex.getMessage() != null && ex.getMessage().indexOf("Broken pipe") >= 0 ) { // ignore it. } @@ -619,71 +597,6 @@ /** - * Return a context-relative path, beginning with a "/", that represents - * the canonical version of the specified path after ".." and "." elements - * are resolved out. If the specified path attempts to go outside the - * boundaries of the current context (i.e. too many ".." path elements - * are present), return <code>null</code> instead. - * - * @param path Path to be normalized - */ - protected String normalize(String path) { - - if (path == null) - return null; - - // Create a place for the normalized path - String normalized = path; - - if (normalized == null) - return (null); - - if (normalized.equals("/.")) - return "/"; - - // Normalize the slashes and add leading slash if necessary - if (normalized.indexOf('\\') >= 0) - normalized = normalized.replace('\\', '/'); - if (!normalized.startsWith("/")) - normalized = "/" + normalized; - - // Resolve occurrences of "//" in the normalized path - while (true) { - int index = normalized.indexOf("//"); - if (index < 0) - break; - normalized = normalized.substring(0, index) + - normalized.substring(index + 1); - } - - // Resolve occurrences of "/./" in the normalized path - while (true) { - int index = normalized.indexOf("/./"); - if (index < 0) - break; - normalized = normalized.substring(0, index) + - normalized.substring(index + 2); - } - - // Resolve occurrences of "/../" in the normalized path - while (true) { - int index = normalized.indexOf("/../"); - if (index < 0) - break; - if (index == 0) - return (null); // Trying to go outside our context - int index2 = normalized.lastIndexOf('/', index - 1); - normalized = normalized.substring(0, index2) + - normalized.substring(index + 3); - } - - // Return the normalized path that we have completed - return (normalized); - - } - - - /** * URL rewriter. * * @param path Path which has to be rewiten @@ -798,17 +711,17 @@ response.setHeader("ETag", getETag(cacheEntry.attributes)); // Last-Modified header - response.setHeader("Last-Modified", + response.setHeader("Last-Modified", cacheEntry.attributes.getLastModifiedHttp()); // Get content length contentLength = cacheEntry.attributes.getContentLength(); - // Special case for zero length files, which would cause a + // Special case for zero length files, which would cause a // (silent) ISE when setting the output buffer size if (contentLength == 0L) { content = false; } - + } ServletOutputStream ostream = null; @@ -856,7 +769,7 @@ if (content) { // Serve the directory browser - renderResult = + renderResult = render(request.getContextPath(), cacheEntry); } @@ -1141,23 +1054,6 @@ } - /** - * Append the request parameters to the redirection string before calling - * sendRedirect. - */ - protected String appendParameters(HttpServletRequest request, - String redirectPath) { - - StringBuffer result = new StringBuffer(rewriteUrl(redirectPath)); - - String query = request.getQueryString (); - if (query != null) - result.append ("?").append (query); - - return result.toString(); - - } - /** * Decide which way to render. HTML or XML. @@ -1497,7 +1393,7 @@ * Return the xsl template inputstream (if possible) */ protected InputStream findXsltInputStream(DirContext directory) { - + if (localXsltFile!=null) { try { Object obj = directory.lookup(localXsltFile); @@ -1544,7 +1440,7 @@ } - + // -------------------------------------------------------- Private Methods @@ -1726,17 +1622,17 @@ * output stream, and ensure that both streams are closed before returning * (even in the face of an exception). * - * @param resourceInfo The resource information + * @param resourceInfo The resource information * @param ostream The output stream to write to * * @exception IOException if an input/output error occurs */ - private void copy(CacheEntry cacheEntry, InputStream is, + private void copy(CacheEntry cacheEntry, InputStream is, ServletOutputStream ostream) throws IOException { IOException exception = null; - InputStream resourceInputStream = null; + InputStream resourceInputStream = null; // Optimization: If the binary content has already been loaded, send // it directly @@ -1901,7 +1797,7 @@ while ( (exception == null) && (ranges.hasMoreElements()) ) { InputStream resourceInputStream = cacheEntry.resource.streamContent(); - InputStream istream = + InputStream istream = new BufferedInputStream(resourceInputStream, input); Range currentRange = (Range) ranges.nextElement(); 1.19 +111 -21 jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/WebdavServlet.java Index: WebdavServlet.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-catalina/catalina/src/share/org/apache/catalina/servlets/WebdavServlet.java,v retrieving revision 1.18 retrieving revision 1.19 diff -u -r1.18 -r1.19 --- WebdavServlet.java 16 Sep 2004 23:19:54 -0000 1.18 +++ WebdavServlet.java 19 Sep 2004 01:20:10 -0000 1.19 @@ -1,12 +1,12 @@ /* * 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. @@ -21,6 +21,8 @@ import java.io.IOException; import java.io.StringWriter; import java.io.Writer; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; @@ -34,6 +36,7 @@ import javax.naming.NamingException; import javax.naming.directory.DirContext; import javax.servlet.ServletException; +import javax.servlet.UnavailableException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.DocumentBuilder; @@ -41,6 +44,7 @@ import javax.xml.parsers.ParserConfigurationException; import org.apache.catalina.util.DOMWriter; +import org.apache.catalina.util.MD5Encoder; import org.apache.catalina.util.RequestUtil; import org.apache.catalina.util.XMLWriter; import org.apache.naming.resources.CacheEntry; @@ -55,6 +59,7 @@ import org.xml.sax.SAXException; + /** * Servlet which adds support for WebDAV level 2. All the basic HTTP requests * are handled by the DefaultServlet. @@ -68,7 +73,7 @@ // -------------------------------------------------------------- Constants - + private static final String METHOD_HEAD = "HEAD"; private static final String METHOD_PROPFIND = "PROPFIND"; @@ -141,6 +146,19 @@ new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + /** + * MD5 message digest provider. + */ + protected static MessageDigest md5Helper; + + + /** + * The MD5 helper object for this class. + */ + protected static final MD5Encoder md5Encoder = new MD5Encoder(); + + + static { creationDateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); } @@ -204,6 +222,14 @@ ; } + + // Load the MD5 helper used to calculate signatures. + try { + md5Helper = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new UnavailableException("No MD5"); + } + } @@ -301,7 +327,7 @@ throws ServletException, IOException { resp.addHeader("DAV", "1,2"); - + StringBuffer methodsAllowed = determineMethodsAllowed(resources, req); @@ -321,7 +347,7 @@ // Get allowed methods StringBuffer methodsAllowed = determineMethodsAllowed(resources, req); - + resp.addHeader("Allow", methodsAllowed.toString()); resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); return; @@ -441,7 +467,7 @@ resp.setStatus(WebdavStatus.SC_MULTI_STATUS); resp.setContentType("text/xml; charset=UTF-8"); // Create multistatus object - XMLWriter generatedXML = + XMLWriter generatedXML = new XMLWriter(resp.getWriter()); generatedXML.writeXMLHeader(); generatedXML.writeElement @@ -525,7 +551,7 @@ // collection String lockPath = currentPath; if (lockPath.endsWith("/")) - lockPath = + lockPath = lockPath.substring(0, lockPath.length() - 1); Vector currentLockNullResources = (Vector) lockNullResources.get(lockPath); @@ -622,7 +648,7 @@ // Get allowed methods StringBuffer methodsAllowed = determineMethodsAllowed(resources, req); - + resp.addHeader("Allow", methodsAllowed.toString()); resp.sendError(WebdavStatus.SC_METHOD_NOT_ALLOWED); @@ -634,7 +660,7 @@ try { Document document = documentBuilder.parse (new InputSource(req.getInputStream())); - // TODO : Process this request body + // TODO : Process this request body resp.sendError(WebdavStatus.SC_NOT_IMPLEMENTED); return; @@ -798,7 +824,7 @@ // If multiple timeouts, just use the first if (commaPos != -1) { lockDurationStr = lockDurationStr.substring(0,commaPos); - } + } if (lockDurationStr.startsWith("Second-")) { lockDuration = (new Integer(lockDurationStr.substring(7))).intValue(); @@ -1309,6 +1335,70 @@ } + /** + * Return a context-relative path, beginning with a "/", that represents + * the canonical version of the specified path after ".." and "." elements + * are resolved out. If the specified path attempts to go outside the + * boundaries of the current context (i.e. too many ".." path elements + * are present), return <code>null</code> instead. + * + * @param path Path to be normalized + */ + protected String normalize(String path) { + + if (path == null) + return null; + + // Create a place for the normalized path + String normalized = path; + + if (normalized == null) + return (null); + + if (normalized.equals("/.")) + return "/"; + + // Normalize the slashes and add leading slash if necessary + if (normalized.indexOf('\\') >= 0) + normalized = normalized.replace('\\', '/'); + if (!normalized.startsWith("/")) + normalized = "/" + normalized; + + // Resolve occurrences of "//" in the normalized path + while (true) { + int index = normalized.indexOf("//"); + if (index < 0) + break; + normalized = normalized.substring(0, index) + + normalized.substring(index + 1); + } + + // Resolve occurrences of "/./" in the normalized path + while (true) { + int index = normalized.indexOf("/./"); + if (index < 0) + break; + normalized = normalized.substring(0, index) + + normalized.substring(index + 2); + } + + // Resolve occurrences of "/../" in the normalized path + while (true) { + int index = normalized.indexOf("/../"); + if (index < 0) + break; + if (index == 0) + return (null); // Trying to go outside our context + int index2 = normalized.lastIndexOf('/', index - 1); + normalized = normalized.substring(0, index2) + + normalized.substring(index + 3); + } + + // Return the normalized path that we have completed + return (normalized); + + } + // -------------------------------------------------------- Private Methods @@ -1457,7 +1547,7 @@ if (firstSeparator < 0) { destinationPath = "/"; } else { - destinationPath = + destinationPath = destinationPath.substring(firstSeparator); } } @@ -1776,7 +1866,7 @@ Enumeration enumeration = null; try { - enumeration = resources.list(path); + enumeration = resources.list(path); } catch (NamingException e) { errorList.put(path, new Integer (WebdavStatus.SC_INTERNAL_SERVER_ERROR)); @@ -1952,7 +2042,7 @@ (null, "getcontentlength", String.valueOf(cacheEntry.attributes.getContentLength())); String contentType = getServletContext().getMimeType - (cacheEntry.name); + (cacheEntry.name); if (contentType != null) { generatedXML.writeProperty(null, "getcontenttype", contentType); @@ -2495,11 +2585,11 @@ /** * Determines the methods normally allowed for the resource. - * + * */ private StringBuffer determineMethodsAllowed(DirContext resources, HttpServletRequest req) { - + StringBuffer methodsAllowed = new StringBuffer(); boolean exists = true; Object object = null; @@ -2518,15 +2608,15 @@ methodsAllowed.append("OPTIONS, GET, HEAD, POST, DELETE, TRACE"); methodsAllowed.append(", PROPPATCH, COPY, MOVE, LOCK, UNLOCK"); - + if (listings) { methodsAllowed.append(", PROPFIND"); } - + if (!(object instanceof DirContext)) { methodsAllowed.append(", PUT"); } - + return methodsAllowed; } @@ -2575,7 +2665,7 @@ result += "Scope:" + scope + "\n"; result += "Depth:" + depth + "\n"; result += "Owner:" + owner + "\n"; - result += "Expiration:" + result += "Expiration:" + FastHttpDateFormat.formatDate(expiresAt, null) + "\n"; Enumeration tokensList = tokens.elements(); while (tokensList.hasMoreElements()) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]