diff options
author | William Wennerström <william@wstrm.dev> | 2020-12-06 17:02:09 +0100 |
---|---|---|
committer | William Wennerström <william@wstrm.dev> | 2020-12-06 17:02:09 +0100 |
commit | ac030378479cf999fefc0889d5c0932cfcabc4fc (patch) | |
tree | aece65906a09f1fc01550e98ecda4511b352a8d7 /src | |
parent | 1d2c0a8836123c3b484826b974f87a0061bc110b (diff) | |
download | profani-tty-ac030378479cf999fefc0889d5c0932cfcabc4fc.tar.gz |
Rework url to filename
Diffstat (limited to 'src')
-rw-r--r-- | src/command/cmd_funcs.c | 1 | ||||
-rw-r--r-- | src/common.c | 65 | ||||
-rw-r--r-- | src/tools/aesgcm_download.c | 13 | ||||
-rw-r--r-- | src/tools/http_download.c | 1 |
4 files changed, 42 insertions, 38 deletions
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c index 147eca4d..5b1427fe 100644 --- a/src/command/cmd_funcs.c +++ b/src/command/cmd_funcs.c @@ -9141,7 +9141,6 @@ cmd_url_open(ProfWin* window, const char* const command, gchar** args) if (0 == g_strcmp0(scheme, "aesgcm")) { char* filename = unique_filename_from_url(url, files_get_data_path(DIR_DOWNLOADS)); _url_aesgcm_method(window, cmd_template, url, filename); - free(filename); goto out; } diff --git a/src/common.c b/src/common.c index 66e344c5..10be280a 100644 --- a/src/common.c +++ b/src/common.c @@ -602,56 +602,63 @@ _unique_filename(const char* filename) return unique; } -gchar* +bool +_has_directory_suffix(const char* path) +{ + return (g_str_has_suffix(path, ".") + || g_str_has_suffix(path, "..") + || g_str_has_suffix(path, G_DIR_SEPARATOR_S)); +} + +char* _basename_from_url(const char* url) { - const char* default_name = "index.html"; + const char* default_name = "index"; - GFile* file = g_file_new_for_uri(url); - gchar* filename = g_file_get_basename(file); - g_object_unref(file); + GFile* file = g_file_new_for_commandline_arg(url); + char* basename = g_file_get_basename(file); - if (g_strcmp0(filename, ".") == 0 - || g_strcmp0(filename, "..") == 0 - || g_strcmp0(filename, G_DIR_SEPARATOR_S) == 0) { - g_free(filename); - return strdup(default_name); + if (_has_directory_suffix(basename)) { + g_free(basename); + basename = strdup(default_name); } - return filename; + g_object_unref(file); + + return basename; } gchar* unique_filename_from_url(const char* url, const char* path) { - gchar* directory = NULL; - gchar* basename = NULL; - if (path != NULL) { - directory = g_path_get_dirname(path); - basename = g_path_get_basename(path); - } - - if (!directory) { - // Explicitly use "./" as directory if no directory has been passed. - directory = "./"; + // Default to './' as path when none has been provided. + if (path == NULL) { + path = "./"; } - if (!g_file_test(directory, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { - return NULL; - } + // Resolves paths such as './../.' for path. + GFile* target = g_file_new_for_commandline_arg(path); + gchar* filename = NULL; - if (g_file_test(path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) { - basename = _basename_from_url(url); + if (_has_directory_suffix(path) || g_file_test(path, G_FILE_TEST_IS_DIR)) { + // The target should be used as a directory. Assume that the basename + // should be derived from the URL. + char* basename = _basename_from_url(url); + filename = g_build_filename(g_file_peek_path(target), basename, NULL); + g_free(basename); + } else { + // Just use the target as filename. + filename = g_build_filename(g_file_peek_path(target), NULL); } - gchar* filename = g_build_filename(directory, basename, NULL); - gchar* unique_filename = _unique_filename(filename); - if (!unique_filename) { + if (unique_filename == NULL) { g_free(filename); return NULL; } + g_object_unref(target); g_free(filename); + return unique_filename; } diff --git a/src/tools/aesgcm_download.c b/src/tools/aesgcm_download.c index d75cabe3..f8d2db9f 100644 --- a/src/tools/aesgcm_download.c +++ b/src/tools/aesgcm_download.c @@ -85,11 +85,6 @@ aesgcm_file_get(void* userdata) "(%s).", https_url, g_strerror(errno)); return NULL; - } else { - // TODO(wstrm): Maybe refactor this to use file handles so we do not - // have to open a dummy file descriptor and then close it. - // It's pretty ugly this way... - close(tmpfd); } FILE* outfh = fopen(aesgcm_dl->filename, "wb"); @@ -107,6 +102,7 @@ aesgcm_file_get(void* userdata) http_dl->worker = aesgcm_dl->worker; http_dl->url = strdup(https_url); http_dl->filename = strdup(tmpname); + http_dl->cmd_template = NULL; aesgcm_dl->http_dl = http_dl; @@ -117,7 +113,7 @@ aesgcm_file_get(void* userdata) http_print_transfer_update(aesgcm_dl->window, aesgcm_dl->url, "Downloading '%s' failed: Unable to open " "temporary file at '%s' for reading (%s).", - aesgcm_dl->url, aesgcm_dl->filename, + aesgcm_dl->url, tmpname, g_strerror(errno)); return NULL; } @@ -130,6 +126,7 @@ aesgcm_file_get(void* userdata) cons_show_error(g_strerror(errno)); } + close(tmpfd); remove(tmpname); g_free(tmpname); @@ -149,7 +146,7 @@ aesgcm_file_get(void* userdata) if (aesgcm_dl->cmd_template != NULL) { gchar** argv = format_call_external_argv(aesgcm_dl->cmd_template, - aesgcm_dl->url, + aesgcm_dl->filename, aesgcm_dl->filename); // TODO(wstrm): Log the error. @@ -164,11 +161,11 @@ aesgcm_file_get(void* userdata) } g_strfreev(argv); + free(aesgcm_dl->cmd_template); } free(aesgcm_dl->filename); free(aesgcm_dl->url); - free(aesgcm_dl->cmd_template); free(aesgcm_dl); return NULL; diff --git a/src/tools/http_download.c b/src/tools/http_download.c index ef7e2906..397ff4b8 100644 --- a/src/tools/http_download.c +++ b/src/tools/http_download.c @@ -205,6 +205,7 @@ http_file_get(void* userdata) } g_strfreev(argv); + free(download->cmd_template); } free(download->url); |