--- a/src/server/webdav/webdav.c Sun May 06 10:09:27 2012 +0200 +++ b/src/server/webdav/webdav.c Wed May 16 12:47:28 2012 +0200 @@ -46,6 +46,8 @@ if(!strcmp(method, "PROPFIND")) { return webdav_propfind(pb, sn, rq); + } else if(!strcmp(method, "PROPPATCH")) { + return webdav_proppatch(pb, sn, rq); } else if(!strcmp(method, "PUT")) { return webdav_put(pb, sn, rq); } @@ -243,6 +245,48 @@ return REQ_PROCEED; } +int webdav_proppatch(pblock *pb, Session *sn, Request *rq) { + /* TODO: clean up if errors occurs */ + /* TODO: this is the same code as in propfind */ + + /* Get request body which contains the webdav XML request */ + char *xml_body; + size_t xml_len = 0; + + char *ctlen = pblock_findkeyval(pb_key_content_length, rq->headers); + if(ctlen) { + xml_len = atoi(ctlen); + } else { + /* invalid request */ + printf("invalid request\n"); + return REQ_ABORTED; + } + + xml_body = pool_malloc(sn->pool, xml_len + 1); + if(xml_body == NULL) { + return REQ_ABORTED; + } + xml_body[xml_len] = 0; + if(!xml_body) { + /* server error */ + printf("server error\n"); + return REQ_ABORTED; + } + + /* get request body */ + int r = 0; + char *xb = xml_body; + size_t xl = xml_len; + while((r = netbuf_getbytes(sn->inbuf, xb, xl)) != NETBUF_EOF) { + xb += r; + xl -= r; + } + + + + return REQ_PROCEED; +} + void dav_resource_response(PropfindRequest *davrq, sstr_t path, sstr_t uri) { printf("dav_resource_response %s %s\n", sstrdub(path).ptr, sstrdub(uri).ptr);