--- 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; +}