Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion core/libs/prx/libSceHttp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ if(BUILD_TESTING)
target_link_libraries(guest_http_tests PRIVATE libSceHttp libc)
configure_windows_unwind(guest_http_tests)
add_test(NAME guest_http COMMAND guest_http_tests)
add_test(NAME guest_http_uri_locale COMMAND guest_http_tests --uri-locale)
set_tests_properties(guest_http_uri_locale PROPERTIES SKIP_RETURN_CODE 77)
add_test_executable(guest_http_response_header_tests ${LIBS_INCLUDE_DIR}/tests/GuestHttpResponseHeader.cpp)
target_include_directories(guest_http_response_header_tests PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(guest_http_response_header_tests PRIVATE libSceHttp libc)
Expand All @@ -19,7 +21,7 @@ if(BUILD_TESTING)
configure_windows_unwind(guest_http_options_tests)
add_test(NAME guest_http_options COMMAND guest_http_options_tests)
if(WIN32)
set_tests_properties(guest_http guest_http_response_header guest_http_options PROPERTIES ENVIRONMENT_MODIFICATION
set_tests_properties(guest_http guest_http_uri_locale guest_http_response_header guest_http_options PROPERTIES ENVIRONMENT_MODIFICATION
"PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceHttp>")
endif()
endif()
44 changes: 32 additions & 12 deletions core/libs/tests/GuestHttp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@
#include "prx/libc/include/general/VabiMacros.hpp"
#include <atomic>
#include <chrono>
#include <cctype>
#include <clocale>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <exception>
Expand Down Expand Up @@ -425,7 +427,36 @@ static void CheckCaList() {
Require(sceHttpsFreeCaList(1, &list) == 0 && list.certs == nullptr && list.certsNum == 0);
}

int main() {
static int CheckUriLocales() {
const std::string previousCtype = std::setlocale(LC_CTYPE, nullptr);
bool exercised = false;
#ifdef _WIN32
const char* locales[] = {".1252"};
#else
const char* locales[] = {"en_US.ISO8859-1", "en_US.iso88591", "en_US.UTF-8"};
#endif
for (const char* locale : locales) {
if (!std::setlocale(LC_CTYPE, locale)) continue;
CheckUriEscapeBytes();
CheckUriParseCharacters();
const bool classifiesHighByte = std::isalpha(static_cast<unsigned char>(0xE9)) != 0;
exercised |= classifiesHighByte;
std::printf("URI locale checks: %s; classifies 0xE9 as alphabetic: %s\n", locale, classifiesHighByte ? "yes" : "no");
}
Require(std::setlocale(LC_CTYPE, previousCtype.c_str()) != nullptr);
#ifdef _WIN32
Require(exercised);
#endif
if (!exercised) {
std::fputs("SKIP: URI locale regression requires a Latin-1 locale that classifies 0xE9 as alphabetic.\n", stderr);
return 77;
}
return 0;
}

int main(int argc, char** argv) {
if (argc == 2 && std::strcmp(argv[1], "--uri-locale") == 0) return CheckUriLocales();
Require(argc == 1);
const std::uint64_t processSize = processParameters.size();
const std::uint32_t processMagic = 0x4942524f;
std::uint32_t sdkVersion = 0x1000000;
Expand Down Expand Up @@ -565,17 +596,6 @@ int main() {
Require(std::setlocale(LC_CTYPE, "C") != nullptr);
CheckUriEscapeBytes();
CheckUriParseCharacters();
#ifdef _WIN32
Require(std::setlocale(LC_CTYPE, ".1252") != nullptr);
CheckUriEscapeBytes();
CheckUriParseCharacters();
#else
for (const char* locale : {"en_US.ISO8859-1", "en_US.iso88591", "en_US.UTF-8"}) {
if (!std::setlocale(LC_CTYPE, locale)) continue;
CheckUriEscapeBytes();
CheckUriParseCharacters();
}
#endif
Require(std::setlocale(LC_CTYPE, previousCtype.c_str()) != nullptr);

constexpr const char* unescapeCases[][2] = {
Expand Down
Loading