libidav/utils.c

changeset 40
a95ee94b9204
parent 39
3e55bed345f9
child 43
03076907b58a
--- a/libidav/utils.c	Sat Sep 07 14:08:43 2013 +0200
+++ b/libidav/utils.c	Mon Mar 17 18:42:01 2014 +0100
@@ -31,6 +31,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <ucx/string.h>
+#include <ucx/buffer.h>
 #include <libxml/tree.h>
 #include <curl/curl.h>
 
@@ -41,6 +42,7 @@
 #include <openssl/buffer.h>
 
 #include "utils.h"
+#include "webdav.h"
 
 
 time_t util_parse_creationdate(char *str) {
@@ -173,6 +175,51 @@
     return url.ptr;
 }
 
+void util_set_url(DavSession *sn, char *path) {
+    if(path) {
+        char *url = util_path_to_url(sn, path);
+        curl_easy_setopt(sn->handle, CURLOPT_URL, url);
+        free(url);
+    } else {
+        curl_easy_setopt(sn->handle, CURLOPT_URL, sn->base_url);
+    }
+}
+
+char* util_path_to_url(DavSession *sn, char *path) {
+    UcxBuffer *url = ucx_buffer_new(NULL, 256, UCX_BUFFER_AUTOEXTEND);
+    
+    // add base url
+    ucx_buffer_write(sn->base_url, 1, strlen(sn->base_url), url);
+    // remove trailing slash
+    ucx_buffer_seek(url, -1, SEEK_CUR);
+    
+    sstr_t p = sstr(path);
+    size_t ntk = 0;
+    sstr_t *tks = sstrsplit(p, S("/"), &ntk);
+    
+    for(int i=0;i<ntk;i++) {
+        sstr_t node = tks[i];
+        if(node.length > 0) {
+            // TODO: implement file name encryption
+            char *esc = curl_easy_escape(sn->handle, node.ptr, node.length);
+            ucx_buffer_putc(url, '/');
+            ucx_buffer_write(esc, 1, strlen(esc), url);
+            curl_free(esc);
+            free(node.ptr);
+        }
+    }
+    free(tks);
+    if(path[p.length-1] == '/') {
+        ucx_buffer_putc(url, '/');
+    }
+    ucx_buffer_putc(url, 0);
+    
+    // only free the buffer struct and return the buffer space
+    char *space = url->space;
+    free(url);
+    return space;
+}
+
 char* util_parent_path(char *path) {
     char *name = util_resource_name(path);
     size_t namelen = strlen(name);

mercurial