diff -r 1a29b1d8d9d8 -r e59abb210584 src/server/webdav/webdav.c --- a/src/server/webdav/webdav.c Sun Jan 26 11:50:35 2020 +0100 +++ b/src/server/webdav/webdav.c Sat Feb 01 18:44:31 2020 +0100 @@ -66,6 +66,8 @@ default_backend.propfind_finish = default_propfind_finish; default_backend.proppatch_do = default_proppatch_do; default_backend.proppatch_finish = default_proppatch_finish; + default_backend.opt_mkcol = NULL; + default_backend.opt_delete = NULL; default_backend.settings = WS_WEBDAV_PROPFIND_USE_VFS; } @@ -444,15 +446,64 @@ } int webdav_mkcol(pblock *pb, Session *sn, Request *rq) { - return REQ_ABORTED; + UcxBuffer *reqbuf; + VFSContext *vfs; + char *path; + + if(webdav_init_vfs_op(sn, rq, &reqbuf, &vfs, &path)) { + return REQ_ABORTED; + } + + int ret = REQ_PROCEED; + if(vfs_mkdir(vfs, path)) { + protocol_status(sn, rq, util_errno2status(vfs->vfs_errno), NULL); + return REQ_ABORTED; + } + + protocol_status(sn, rq, 201, NULL); + + // cleanup and return + if(reqbuf) { + ucx_buffer_free(reqbuf); + } + return ret; } int webdav_post(pblock *pb, Session *sn, Request *rq) { return REQ_ABORTED; } +static int webdav_delete_collection( + Session *sn, + Request *rq, + VFSContext *vfs, + const char *path) +{ + +} + int webdav_delete(pblock *pb, Session *sn, Request *rq) { - return REQ_ABORTED; + UcxBuffer *reqbuf; + VFSContext *vfs; + char *path; + + if(webdav_init_vfs_op(sn, rq, &reqbuf, &vfs, &path)) { + return REQ_ABORTED; + } + + int ret = REQ_PROCEED; + + // TODO + + if(ret == REQ_PROCEED) { + protocol_status(sn, rq, 200, NULL); + } + + // cleanup and return + if(reqbuf) { + ucx_buffer_free(reqbuf); + } + return ret; } int webdav_put(pblock *pb, Session *sn, Request *rq) { @@ -484,6 +535,51 @@ } +int webdav_init_vfs_op( + Session *sn, + Request *rq, + UcxBuffer **out_reqbuf, + VFSContext **out_vfs, + char **out_path) +{ + *out_reqbuf = NULL; + *out_vfs = NULL; + *out_path = NULL; + + // create VFS context + VFSContext *vfs = vfs_request_context(sn, rq); + if(!vfs) { + return REQ_ABORTED; + } + + // read request body, if it exists + char *expect = pblock_findkeyval(pb_key_expect, rq->headers); + if(expect) { + if(!strcasecmp(expect, "100-continue")) { + if(http_send_continue(sn)) { + return REQ_ABORTED; + } + } + } + + UcxBuffer *reqbody = NULL; + if(sn->inbuf) { + reqbody = rqbody2buffer(sn, rq); + if(!reqbody) { + return REQ_ABORTED; + } + } + + // requested uri and path + char *path = pblock_findkeyval(pb_key_path, rq->vars); + + *out_reqbuf = reqbody; + *out_vfs = vfs; + *out_path = path; + + return REQ_PROCEED; +} + /* ------------------------ default webdav backend ------------------------ */ int default_propfind_init(