You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2008/09/29 15:24:37 UTC

svn commit: r700125 - in /tomcat/trunk/java/org/apache: catalina/servlets/DefaultServlet.java catalina/servlets/WebdavServlet.java naming/resources/ResourceAttributes.java

Author: markt
Date: Mon Sep 29 06:24:36 2008
New Revision: 700125

URL: http://svn.apache.org/viewvc?rev=700125&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45906
Improve ResourceAttributes ETag handling.
Patch provided by Chris Hubick

Modified:
    tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
    tomcat/trunk/java/org/apache/catalina/servlets/WebdavServlet.java
    tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java

Modified: tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java?rev=700125&r1=700124&r2=700125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/servlets/DefaultServlet.java Mon Sep 29 06:24:36 2008
@@ -578,24 +578,6 @@
 
 
     /**
-     * Get the ETag associated with a file.
-     *
-     * @param resourceAttributes The resource information
-     */
-    protected String getETag(ResourceAttributes resourceAttributes) {
-        String result = null;
-        if ((result = resourceAttributes.getETag(true)) != null) {
-            return result;
-        } else if ((result = resourceAttributes.getETag()) != null) {
-            return result;
-        } else {
-            return "W/\"" + resourceAttributes.getContentLength() + "-"
-                + resourceAttributes.getLastModified() + "\"";
-        }
-    }
-
-
-    /**
      * URL rewriter.
      *
      * @param path Path which has to be rewiten
@@ -733,7 +715,7 @@
             ranges = parseRange(request, response, cacheEntry.attributes);
 
             // ETag header
-            response.setHeader("ETag", getETag(cacheEntry.attributes));
+            response.setHeader("ETag", cacheEntry.attributes.getETag());
 
             // Last-Modified header
             response.setHeader("Last-Modified",
@@ -978,7 +960,7 @@
                 // Ignore
             }
 
-            String eTag = getETag(resourceAttributes);
+            String eTag = resourceAttributes.getETag();
             long lastModified = resourceAttributes.getLastModified();
 
             if (headerValueTime == (-1L)) {
@@ -1532,7 +1514,7 @@
                                  ResourceAttributes resourceAttributes)
         throws IOException {
 
-        String eTag = getETag(resourceAttributes);
+        String eTag = resourceAttributes.getETag();
         String headerValue = request.getHeader("If-Match");
         if (headerValue != null) {
             if (headerValue.indexOf('*') == -1) {
@@ -1588,7 +1570,7 @@
                     // The entity has not been modified since the date
                     // specified by the client. This is not an error case.
                     response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-                    response.setHeader("ETag", getETag(resourceAttributes));
+                    response.setHeader("ETag", resourceAttributes.getETag());
 
                     return false;
                 }
@@ -1616,7 +1598,7 @@
                                      ResourceAttributes resourceAttributes)
         throws IOException {
 
-        String eTag = getETag(resourceAttributes);
+        String eTag = resourceAttributes.getETag();
         String headerValue = request.getHeader("If-None-Match");
         if (headerValue != null) {
 
@@ -1646,7 +1628,7 @@
                 if ( ("GET".equals(request.getMethod()))
                      || ("HEAD".equals(request.getMethod())) ) {
                     response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
-                    response.setHeader("ETag", getETag(resourceAttributes));
+                    response.setHeader("ETag", eTag);
 
                     return false;
                 } else {

Modified: tomcat/trunk/java/org/apache/catalina/servlets/WebdavServlet.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/servlets/WebdavServlet.java?rev=700125&r1=700124&r2=700125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/servlets/WebdavServlet.java (original)
+++ tomcat/trunk/java/org/apache/catalina/servlets/WebdavServlet.java Mon Sep 29 06:24:36 2008
@@ -2132,7 +2132,7 @@
                                                contentType);
                 }
                 generatedXML.writeProperty(null, "getetag",
-                                           getETag(cacheEntry.attributes));
+                                           cacheEntry.attributes.getETag());
                 generatedXML.writeElement(null, "resourcetype",
                                           XMLWriter.NO_CONTENT);
             } else {
@@ -2258,7 +2258,7 @@
                         propertiesNotFound.addElement(property);
                     } else {
                         generatedXML.writeProperty
-                            (null, "getetag", getETag(cacheEntry.attributes));
+                            (null, "getetag", cacheEntry.attributes.getETag());
                     }
                 } else if (property.equals("getlastmodified")) {
                     if (cacheEntry.context != null) {

Modified: tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java?rev=700125&r1=700124&r2=700125&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java (original)
+++ tomcat/trunk/java/org/apache/naming/resources/ResourceAttributes.java Mon Sep 29 06:24:36 2008
@@ -123,6 +123,12 @@
     
     
     /**
+     * ETag.
+     */
+    public static final String ALTERNATE_ETAG = "etag";
+    
+    
+    /**
      * Collection type.
      */
     public static final String COLLECTION_TYPE = "<collection/>";
