implement etag in pg propfind webdav

Mon, 09 May 2022 20:06:27 +0200

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Mon, 09 May 2022 20:06:27 +0200
branch
webdav
changeset 348
bdd31584141f
parent 347
b6d71e504294
child 349
7bf652914e9b

implement etag in pg propfind

src/server/plugins/postgresql/webdav.c file | annotate | diff | comparison | revisions
--- a/src/server/plugins/postgresql/webdav.c	Sun May 08 19:31:38 2022 +0200
+++ b/src/server/plugins/postgresql/webdav.c	Mon May 09 20:06:27 2022 +0200
@@ -32,6 +32,8 @@
 #include "../../util/util.h"
 #include "../../util/pblock.h"
 
+#include "../../daemon/http.h" // etag
+
 #include <ucx/buffer.h>
 #include <libxml/tree.h>
 
@@ -68,6 +70,7 @@
     r.lastmodified,\n\
     r.creationdate,\n\
     r.contentlength,\n\
+    r.etag,\n\
     p.prefix,\n\
     p.xmlns,\n\
     p.pname,\n\
@@ -90,6 +93,7 @@
     r.lastmodified,\n\
     r.creationdate,\n\
     r.contentlength,\n\
+    r.etag,\n\
     p.prefix,\n\
     p.xmlns,\n\
     p.pname,\n\
@@ -118,6 +122,7 @@
     r.lastmodified,\n\
     r.creationdate,\n\
     r.contentlength,\n\
+    r.etag,\n\
     p.prefix,\n\
     p.xmlns,\n\
     p.pname,\n\
@@ -144,6 +149,7 @@
     r.lastmodified,\n\
     r.creationdate,\n\
     r.contentlength,\n\
+    r.etag,\n\
     p.prefix,\n\
     p.xmlns,\n\
     p.pname,\n\
@@ -186,6 +192,7 @@
     r.lastmodified,\n\
     r.creationdate,\n\
     r.contentlength,\n\
+    r.etag,\n\
     p.prefix,\n\
     p.xmlns,\n\
     p.pname,\n\
@@ -225,6 +232,7 @@
     r.lastmodified,\n\
     r.creationdate,\n\
     r.contentlength,\n\
+    r.etag,\n\
     p.prefix,\n\
     p.xmlns,\n\
     p.pname,\n\
@@ -489,12 +497,13 @@
         //  5: lastmodified
         //  6: creationdate
         //  7: contentlength
-        //  8: property prefix
-        //  9: property xmlns
-        // 10: property name
-        // 11: property lang
-        // 12: property nsdeflist
-        // 13: property value
+        //  8: etag
+        //  9: property prefix
+        // 10: property xmlns
+        // 11: property name
+        // 12: property lang
+        // 13: property nsdeflist
+        // 14: property value
         
         char *path = PQgetvalue(result, r, 0);
         char *res_id = PQgetvalue(result, r, 1);
@@ -536,9 +545,12 @@
                     resource->addproperty(resource, webdav_resourcetype_empty(), 200);
                 }
             }
+            
+            char *lastmodified = PQgetvalue(result, r, 5);
+            char *contentlength = PQgetvalue(result, r, 7);
+            time_t t = pg_convert_timestamp(lastmodified);
+            
             if(vfsprops.getlastmodified) {
-                char *lastmodified = PQgetvalue(result, r, 5);
-                time_t t = pg_convert_timestamp(lastmodified);
                 struct tm tm;
                 gmtime_r(&t, &tm);
                 
@@ -551,11 +563,20 @@
                 webdav_resource_add_dav_stringproperty(resource, pool, "creationdate", creationdate, strlen(creationdate));
             }
             if(vfsprops.getcontentlength && !iscollection) {
-                char *contentlength = PQgetvalue(result, r, 7);
                 webdav_resource_add_dav_stringproperty(resource, pool, "getcontentlength", contentlength, strlen(contentlength));
             }
             if(vfsprops.getetag) {
-                
+                char *etag = PQgetvalue(result, r, 8);
+                if(!PQgetisnull(result, r, 8)) {
+                    webdav_resource_add_dav_stringproperty(resource, pool, "getetag", etag, strlen(etag));
+                } else {
+                    int64_t ctlen;
+                    if(util_strtoint(contentlength, &ctlen)) {
+                        char etag[MAX_ETAG];
+                        http_format_etag(rq->sn, rq->rq, etag, MAX_ETAG, ctlen, t);
+                        webdav_resource_add_dav_stringproperty(resource, pool, "getetag", etag, strlen(etag));
+                    }
+                }
             }
             
             vfsprops_set = TRUE;
@@ -563,17 +584,17 @@
         
         // dead properties
         if(!PQgetisnull(result, r, 9)) {
-            char *prefix = PQgetvalue(result, r, 8);
-            char *xmlns = PQgetvalue(result, r, 9);
-            char *pname = PQgetvalue(result, r, 10);
-            char *lang = PQgetvalue(result, r, 11);
-            char *nsdef = PQgetvalue(result, r, 12);
-            char *pvalue = PQgetvalue(result, r, 13);
+            char *prefix = PQgetvalue(result, r, 9);
+            char *xmlns = PQgetvalue(result, r, 10);
+            char *pname = PQgetvalue(result, r, 11);
+            char *lang = PQgetvalue(result, r, 12);
+            char *nsdef = PQgetvalue(result, r, 13);
+            char *pvalue = PQgetvalue(result, r, 14);
             
-            int pvalue_len = PQgetlength(result, r, 13);
-            WSBool lang_isnull = PQgetisnull(result, r, 11);
-            WSBool nsdef_isnull = PQgetisnull(result, r, 12);
-            WSBool pvalue_isnull = PQgetisnull(result, r, 13);
+            int pvalue_len = PQgetlength(result, r, 14);
+            WSBool lang_isnull = PQgetisnull(result, r, 12);
+            WSBool nsdef_isnull = PQgetisnull(result, r, 13);
+            WSBool pvalue_isnull = PQgetisnull(result, r, 14);
             
             WebdavProperty *property = pool_malloc(pool, sizeof(WebdavProperty));
             property->lang = NULL;

mercurial