src/server/webdav/multistatus.c

branch
webdav
changeset 217
8ed14d76db42
parent 211
2160585200ac
child 222
5f05e56cb8e2
--- a/src/server/webdav/multistatus.c	Mon Dec 30 16:33:20 2019 +0100
+++ b/src/server/webdav/multistatus.c	Tue Dec 31 10:01:32 2019 +0100
@@ -31,6 +31,8 @@
 
 #include "../daemon/session.h"
 
+#include "operation.h"
+
 #include "multistatus.h"
 
 #define MULTISTATUS_BUFFER_LENGTH 2048
@@ -266,13 +268,17 @@
     ZERO(res, sizeof(MSResponse));
     
     res->resource.addproperty = msresponse_addproperty;
+    res->resource.close = msresponse_close;
     
     res->multistatus = ms;
     res->errors = NULL;
-    res->end = 0;
+    res->resource.isclosed = 0;
+    res->closing = 0;
     
     if(ms->current) {
-        ms->current->end = 1;
+        if(!ms->current->resource.isclosed) {
+            msresponse_close((WebdavResource*)ms->current);
+        }
         ms->current->next = res;
     } else {
         ms->first = res;
@@ -288,7 +294,7 @@
         int status)
 {
     MSResponse *response = (MSResponse*)res;
-    if(response->end) {
+    if(response->resource.isclosed) {
         log_ereport(
                 LOG_WARN,
                 "%s",
@@ -389,3 +395,20 @@
     }
     return 0;
 }
+
+int msresponse_close(WebdavResource *res) {
+    MSResponse *response = (MSResponse*)res;
+    if(response->closing) {
+        return 0; // close already in progress
+    }
+    
+    int ret = REQ_PROCEED;
+    WebdavOperation *op = response->multistatus->response.op;
+    if(webdav_op_propfiond_close_resource(op, res)) {
+        ret = REQ_ABORTED;
+    }
+    
+    response->resource.isclosed = TRUE;
+    response->closing = FALSE;
+    return ret;
+}

mercurial