@@ -704,20 +710,9 @@
     /**
      * Get ETag.
      * 
-     * @return Weak ETag
+     * @return strong ETag if available, else weak ETag.
      */
     public String getETag() {
-        return getETag(false);
-    }
-
-
-    /**
-     * Get ETag.
-     * 
-     * @param strong If true, the strong ETag will be returned
-     * @return ETag
-     */
-    public String getETag(boolean strong) {
         String result = null;
         if (attributes != null) {
             Attribute attribute = attributes.get(ETAG);
@@ -729,16 +724,22 @@
                 }
             }
         }
-        if (strong) {
-            // The strong ETag must always be calculated by the resources
-            result = strongETag;
-        } else {
-            // The weakETag is contentLenght + lastModified
-            if (weakETag == null) {
-                weakETag = "W/\"" + getContentLength() + "-" 
-                    + getLastModified() + "\"";
+        if (result == null) {
+            if (strongETag != null) {
+                // The strong ETag must always be calculated by the resources
+                result = strongETag;
+            } else {
+                // The weakETag is contentLength + lastModified
+                if (weakETag == null) {
+                    long contentLength = getContentLength();
+                    long lastModified = getLastModified();
+                    if ((contentLength >= 0) || (lastModified >= 0)) {
+                        weakETag = "W/\"" + contentLength + "-" 
+                        + lastModified + "\"";
+                    }
+                }
+                result = weakETag;
             }
-            result = weakETag;
         }
         return result;
     }
@@ -810,6 +811,14 @@
               long contentLength = getContentLength();
               if (contentLength < 0) return null;
               return new BasicAttribute(ALTERNATE_CONTENT_LENGTH, new Long(contentLength));
+            } else if (attrID.equals(ETAG)) {
+              String etag = getETag();
+              if (etag == null) return null;
+              return new BasicAttribute(ETAG, etag);
+            } else if (attrID.equals(ALTERNATE_ETAG)) {
+              String etag = getETag();
+              if (etag == null) return null;
+              return new BasicAttribute(ALTERNATE_ETAG, etag);
             }
         } else {
             return attributes.get(attrID);
@@ -893,6 +902,11 @@
                 attributes.addElement(new BasicAttribute(CONTENT_LENGTH, contentLengthLong));
                 attributes.addElement(new BasicAttribute(ALTERNATE_CONTENT_LENGTH, contentLengthLong));
             }
+            String etag = getETag();
+            if (etag != null) {
+                attributes.addElement(new BasicAttribute(ETAG, etag));
+                attributes.addElement(new BasicAttribute(ALTERNATE_ETAG, etag));
+            }
             return new RecyclableNamingEnumeration(attributes);
         } else {
             return attributes.getAll();
@@ -929,6 +943,11 @@
                 attributeIDs.addElement(CONTENT_LENGTH);
                 attributeIDs.addElement(ALTERNATE_CONTENT_LENGTH);
             }
+            String etag = getETag();
+            if (etag != null) {
+                attributeIDs.addElement(ETAG);
+                attributeIDs.addElement(ALTERNATE_ETAG);
+            }
             return new RecyclableNamingEnumeration(attributeIDs);
         } else {
             return attributes.getIDs();
@@ -947,6 +966,7 @@
             if (getName() != null) size++;
             if (getResourceType() != null) size += 2;
             if (getContentLength() >= 0) size += 2;
+            if (getETag() != null) size += 2;
             return size;
         } else {
             return attributes.size();



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