src/server/webdav/webdav.c

changeset 31
280250e45ba6
parent 30
27c7511c0e34
child 36
450d2d5f4735
--- a/src/server/webdav/webdav.c	Thu May 24 12:51:52 2012 +0200
+++ b/src/server/webdav/webdav.c	Fri May 25 18:16:24 2012 +0200
@@ -227,6 +227,13 @@
     if(stat(ppath, &st) != 0) {
         perror("webdav_propfind: stat");
         fprintf(stderr, "   file: %s\n", ppath);
+        
+        /* TODO: check errno only set status */
+        protocol_status(sn, rq, 404, NULL);
+        pblock_removekey(pb_key_content_type, rq->srvhdrs);
+        pblock_nninsert("content-length", 0, rq->srvhdrs);
+        http_start_response(sn, rq);
+        
         return REQ_ABORTED;
     } 
     
@@ -667,34 +674,28 @@
         sbuf_puts(out, "</D:propstat>\n");
     }
     
-    for(int i=0;i<propstat->map->size;i++) {
-        UcxMapElement *elm = &propstat->map->map[i];
-        while(elm) {
-            UcxDlist *proplist = (UcxDlist*)elm->data;
+    UcxMapIterator iter = ucx_map_iterator(propstat->map);
+    UCX_MAP_FOREACH(UcxDlist*, proplist, propstat->map, iter) { 
+        if(proplist) {
+            sbuf_puts(out, "<D:propstat>\n<D:prop>\n");
             
-            if(proplist) {
-                sbuf_puts(out, "<D:propstat>\n<D:prop>\n");
-                
-                DAV_FOREACH(prop, proplist) {
-                    xmlelm_write((XmlElement*)prop->data, out, wv);
-                }
+            DAV_FOREACH(prop, proplist) {
+                xmlelm_write((XmlElement*)prop->data, out, wv);
+            }
                 
-                sbuf_puts(out, "\n</D:prop>\n<D:status>");
+            sbuf_puts(out, "\n</D:prop>\n<D:status>");
                 
-                int status = *(int*)elm->key.data;
-                if(status < 1000 && status > 0) {
-                    char buf[5];
-                    buf[4] = 0;
-                    sprintf(buf, "%d ", status);
-                    sbuf_puts(out, "HTTP/1.1 ");
-                    sbuf_puts(out, buf);
-                    sbuf_puts(out, (char*)protocol_status_message(status));
-                }
-                
-                sbuf_puts(out, "</D:status>\n</D:propstat>\n");
+            int status = *(int*)iter.cur->key.data;
+            if(status < 1000 && status > 0) {
+                char buf[5];
+                buf[4] = 0;
+                sprintf(buf, "%d ", status);
+                sbuf_puts(out, "HTTP/1.1 ");
+                sbuf_puts(out, buf);
+                sbuf_puts(out, (char*)protocol_status_message(status));
             }
             
-            elm = elm->next;
+            sbuf_puts(out, "</D:status>\n</D:propstat>\n");
         }
     }
 }

mercurial