aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2024-02-19 23:09:58 +0100
committerXavier Del Campo Romero <xavi.dcr@tutanota.com>2024-02-19 23:35:09 +0100
commit78c8c4dabb62a6669cfd4eca231e39fd7fd4567a (patch)
tree554755c88266297005a7b99f11468bb55c0dba51
parent55008f2f648b2ebb275d04607961d6bd4b9768ec (diff)
downloadslcl-78c8c4dabb62a6669cfd4eca231e39fd7fd4567a.tar.gz
page.c: URL-encode href
Otherwise, files with special characters, such as '%', could not be downloaded or previewed.
-rw-r--r--page.c28
1 files changed, 25 insertions, 3 deletions
diff --git a/page.c b/page.c
index 02049a3..80a9675 100644
--- a/page.c
+++ b/page.c
@@ -108,6 +108,7 @@ static int prepare_name(struct html_node *const n, struct stat *const sb,
struct html_node *a;
struct dynstr d, dname;
const char *const sep = S_ISDIR(sb->st_mode) ? "/" : "";
+ char *encurl = NULL;
dynstr_init(&d);
dynstr_init(&dname);
@@ -122,7 +123,12 @@ static int prepare_name(struct html_node *const n, struct stat *const sb,
fprintf(stderr, "%s: html_node_add_child failed\n", __func__);
goto end;
}
- else if (html_node_add_attr(a, "href", d.str))
+ else if (!(encurl = http_encode_url(d.str)))
+ {
+ fprintf(stderr, "%s: http_encode_url failed\n", __func__);
+ goto end;
+ }
+ else if (html_node_add_attr(a, "href", encurl))
{
fprintf(stderr, "%s: html_node_add_attr href failed\n", __func__);
goto end;
@@ -143,6 +149,7 @@ static int prepare_name(struct html_node *const n, struct stat *const sb,
end:
dynstr_free(&d);
dynstr_free(&dname);
+ free(encurl);
return ret;
}
@@ -303,6 +310,7 @@ static int prepare_preview(struct html_node *const n,
const struct stat *const sb, const char *const dir, const char *const name)
{
int ret = -1;
+ char *encurl = NULL;
struct html_node *a;
struct dynstr d;
@@ -315,9 +323,22 @@ static int prepare_preview(struct html_node *const n,
fprintf(stderr, "%s: html_node_add_child form failed\n", __func__);
goto end;
}
- else if (dynstr_append(&d, "%s%s?preview=1", dir, name))
+ else if (dynstr_append(&d, "%s%s", dir, name))
{
- fprintf(stderr, "%s: dynstr_append failed\n", __func__);
+ fprintf(stderr, "%s: dynstr_append d failed\n", __func__);
+ goto end;
+ }
+ else if (!(encurl = http_encode_url(d.str)))
+ {
+ fprintf(stderr, "%s: http_encode_url failed\n", __func__);
+ goto end;
+ }
+
+ dynstr_free(&d);
+
+ if (dynstr_append(&d, "%s?preview=1", encurl))
+ {
+ fprintf(stderr, "%s: dynstr_append encd failed\n", __func__);
goto end;
}
else if (html_node_add_attr(a, "href", d.str))
@@ -335,6 +356,7 @@ static int prepare_preview(struct html_node *const n,
end:
dynstr_free(&d);
+ free(encurl);
return ret;
}