src/server/webdav/webdav.c

changeset 572
e70418bb14b1
parent 490
d218607f5a7e
child 579
e10457d74fe1
--- a/src/server/webdav/webdav.c	Wed Jan 29 20:51:31 2025 +0100
+++ b/src/server/webdav/webdav.c	Thu Jan 30 18:19:12 2025 +0100
@@ -77,6 +77,10 @@
 
 #define WEBDAV_RESOURCE_TYPE_COLLECTION "<D:collection/>"
 
+static void webdav_cleanup(void *data) {
+    cxMapDestroy(webdav_type_map);
+    cxMapDestroy(method_handler_map);
+}
 
 static WebdavBackend* default_backend_create(Session *sn, Request *rq, pblock *pb, void *initData) {
     WebdavBackend *dav = pool_malloc(sn->pool, sizeof(WebdavBackend));
@@ -105,10 +109,10 @@
 
 
 int webdav_register_backend(const char *name, webdav_init_func webdavInit, webdav_create_func webdavCreate) {
-    WebdavType *webdavType = malloc(sizeof(WebdavType));
-    webdavType->init = webdavInit;
-    webdavType->create = webdavCreate;
-    return cxMapPut(webdav_type_map, cx_hash_key_str(name), webdavType);
+    WebdavType webdavType;
+    webdavType.init = webdavInit;
+    webdavType.create = webdavCreate;
+    return cxMapPut(webdav_type_map, cx_hash_key_str(name), &webdavType);
 }
 
 WebdavType* webdav_get_type(cxstring dav_class) {
@@ -146,7 +150,7 @@
     }
     webdav_is_initialized = TRUE;
     
-    webdav_type_map = cxHashMapCreate(cxDefaultAllocator, CX_STORE_POINTERS, 8);
+    webdav_type_map = cxHashMapCreate(cxDefaultAllocator, sizeof(WebdavType), 8);
     if(!webdav_type_map) {
         return REQ_ABORTED;
     }
@@ -203,6 +207,8 @@
     dav_resourcetype_collection.value.data = dav_resourcetype_collection_value;
     dav_resourcetype_collection.vtype = WS_VALUE_XML_DATA;
     
+    webserver_atrestart(webdav_cleanup, NULL);
+    
     return REQ_PROCEED;
 }
 

mercurial