src/server/webdav/webdav.c

changeset 29
e8619defde14
parent 27
05b7576dca2b
child 30
27c7511c0e34
--- 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);
     

mercurial