# HG changeset patch # User Olaf Wintermann # Date 1652119587 -7200 # Node ID bdd31584141f7b3670fb29a544c67416658ddbdd # Parent b6d71e50429477a18080edaff9c83b17c44ed3d7 implement etag in pg propfind diff -r b6d71e504294 -r bdd31584141f src/server/plugins/postgresql/webdav.c --- 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 #include @@ -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;