From 8759386d6e5b983cd7678d90b4e07e8a8172ca23 Mon Sep 17 00:00:00 2001 From: Debian Games Team Date: Sun, 20 Oct 2024 21:39:20 +0200 Subject: [PATCH] galaxy-urls-2 commit 6556dc6a82b4e3d64ef1a7940736be3a7b2ac956 Author: Sude Date: Thu Aug 22 21:50:23 2024 +0300 Add more checks to galaxyAPI::getPathFromDownlinkUrl Gbp-Pq: Name galaxy-urls-2.patch --- src/galaxyapi.cpp | 63 ++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/src/galaxyapi.cpp b/src/galaxyapi.cpp index 46519e4..d9e378f 100644 --- a/src/galaxyapi.cpp +++ b/src/galaxyapi.cpp @@ -498,40 +498,51 @@ std::string galaxyAPI::getPathFromDownlinkUrl(const std::string& downlink_url, c { std::string path; std::string downlink_url_unescaped = (std::string)curl_easy_unescape(curlhandle, downlink_url.c_str(), downlink_url.size(), NULL); + size_t filename_start_pos = 0; - // GOG has changed the url formatting few times between 2 different formats. - // Try to get proper file name in both cases. - size_t filename_end_pos; - if (downlink_url_unescaped.find("?path=") != std::string::npos) + // If url ends in "/" then remove it + if (downlink_url_unescaped.back() == '/') + downlink_url_unescaped.assign(downlink_url_unescaped.begin(), downlink_url_unescaped.end()-1); + + // Assume that filename starts after last "/" in url + if (downlink_url_unescaped.find_last_of("/") != std::string::npos) + filename_start_pos = downlink_url_unescaped.find_last_of("/") + 1; + + // Url contains "/gamename/" + if (downlink_url_unescaped.find("/" + gamename + "/") != std::string::npos) + filename_start_pos = downlink_url_unescaped.find("/" + gamename + "/"); + + // Assume that filename ends at the end of url + size_t filename_end_pos = downlink_url_unescaped.length(); + + // Check to see if url has any query strings + if (downlink_url_unescaped.find("?") != std::string::npos) { - size_t token_pos = downlink_url_unescaped.find("&token="); - size_t access_token_pos = downlink_url_unescaped.find("&access_token="); - if ((token_pos != std::string::npos) && (access_token_pos != std::string::npos)) - { - filename_end_pos = std::min(token_pos, access_token_pos); - } - else + // Assume that filename ends at first "?" + filename_end_pos = downlink_url_unescaped.find_first_of("?"); + + // Check for "?path=" + if (downlink_url_unescaped.find("?path=") != std::string::npos) { - filename_end_pos = downlink_url_unescaped.find_first_of("&"); + size_t token_pos = downlink_url_unescaped.find("&token="); + size_t access_token_pos = downlink_url_unescaped.find("&access_token="); + if ((token_pos != std::string::npos) && (access_token_pos != std::string::npos)) + { + filename_end_pos = std::min(token_pos, access_token_pos); + } + else + { + if (downlink_url_unescaped.find_first_of("&") != std::string::npos) + filename_end_pos = downlink_url_unescaped.find_first_of("&"); + } } } - else - filename_end_pos = downlink_url_unescaped.find_first_of("?"); - // Downlink doesn't contain "?path=" or "?" - // Set end pos to length - if (filename_end_pos == std::string::npos) - filename_end_pos = downlink_url_unescaped.length(); + path.assign(downlink_url_unescaped.begin()+filename_start_pos, downlink_url_unescaped.begin()+filename_end_pos); - if (downlink_url_unescaped.find("/" + gamename + "/") != std::string::npos) - { - path.assign(downlink_url_unescaped.begin()+downlink_url_unescaped.find("/" + gamename + "/"), downlink_url_unescaped.begin()+filename_end_pos); - } - else - { - path.assign(downlink_url_unescaped.begin()+downlink_url_unescaped.find_last_of("/")+1, downlink_url_unescaped.begin()+filename_end_pos); + // Make sure that path contains "/gamename/" + if (path.find("/" + gamename + "/") == std::string::npos) path = "/" + gamename + "/" + path; - } // Workaround for filename issue caused by different (currently unknown) url formatting scheme // https://github.com/Sude-/lgogdownloader/issues/126 -- 2.30.2