diff --git a/include/Http.h b/include/Http.h index 6f2e7cc..53bf6dd 100644 --- a/include/Http.h +++ b/include/Http.h @@ -39,8 +39,8 @@ namespace fs = std::filesystem; namespace Http { -std::string GET(const std::string& url, unsigned int* status = nullptr); -std::string POST(const std::string& url, const std::string& body, const std::string& ContentType, unsigned int* status = nullptr, const std::map& headers = {}); +std::string GET(std::string url, unsigned int* status = nullptr, const bool& redirect = true); +std::string POST(std::string url, const std::string& body, const std::string& ContentType, unsigned int* status = nullptr, const std::map& headers = {}, const bool& redirect = true); namespace Status { std::string ToString(int code); } diff --git a/include/RegionHandler.h b/include/RegionHandler.h index 17917ae..6402ced 100644 --- a/include/RegionHandler.h +++ b/include/RegionHandler.h @@ -27,6 +27,7 @@ public: RegionHandler() = delete; static void TopLevelDomainFailed(); static std::string RegionToTopLevelDomain(); + static std::string RedirectURL(const std::string &URL); private: static inline unsigned int mRegionIndex { 0 }; const static inline std::array mValidTLDs {"beammp.com", "beammp.ru"}; diff --git a/src/Common.cpp b/src/Common.cpp index 8b43cf6..7c5fbe6 100644 --- a/src/Common.cpp +++ b/src/Common.cpp @@ -76,23 +76,23 @@ std::string Application::ServerVersionString() { std::vector Application::GetBackendUrlsInOrder() { return { - "https://backend." + RegionHandler::RegionToTopLevelDomain(), + "https://backend.beammp.com", }; } std::string Application::GetServerCheckUrl() { - return "https://check." + RegionHandler::RegionToTopLevelDomain(); + return "https://check.beammp.com"; } std::string Application::GetBackendUrlForAuth() { - return "https://auth." + RegionHandler::RegionToTopLevelDomain(); + return "https://auth.beammp.com"; } std::string Application::GetBackendUrlForSocketIO() { - return "https://backend." + RegionHandler::RegionToTopLevelDomain(); + return "https://backend.beammp.com"; } std::array Application::VersionStrToInts(const std::string& str) { diff --git a/src/Http.cpp b/src/Http.cpp index 98bb6ce..1700c12 100644 --- a/src/Http.cpp +++ b/src/Http.cpp @@ -18,6 +18,7 @@ #include "Http.h" +#include "RegionHandler.h" #include "Common.h" #include "CustomAssert.h" @@ -115,10 +116,13 @@ public: } }; -std::string Http::GET(const std::string& url, unsigned int* status) { +std::string Http::GET(std::string url, unsigned int* status, const bool& redirect) { std::string Ret; CurlLease Lease{}; CURL* curl = Lease.GetHandle(); + if (redirect) { + url = RegionHandler::RedirectURL(url); + } if (curl) { CURLcode res; char errbuf[CURL_ERROR_SIZE]; @@ -142,6 +146,7 @@ std::string Http::GET(const std::string& url, unsigned int* status) { if (res != CURLE_OK) { beammp_error("GET to " + url + " failed: " + std::string(curl_easy_strerror(res))); beammp_error("Curl error: " + std::string(errbuf)); + RegionHandler::TopLevelDomainFailed(); return Http::ErrorString; } @@ -156,10 +161,13 @@ std::string Http::GET(const std::string& url, unsigned int* status) { return Ret; } -std::string Http::POST(const std::string& url, const std::string& body, const std::string& ContentType, unsigned int* status, const std::map& headers) { +std::string Http::POST(std::string url, const std::string& body, const std::string& ContentType, unsigned int* status, const std::map& headers, const bool& redirect) { std::string Ret; CurlLease Lease{}; CURL* curl = Lease.GetHandle(); + if (redirect) { + url = RegionHandler::RedirectURL(url); + } if (curl) { CURLcode res; char errbuf[CURL_ERROR_SIZE]; @@ -195,6 +203,7 @@ std::string Http::POST(const std::string& url, const std::string& body, const st if (res != CURLE_OK) { beammp_error("POST to " + url + " failed: " + std::string(curl_easy_strerror(res))); beammp_error("Curl error: " + std::string(errbuf)); + RegionHandler::TopLevelDomainFailed(); return Http::ErrorString; } diff --git a/src/RegionHandler.cpp b/src/RegionHandler.cpp index db9058c..99ca4f3 100644 --- a/src/RegionHandler.cpp +++ b/src/RegionHandler.cpp @@ -19,9 +19,14 @@ #include "RegionHandler.h" #include "Common.h" +#include + void RegionHandler::TopLevelDomainFailed() { - beammp_info("Top level domain of " + mValidTLDs[mRegionIndex % mValidTLDs.size()] + " didn't respond correctly , changing domain to " + mValidTLDs[(mRegionIndex + 1) % mValidTLDs.size()]); + static bool isDeveloperRegion = Application::Settings.getAsString(Settings::Key::General_Region) == "Developer"; + if (!isDeveloperRegion) { + beammp_info("Top level domain of " + mValidTLDs[mRegionIndex % mValidTLDs.size()] + " didn't respond correctly , changing domain to " + mValidTLDs[(mRegionIndex + 1) % mValidTLDs.size()]); + } mRegionIndex++; } @@ -33,3 +38,16 @@ std::string RegionHandler::RegionToTopLevelDomain() } return mValidTLDs[mRegionIndex % mValidTLDs.size()]; // Global } + +std::string RegionHandler::RedirectURL(const std::string &URL) +{ + std::regex link_pattern(R"(^(https:\/\/.*)beammp\.com(\/.*)?$)"); + std::smatch link_match; + if (std::regex_search(URL, link_match, link_pattern) && link_match.position() == 0) { + //TLD matched beammp.com + std::string before = link_match[1].str(); // "https://..." up to beammp + std::string after = link_match[2].matched ? link_match[2].str() : ""; // "/path" or "" + return before + RegionToTopLevelDomain() + after; + } + return URL; //if it didn't match, just return the unmodified URL +}