Author: markt
Date: Mon Oct 27 04:50:44 2008
New Revision: 708151

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

Modified:
    tomcat/tc6.0.x/trunk/STATUS.txt
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/WebdavServlet.java
    
tomcat/tc6.0.x/trunk/java/org/apache/naming/resources/ResourceAttributes.java
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=708151&r1=708150&r2=708151&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Mon Oct 27 04:50:44 2008
@@ -166,14 +166,6 @@
         }
         StringBuffer sb = new StringBuffer();
 
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=45906
-  Improve ETag handling in ResourceAttributes
-  Patch provided by Chris Hubick
-  http://svn.apache.org/viewvc?rev=700125&view=rev
-  Note: Deleted getETag(boolean) method to remain but deprecated
-  +1: markt, remm (I was -1 originally, but it may not be so bad),fhanik
-  -1: 
-
 * Fix some thread safety issues.
   Deprecate (rather than delete) any deleted code that isn't already deprecated
   http://svn.apache.org/viewvc?rev=699714&view=rev (previous patch)

Modified: 
tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/DefaultServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/DefaultServlet.java?rev=708151&r1=708150&r2=708151&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/DefaultServlet.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/DefaultServlet.java 
Mon Oct 27 04:50:44 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",
@@ -979,7 +961,7 @@
                 ;
             }
 
-            String eTag = getETag(resourceAttributes);
+            String eTag = resourceAttributes.getETag();
             long lastModified = resourceAttributes.getLastModified();
 
             if (headerValueTime == (-1L)) {
@@ -1531,7 +1513,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) {
@@ -1587,7 +1569,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;
                 }
@@ -1615,7 +1597,7 @@
                                      ResourceAttributes resourceAttributes)
         throws IOException {
 
-        String eTag = getETag(resourceAttributes);
+        String eTag = resourceAttributes.getETag();
         String headerValue = request.getHeader("If-None-Match");
         if (headerValue != null) {
 
@@ -1645,7 +1627,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/tc6.0.x/trunk/java/org/apache/catalina/servlets/WebdavServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/WebdavServlet.java?rev=708151&r1=708150&r2=708151&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/WebdavServlet.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/WebdavServlet.java 
Mon Oct 27 04:50:44 2008
@@ -2131,7 +2131,7 @@
                                                contentType);
                 }
                 generatedXML.writeProperty(null, "getetag",
-                                           getETag(cacheEntry.attributes));
+                                           cacheEntry.attributes.getETag());
                 generatedXML.writeElement(null, "resourcetype",
                                           XMLWriter.NO_CONTENT);
             } else {
@@ -2257,7 +2257,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/tc6.0.x/trunk/java/org/apache/naming/resources/ResourceAttributes.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/naming/resources/ResourceAttributes.java?rev=708151&r1=708150&r2=708151&view=diff
==============================================================================
--- 
tomcat/tc6.0.x/trunk/java/org/apache/naming/resources/ResourceAttributes.java 
(original)
+++ 
tomcat/tc6.0.x/trunk/java/org/apache/naming/resources/ResourceAttributes.java 
Mon Oct 27 04:50:44 2008
@@ -123,6 +123,12 @@
     
     
     /**
+     * ETag.
+     */
+    public static final String ALTERNATE_ETAG = "etag";
+    
+    
+    /**
      * Collection type.
      */
     public static final String COLLECTION_TYPE = "<collection/>";
@@ -704,43 +710,50 @@
     /**
      * Get ETag.
      * 
-     * @return Weak ETag
+     * @return strong ETag if available, else weak ETag. 
      */
     public String getETag() {
-        return getETag(false);
+        String result = null;
+        if (attributes != null) {
+            Attribute attribute = attributes.get(ETAG);
+            if (attribute != null) {
+                try {
+                    result = attribute.get().toString();
+                } catch (NamingException e) {
+                    ; // No value for the attribute
+                }
+            }
+        }
+        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;
+            }
+        } 
+        return result;
     }
 
 
     /**
      * Get ETag.
      * 
-     * @param strong If true, the strong ETag will be returned
-     * @return ETag
+     * @param strong Ignored
+     * @return strong ETag if available, else weak ETag.
+     * @deprecated
      */
     public String getETag(boolean strong) {
-        if (strong) {
-            // The strong ETag must always be calculated by the resources
-            if (strongETag != null)
-                return strongETag;
-            if (attributes != null) {
-                Attribute attribute = attributes.get(ETAG);
-                if (attribute != null) {
-                    try {
-                        strongETag = attribute.get().toString();
-                    } catch (NamingException e) {
-                        ; // No value for the attribute
-                    }
-                }
-            }
-            return strongETag;
-        } else {
-            // The weakETag is contentLenght + lastModified
-            if (weakETag == null) {
-                weakETag = "W/\"" + getContentLength() + "-" 
-                    + getLastModified() + "\"";
-            }
-            return weakETag;
-        }
+        return getETag();
     }
 
 
@@ -807,9 +820,17 @@
                 if (contentLength < 0) return null;
                 return new BasicAttribute(CONTENT_LENGTH, new 
Long(contentLength));
             } else if (attrID.equals(ALTERNATE_CONTENT_LENGTH)) {
-              long contentLength = getContentLength();
-              if (contentLength < 0) return null;
-              return new BasicAttribute(ALTERNATE_CONTENT_LENGTH, new 
Long(contentLength));
+                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 +914,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 +955,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 +978,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();

Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=708151&r1=708150&r2=708151&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Mon Oct 27 04:50:44 2008
@@ -93,6 +93,10 @@
         <bug>45823</bug>: Log missing request headers as '-' not 'null'. Based
         on a patch by Per Landberg. (markt)
       </fix>
+      <fix>
+        <bug>45906</bug>: Further ETag handling improvements. Patch provided by
+        Chris Hubick. (markt)
+      </fix>
       <add>
         Add the CombinedRealm that enables authentication to be attempted
         against multiple realms. (markt) 



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

Reply via email to