dav/webdav.c

changeset 16
5dbef9e07376
parent 15
182af08b4813
child 17
11dffb40cd91
equal deleted inserted replaced
15:182af08b4813 16:5dbef9e07376
33 33
34 #include "utils.h" 34 #include "utils.h"
35 #include "webdav.h" 35 #include "webdav.h"
36 #include "methods.h" 36 #include "methods.h"
37 #include "ucx/buffer.h" 37 #include "ucx/buffer.h"
38 #include "ucx/utils.h"
38 39
39 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b) 40 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
40 41
41 DavContext* dav_context_new() { 42 DavContext* dav_context_new() {
42 DavContext *context = malloc(sizeof(DavContext)); 43 DavContext *context = malloc(sizeof(DavContext));
64 } 65 }
65 66
66 return context; 67 return context;
67 } 68 }
68 69
70 void dav_context_destroy(DavContext *ctx) {
71 // destroy all sessions assoziated with this context
72 UCX_FOREACH(elm, ctx->sessions) {
73 dav_session_destroy(elm->data);
74 }
75
76 UcxMapIterator i = ucx_map_iterator(ctx->namespaces);
77 UcxKey k;
78 DavNamespace *ns;
79 UCX_MAP_FOREACH(k, ns, i) {
80 free(ns->prefix);
81 free(ns->name);
82 free(ns);
83 }
84 ucx_map_free(ctx->namespaces);
85 free(ctx);
86 }
87
69 int dav_add_namespace(DavContext *context, char *prefix, char *name) { 88 int dav_add_namespace(DavContext *context, char *prefix, char *name) {
70 DavNamespace *namespace = malloc(sizeof(DavNamespace)); 89 DavNamespace *namespace = malloc(sizeof(DavNamespace));
71 if(!namespace) { 90 if(!namespace) {
72 return 1; 91 return 1;
73 } 92 }
106 sn->handle = curl_easy_init(); 125 sn->handle = curl_easy_init();
107 curl_easy_setopt(sn->handle, CURLOPT_URL, base_url); 126 curl_easy_setopt(sn->handle, CURLOPT_URL, base_url);
108 127
109 sn->mp = ucx_mempool_new(1024); 128 sn->mp = ucx_mempool_new(1024);
110 sn->allocator = ucx_mempool_allocator(sn->mp); 129 sn->allocator = ucx_mempool_allocator(sn->mp);
130
131 context->sessions = ucx_list_append(context->sessions, sn);
111 132
112 return sn; 133 return sn;
113 } 134 }
114 135
115 DavSession* dav_session_new_auth(DavContext *context, char *base_url, char *user, char *password) { 136 DavSession* dav_session_new_auth(DavContext *context, char *base_url, char *user, char *password) {
138 switch(status) { 159 switch(status) {
139 default: sn->error = DAV_ERROR; break; 160 default: sn->error = DAV_ERROR; break;
140 case 401: sn->error = DAV_UNAUTHORIZED; break; 161 case 401: sn->error = DAV_UNAUTHORIZED; break;
141 case 403: sn->error = DAV_FORBIDDEN; break; 162 case 403: sn->error = DAV_FORBIDDEN; break;
142 case 404: sn->error = DAV_NOT_FOUND; break; 163 case 404: sn->error = DAV_NOT_FOUND; break;
164 case 405: sn->error = DAV_METHOD_NOT_ALLOWED; break;
165 case 409: sn->error = DAV_CONFLICT; break;
143 } 166 }
144 } else { 167 } else {
145 sn->error = DAV_ERROR; 168 sn->error = DAV_ERROR;
146 } 169 }
170 }
171
172 void dav_session_destroy(DavSession *sn) {
173 // remove session from context
174 UcxList *sessions = sn->context->sessions;
175 ssize_t i = ucx_list_find(sessions, sn, ucx_ptrcmp, NULL);
176 if(i > 0) {
177 UcxList *elm = ucx_list_get(sessions, i);
178 if(elm) {
179 sn->context->sessions = ucx_list_remove(sessions, elm);
180 }
181 }
182
183 ucx_mempool_destroy(sn->mp);
184 curl_easy_cleanup(sn->handle);
185 free(sn->base_url);
186 free(sn);
147 } 187 }
148 188
149 DavResource* dav_get(DavSession *sn, char *path, char *properties) { 189 DavResource* dav_get(DavSession *sn, char *path, char *properties) {
150 char *url = util_concat_path(sn->base_url, path); 190 char *url = util_concat_path(sn->base_url, path);
151 191
512 } else { 552 } else {
513 session_set_error(res->session, ret, status); 553 session_set_error(res->session, ret, status);
514 return 1; 554 return 1;
515 } 555 }
516 } 556 }
557
558 int dav_create(DavResource *res) {
559 char *url = util_concat_path(res->session->base_url, res->path);
560 char *parent = util_parent_path(res->path);
561
562 DavSession *sn = res->session;
563 DavResource *parent_res = dav_get(sn, parent, NULL);
564 if(!parent_res && sn->error == DAV_NOT_FOUND) {
565 parent_res = dav_resource_new(sn, parent);
566 parent_res->iscollection = 1;
567 int r = dav_create(parent_res);
568 if(r) {
569 free(parent);
570 return r;
571 }
572 } else if(parent_res && !res->iscollection) {
573 sn->error = DAV_FORBIDDEN;
574 return 1;
575 } else if(sn->error != DAV_OK) {
576 return 1;
577 }
578
579 CURL *handle = res->session->handle;
580 curl_easy_setopt(handle, CURLOPT_URL, url);
581 free(url);
582 free(parent);
583
584 // TODO: check iscollection and create empty resource or collection
585
586 CURLcode ret = do_mkcol_request(handle);
587 int status = 0;
588 curl_easy_getinfo (handle, CURLINFO_RESPONSE_CODE, &status);
589 if(ret == CURLE_OK && (status >= 200 && status < 300)) {
590 res->session->error = DAV_OK;
591 return 0;
592 } else {
593 session_set_error(res->session, ret, status);
594 return 1;
595 }
596 }

mercurial