From c52fdc469fab8a30fd12c7947ea80d393fecb3b5 Mon Sep 17 00:00:00 2001 From: radius Date: Fri, 16 Mar 2018 01:10:42 -0500 Subject: [PATCH] remove task_push_http_transfer_raw, encode before sending data to the task --- cheevos/cheevos.c | 6 ++-- intl/msg_hash_us.h | 2 ++ libretro-common/include/net/net_http.h | 6 +++- libretro-common/net/net_http.c | 34 +++++++++++++++++-- menu/cbs/menu_cbs_ok.c | 23 +++++++------ menu/menu_cbs.h | 6 ---- menu/menu_networking.c | 8 ++--- msg_hash.h | 1 + network/netplay/netplay_frontend.c | 10 +++--- tasks/task_http.c | 45 ++++++-------------------- tasks/tasks_internal.h | 9 ++++-- 11 files changed, 82 insertions(+), 68 deletions(-) diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 34524dba7c..6d51de452f 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -1906,7 +1906,7 @@ static void cheevos_unlocked(void *task_data, void *user_data, RARCH_ERR("[CHEEVOS]: error awarding achievement %u, retrying...\n", cheevo->id); cheevos_make_unlock_url(cheevo, url, sizeof(url)); - task_push_http_transfer_raw(url, true, NULL, cheevos_unlocked, cheevo); + task_push_http_transfer(url, true, NULL, cheevos_unlocked, cheevo); } } @@ -1961,7 +1961,7 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) runloop_msg_queue_push(cheevo->description, 0, 3 * 60, false); cheevos_make_unlock_url(cheevo, url, sizeof(url)); - task_push_http_transfer_raw(url, true, NULL, + task_push_http_transfer(url, true, NULL, cheevos_unlocked, cheevo); if(settings->bools.cheevos_auto_screenshot) @@ -2176,7 +2176,7 @@ static void cheevos_test_leaderboards(void) char formatted_value[16]; cheevos_make_lboard_url(lboard, url, sizeof(url)); - task_push_http_transfer_raw(url, true, NULL, + task_push_http_transfer(url, true, NULL, cheevos_lboard_submit, lboard); RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 49fa6870d4..82f554fb25 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2089,6 +2089,8 @@ MSG_HASH(MSG_DISK_EJECTED, "Ejected") MSG_HASH(MSG_DOWNLOADING, "Downloading") +MSG_HASH(MSG_INDEX_FILE, + "Index File") MSG_HASH(MSG_DOWNLOAD_FAILED, "Download failed") MSG_HASH(MSG_ERROR, diff --git a/libretro-common/include/net/net_http.h b/libretro-common/include/net/net_http.h index d312c7423d..8a9f2c5e0b 100644 --- a/libretro-common/include/net/net_http.h +++ b/libretro-common/include/net/net_http.h @@ -68,7 +68,11 @@ uint8_t* net_http_data(struct http_t *state, size_t* len, bool accept_error); /* Cleans up all memory. */ void net_http_delete(struct http_t *state); -void net_http_urlencode_full(char **dest, const char *source); +/* URL Encode a string */ +void net_http_urlencode(char **dest, const char *source); + +/* Re-encode a full URL */ +void net_http_urlencode_full(char *dest, const char *source, size_t size); RETRO_END_DECLS diff --git a/libretro-common/net/net_http.c b/libretro-common/net/net_http.c index 41d92403a6..003ad0815d 100644 --- a/libretro-common/net/net_http.c +++ b/libretro-common/net/net_http.c @@ -33,6 +33,7 @@ #include #include #include +#include enum { @@ -101,8 +102,9 @@ void urlencode_lut_init() } } -/* caller is responsible for deleting the destination buffer */ -void net_http_urlencode_full(char **dest, const char *source) +/* URL Encode a string + caller is responsible for deleting the destination buffer */ +void net_http_urlencode(char **dest, const char *source) { char *enc = NULL; /* Assume every character will be encoded, so we need 3 times the space. */ @@ -129,6 +131,34 @@ void net_http_urlencode_full(char **dest, const char *source) (*dest)[len - 1] = '\0'; } +/* Re-encode a full URL */ +void net_http_urlencode_full(char *dest, const char *source, size_t size) +{ + char *tmp; + char url_domain[PATH_MAX_LENGTH]; + char url_path[PATH_MAX_LENGTH]; + char url_encoded[PATH_MAX_LENGTH]; + + int count = 0; + strlcpy (url_path, source, sizeof(url_path)); + tmp = url_path; + + while (count < 3 && tmp[0] != '\0') + { + tmp = strchr(tmp, '/'); + count ++; + tmp++; + } + + strlcpy(url_domain, source, tmp - url_path); + strlcpy(url_path, tmp, sizeof(url_path)); + + tmp = NULL; + net_http_urlencode(&tmp, url_path); + snprintf(dest, size, "%s/%s", url_domain, tmp); + free (tmp); +} + static int net_http_new_socket(struct http_connection_t *conn) { int ret; diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index ece7c8c2a6..e73fbad759 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -51,6 +51,8 @@ #include "../../lakka.h" #include "../../wifi/wifi_driver.h" +#include + #ifdef HAVE_NETWORKING #include "../../network/netplay/netplay.h" #include "../../network/netplay/netplay_discovery.h" @@ -2370,7 +2372,7 @@ static int generic_action_ok_network(const char *path, char url_path[PATH_MAX_LENGTH]; settings_t *settings = config_get_ptr(); unsigned type_id2 = 0; - menu_file_transfer_t *transf = NULL; + file_transfer_t *transf = NULL; const char *url_label = NULL; retro_task_callback_t callback = NULL; bool refresh = true; @@ -2442,7 +2444,7 @@ static int generic_action_ok_network(const char *path, generic_action_ok_command(CMD_EVENT_NETWORK_INIT); - transf = (menu_file_transfer_t*)calloc(1, sizeof(*transf)); + transf = (file_transfer_t*)calloc(1, sizeof(*transf)); strlcpy(transf->path, url_path, sizeof(transf->path)); task_push_http_transfer(url_path, suppress_msg, url_label, callback, transf); @@ -2466,7 +2468,7 @@ default_action_ok_list(action_ok_lakka_list, MENU_ENUM_LABEL_CB_LAKKA_LIST) static void cb_generic_dir_download(void *task_data, void *user_data, const char *err) { - menu_file_transfer_t *transf = (menu_file_transfer_t*)user_data; + file_transfer_t *transf = (file_transfer_t*)user_data; if (transf) { @@ -2477,7 +2479,7 @@ static void cb_generic_dir_download(void *task_data, } } -/* expects http_transfer_t*, menu_file_transfer_t* */ +/* expects http_transfer_t*, file_transfer_t* */ static void cb_generic_download(void *task_data, void *user_data, const char *err) { @@ -2486,7 +2488,7 @@ static void cb_generic_download(void *task_data, bool extract = true; #endif const char *dir_path = NULL; - menu_file_transfer_t *transf = (menu_file_transfer_t*)user_data; + file_transfer_t *transf = (file_transfer_t*)user_data; settings_t *settings = config_get_ptr(); http_transfer_data_t *data = (http_transfer_data_t*)task_data; @@ -2651,13 +2653,14 @@ static int action_ok_download_generic(const char *path, { #ifdef HAVE_NETWORKING char s[PATH_MAX_LENGTH]; + char s2[PATH_MAX_LENGTH]; char s3[PATH_MAX_LENGTH]; - menu_file_transfer_t *transf = NULL; + file_transfer_t *transf = NULL; settings_t *settings = config_get_ptr(); bool suppress_msg = false; retro_task_callback_t cb = cb_generic_download; - s[0] = s3[0] = '\0'; + s[0] = s2[0] = s3[0] = '\0'; fill_pathname_join(s, settings->paths.network_buildbot_assets_url, @@ -2721,12 +2724,14 @@ static int action_ok_download_generic(const char *path, break; } - fill_pathname_join(s3, s, path, sizeof(s3)); + fill_pathname_join(s2, s, path, sizeof(s2)); - transf = (menu_file_transfer_t*)calloc(1, sizeof(*transf)); + transf = (file_transfer_t*)calloc(1, sizeof(*transf)); transf->enum_idx = enum_idx; strlcpy(transf->path, path, sizeof(transf->path)); + net_http_urlencode_full(s3, s2, sizeof(s)); + task_push_http_transfer(s3, suppress_msg, msg_hash_to_str(enum_idx), cb, transf); #endif return 0; diff --git a/menu/menu_cbs.h b/menu/menu_cbs.h index 8aeac420f3..d9000e7030 100644 --- a/menu/menu_cbs.h +++ b/menu/menu_cbs.h @@ -127,12 +127,6 @@ enum ACTION_OK_DL_CONTENT_SETTINGS }; -typedef struct -{ - enum msg_hash_enums enum_idx; - char path[PATH_MAX_LENGTH]; -} menu_file_transfer_t; - /* FIXME - Externs, refactor */ extern size_t hack_shader_pass; extern unsigned rpl_entry_selection_ptr; diff --git a/menu/menu_networking.c b/menu/menu_networking.c index e6f5cd7527..991cd6656f 100644 --- a/menu/menu_networking.c +++ b/menu/menu_networking.c @@ -186,7 +186,7 @@ void cb_net_generic_subdir(void *task_data, void *user_data, const char *err) #ifdef HAVE_NETWORKING char subdir_path[PATH_MAX_LENGTH]; http_transfer_data_t *data = (http_transfer_data_t*)task_data; - menu_file_transfer_t *state = (menu_file_transfer_t*)user_data; + file_transfer_t *state = (file_transfer_t*)user_data; subdir_path[0] = '\0'; @@ -228,7 +228,7 @@ void cb_net_generic(void *task_data, void *user_data, const char *err) #ifdef HAVE_NETWORKING bool refresh = false; http_transfer_data_t *data = (http_transfer_data_t*)task_data; - menu_file_transfer_t *state = (menu_file_transfer_t*)user_data; + file_transfer_t *state = (file_transfer_t*)user_data; if (core_buf) free(core_buf); @@ -263,7 +263,7 @@ finish: if (!err && !strstr(state->path, file_path_str(FILE_PATH_INDEX_DIRS_URL))) { char *parent_dir = (char*)malloc(PATH_MAX_LENGTH * sizeof(char)); - menu_file_transfer_t *transf = NULL; + file_transfer_t *transf = NULL; parent_dir[0] = '\0'; @@ -273,7 +273,7 @@ finish: file_path_str(FILE_PATH_INDEX_DIRS_URL), PATH_MAX_LENGTH * sizeof(char)); - transf = (menu_file_transfer_t*)malloc(sizeof(*transf)); + transf = (file_transfer_t*)malloc(sizeof(*transf)); transf->enum_idx = MSG_UNKNOWN; strlcpy(transf->path, parent_dir, sizeof(transf->path)); diff --git a/msg_hash.h b/msg_hash.h index 09c6567800..c625f33b05 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -399,6 +399,7 @@ enum msg_hash_enums MSG_REMOVED_DISK_FROM_TRAY, MSG_FAILED_TO_REMOVE_DISK_FROM_TRAY, MSG_GOT_INVALID_DISK_INDEX, + MSG_INDEX_FILE, MSG_DOWNLOADING, MSG_EXTRACTING, MSG_EXTRACTING_FILE, diff --git a/network/netplay/netplay_frontend.c b/network/netplay/netplay_frontend.c index cd1aaf0994..bef3cbbc4b 100644 --- a/network/netplay/netplay_frontend.c +++ b/network/netplay/netplay_frontend.c @@ -767,13 +767,13 @@ static void netplay_announce(void) netplay_get_architecture(frontend_architecture, sizeof(frontend_architecture)); - net_http_urlencode_full(&username, settings->paths.username); - net_http_urlencode_full(&corename, system->info.library_name); - net_http_urlencode_full(&gamename, + net_http_urlencode(&username, settings->paths.username); + net_http_urlencode(&corename, system->info.library_name); + net_http_urlencode(&gamename, !string_is_empty(path_basename(path_get(RARCH_PATH_BASENAME))) ? path_basename(path_get(RARCH_PATH_BASENAME)) : "N/A"); - net_http_urlencode_full(&coreversion, system->info.library_version); - net_http_urlencode_full(&frontend_ident, frontend_architecture); + net_http_urlencode(&coreversion, system->info.library_version); + net_http_urlencode(&frontend_ident, frontend_architecture); buf[0] = '\0'; diff --git a/tasks/task_http.c b/tasks/task_http.c index edfacac47f..55747ad623 100644 --- a/tasks/task_http.c +++ b/tasks/task_http.c @@ -249,6 +249,7 @@ static void* task_push_http_transfer_generic( { task_finder_data_t find_data; char tmp[255]; + char* s = NULL; retro_task_t *t = NULL; http_handle_t *http = NULL; @@ -297,8 +298,16 @@ static void* task_push_http_transfer_generic( t->user_data = user_data; t->progress = -1; + s= ((file_transfer_t*)user_data)->path; + + if (strstr(s, ".index")) + { + snprintf(tmp, sizeof(tmp), "%s %s", + msg_hash_to_str(MSG_DOWNLOADING), msg_hash_to_str(MSG_INDEX_FILE)); + } + else snprintf(tmp, sizeof(tmp), "%s '%s'", - msg_hash_to_str(MSG_DOWNLOADING), path_basename(url)); + msg_hash_to_str(MSG_DOWNLOADING), path_basename(s)); t->title = strdup(tmp); @@ -320,40 +329,6 @@ void* task_push_http_transfer(const char *url, bool mute, retro_task_callback_t cb, void *user_data) { struct http_connection_t *conn; - char *tmp; - char url_domain[PATH_MAX_LENGTH]; - char url_path[PATH_MAX_LENGTH]; - char url_encoded[PATH_MAX_LENGTH]; - - int count = 0; - strlcpy (url_path, url, sizeof(url_path)); - tmp = url_path; - - while (count < 3 && tmp[0] != '\0') - { - tmp = strchr(tmp, '/'); - count ++; - tmp++; - } - - strlcpy(url_domain, url, tmp - url_path); - strlcpy(url_path, tmp, sizeof(url_path)); - - tmp = NULL; - net_http_urlencode_full (&tmp, url_path); - snprintf(url_encoded, sizeof(url_encoded), "%s/%s", url_domain, tmp); - - conn = net_http_connection_new(url_encoded, "GET", NULL); - - free (tmp); - return task_push_http_transfer_generic(conn, url, mute, type, cb, user_data); -} - -void* task_push_http_transfer_raw(const char *url, bool mute, - const char *type, - retro_task_callback_t cb, void *user_data) -{ - struct http_connection_t *conn; conn = net_http_connection_new(url, "GET", NULL); diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index dbf585dc91..bbb11866ad 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -92,6 +92,12 @@ typedef struct nbio_handle transfer_cb_t cb; } nbio_handle_t; +typedef struct +{ + enum msg_hash_enums enum_idx; + char path[PATH_MAX_LENGTH]; +} file_transfer_t; + #ifdef HAVE_NETWORKING typedef struct { @@ -102,9 +108,6 @@ typedef struct void *task_push_http_transfer(const char *url, bool mute, const char *type, retro_task_callback_t cb, void *userdata); -void *task_push_http_transfer_raw(const char *url, bool mute, const char *type, - retro_task_callback_t cb, void *userdata); - void *task_push_http_post_transfer(const char *url, const char *post_data, bool mute, const char *type, retro_task_callback_t cb, void *userdata);