202 ucx_buffer_write(sn->base_url, 1, strlen(sn->base_url), url); |
202 ucx_buffer_write(sn->base_url, 1, strlen(sn->base_url), url); |
203 // remove trailing slash |
203 // remove trailing slash |
204 ucx_buffer_seek(url, -1, SEEK_CUR); |
204 ucx_buffer_seek(url, -1, SEEK_CUR); |
205 |
205 |
206 sstr_t p = sstr(path); |
206 sstr_t p = sstr(path); |
207 size_t ntk = 0; |
207 ssize_t ntk = 0; |
208 sstr_t *tks = sstrsplit(p, S("/"), &ntk); |
208 sstr_t *tks = sstrsplit(p, S("/"), &ntk); |
209 |
209 |
210 for(int i=0;i<ntk;i++) { |
210 for(int i=0;i<ntk;i++) { |
211 sstr_t node = tks[i]; |
211 sstr_t node = tks[i]; |
212 if(node.length > 0) { |
212 if(node.length > 0) { |
213 char *esc = curl_easy_escape(sn->handle, node.ptr, node.length); |
213 char *esc = curl_easy_escape(sn->handle, node.ptr, node.length); |
214 ucx_buffer_putc(url, '/'); |
214 ucx_buffer_putc(url, '/'); |
215 ucx_buffer_write(esc, 1, strlen(esc), url); |
215 ucx_buffer_write(esc, 1, strlen(esc), url); |
216 curl_free(esc); |
216 curl_free(esc); |
217 free(node.ptr); |
217 } |
218 } |
218 free(node.ptr); |
219 } |
219 } |
220 free(tks); |
220 free(tks); |
221 if(path[p.length-1] == '/') { |
221 if(path[p.length-1] == '/') { |
222 ucx_buffer_putc(url, '/'); |
222 ucx_buffer_putc(url, '/'); |
223 } |
223 } |