httpd-bugs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bugzi...@apache.org
Subject DO NOT REPLY [Bug 27578] New: - made getlastmodified a writable property
Date Wed, 10 Mar 2004 18:18:33 GMT
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=27578>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=27578

made getlastmodified a writable property

           Summary: made getlastmodified a writable property
           Product: Apache httpd-2.0
           Version: 2.0.48
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: mod_dav
        AssignedTo: bugs@httpd.apache.org
        ReportedBy: ojd@aspectgroup.co.uk


we have a load-balanced array of apache web servers and are trying to 
syncronise content between them using webdav. to make the content optimally 
cacheable we have switched off using the inode number in the etag and have to 
have the Last-Modified date the same across all the servers so the If-Modified-
Since request header works as it hopes to.

Oli


diff -u repos.c.orig repos.c
--- repos.c.orig        2004-03-10 17:32:57.000000000 +0000
+++ repos.c     2004-03-10 12:35:14.000000000 +0000
@@ -60,6 +60,7 @@
 #include "apr_file_io.h"
 #include "apr_strings.h"
 #include "apr_buckets.h"
+#include "apr_date.h"
 
 #if APR_HAVE_STDIO_H
 #include <stdio.h>              /* for sprintf() */
@@ -1940,10 +1959,32 @@
         return 1;
 #endif
 
+    if (propid == DAV_PROPID_getlastmodified )
+        return 1;
+
     (void) dav_get_liveprop_info(propid, &dav_fs_liveprop_group, &info);
     return info->is_writable;
 }
 
+struct dav_fs_context
+{
+    int propid;
+    union rollback
+    {
+        apr_time_t modtime;
+        apr_fileperms_t perms;
+    } oldvalue;
+    union context
+    {
+        apr_time_t modtime;
+        int perms;
+    } value;
+};
+
+apr_time_t xapr_date_parse_http(char*s)
+{
+return 12345000000000LL + (int)s;
+}
 static dav_error *dav_fs_patch_validate(const dav_resource *resource,
                                         const apr_xml_elem *elem,
                                         int operation,
@@ -1954,7 +1995,34 @@
     const apr_text *f_cdata;
     char value;
     dav_elem_private *priv = elem->priv;
+    struct dav_fs_context *fscontext;
+
+    fscontext = apr_pcalloc(resource->info->pool, sizeof(*fscontext) );
+    fscontext->propid = priv->propid;
+
+    if ( priv->propid == DAV_PROPID_getlastmodified ) {
+        if (operation == DAV_PROP_OP_DELETE)
+            return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0,
+                             "The 'lastmodified' property cannot be removed.");
+        if ( elem->first_cdata.first )
+            cdata = elem->first_cdata.first;
+        else if ( elem->first_child )
+            cdata = elem->first_child->following_cdata.first;
+        else
+            cdata = NULL;
 
+       if ( cdata == NULL )
+            return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0,
+                             "The 'lastmodified' property cannot be found.");
+        fscontext->value.modtime = apr_date_parse_http(cdata->text);
+        short ttt = apr_date_parse_http(cdata->text);
+        if ( fscontext->value.modtime == 0 ) {
+            return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0,
+                             "The 'lastmodified' property cannot be parsed.");
+        }
+        *context = (void*)fscontext;
+       return NULL;
+    }
     if (priv->propid != DAV_PROPID_FS_executable) {
         *defer_to_dead = 1;
         return NULL;
@@ -1997,8 +2065,8 @@
                              "submitted is invalid.");
     }
 
-    *context = (void *)(value == 'T');
-
+    fscontext->value.perms = (value == 'T');
+    *context = (void*)fscontext;
     return NULL;
 
   too_long:
@@ -2009,37 +2077,49 @@
 
 }
 
+
 static dav_error *dav_fs_patch_exec(const dav_resource *resource,
                                     const apr_xml_elem *elem,
                                     int operation,
                                     void *context,
                                     dav_liveprop_rollback **rollback_ctx)
 {
-    int value = context != NULL;
-    apr_fileperms_t perms = resource->info->finfo.protection;
-    int old_value = (perms & APR_UEXECUTE) != 0;
-
-    /* assert: prop == executable. operation == SET. */
-
-    /* don't do anything if there is no change. no rollback info either. */
-    /* DBG2("new value=%d  (old=%d)", value, old_value); */
-    if (value == old_value)
-        return NULL;
-
-    perms &= ~APR_UEXECUTE;
-    if (value)
-        perms |= APR_UEXECUTE;
-
-    if (apr_file_perms_set(resource->info->pathname, perms) != APR_SUCCESS) {
-        return dav_new_error(resource->info->pool,
+    struct dav_fs_context *fscontext;
+    
+    fscontext = (struct dav_fs_context*)context;
+    if ( fscontext->propid == DAV_PROPID_getlastmodified ) {
+        fscontext->oldvalue.modtime = resource->info->finfo.mtime;
+        if ( apr_file_mtime_set(resource->info->pathname, fscontext-
>value.modtime, resource->info->pool) != APR_SUCCESS )
+            return dav_new_error(resource->info->pool,
+                             HTTP_INTERNAL_SERVER_ERROR, 0,
+                             "Could not set the lastmodified date of the "
+                             "target resource.");
+        resource->info->finfo.mtime = fscontext->value.modtime;
+    } else if (fscontext->propid == DAV_PROPID_FS_executable ) {
+        apr_fileperms_t perms = resource->info->finfo.protection;
+        fscontext->oldvalue.perms = perms;
+
+        /* assert: prop == executable. operation == SET. */
+
+        /* don't do anything if there is no change. no rollback info either. */
+        /* DBG2("new value=%d  (old=%d)", value, old_value); */
+
+        perms &= ~APR_UEXECUTE;
+        if (fscontext->value.perms != 0 )
+            perms |= APR_UEXECUTE;
+
+        if ( perms != fscontext->oldvalue.perms )
+            if (apr_file_perms_set(resource->info->pathname, perms) != 
APR_SUCCESS) {
+            return dav_new_error(resource->info->pool,
                              HTTP_INTERNAL_SERVER_ERROR, 0,
                              "Could not set the executable flag of the "
                              "target resource.");
-    }
+            }
 
-    /* update the resource and set up the rollback context */
-    resource->info->finfo.protection = perms;
-    *rollback_ctx = (dav_liveprop_rollback *)old_value;
+        /* update the resource and set up the rollback context */
+        resource->info->finfo.protection = perms;
+    }
+    *rollback_ctx = (dav_liveprop_rollback *)fscontext;
 
     return NULL;
 }
@@ -2057,8 +2137,17 @@
                                         void *context,
                                         dav_liveprop_rollback *rollback_ctx)
 {
+    struct dav_fs_context *rollback = (struct dav_fs_context*)rollback_ctx;
+    if ( rollback->propid == DAV_PROPID_getlastmodified ) {
+        if ( apr_file_mtime_set(resource->info->pathname, rollback-
>oldvalue.modtime, resource->info->pool) != APR_SUCCESS )
+            return dav_new_error(resource->info->pool,
+                             HTTP_INTERNAL_SERVER_ERROR, 0,
+                             "Could not set the lastmodified date of the "
+                             "target resource.");
+        return NULL;
+    }
     apr_fileperms_t perms = resource->info->finfo.protection & ~APR_UEXECUTE;
-    int value = rollback_ctx != NULL;
+    int value = (rollback->oldvalue.perms & APR_UEXECUTE) != 0;
 
     /* assert: prop == executable. operation == SET. */

---------------------------------------------------------------------
To unsubscribe, e-mail: bugs-unsubscribe@httpd.apache.org
For additional commands, e-mail: bugs-help@httpd.apache.org


Mime
View raw message