From 8a788c2b0fe062ecbeebba9fb5ac4dabe420527d Mon Sep 17 00:00:00 2001 From: helintongh Date: Fri, 14 Jul 2023 12:43:14 +0800 Subject: [PATCH] fix: in aarch64 c++ string_view will cause gibberish's bug fix --- cmake/build.cmake | 5 +++++ include/cinatra/request.hpp | 26 +++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/cmake/build.cmake b/cmake/build.cmake index 91aae76a..e96047f8 100644 --- a/cmake/build.cmake +++ b/cmake/build.cmake @@ -24,6 +24,11 @@ else () set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread -std=c++20") endif () +if (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64") + message(STATUS "Build in aarch64") + add_definitions(-DCINATRA_AARCH64) +endif () + # --------------------- Gcc if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fcoroutines") diff --git a/include/cinatra/request.hpp b/include/cinatra/request.hpp index b81b65e4..936915b9 100644 --- a/include/cinatra/request.hpp +++ b/include/cinatra/request.hpp @@ -674,8 +674,11 @@ class request { throw std::invalid_argument("not support the value type"); } } - +#ifndef CINATRA_AARCH64 std::string_view get_query_value(std::string_view key) { +#elif CINATRA_AARCH64 + std::string get_query_value(std::string_view key) { +#endif if (restful_params_.empty()) { auto url = get_url(); url = url.length() > 1 && url.back() == '/' @@ -692,22 +695,43 @@ class request { if (code_utils::is_url_encode(itf->second)) { auto ret = utf8_character_params_.emplace( map_key, code_utils::get_string_by_urldecode(itf->second)); +#if CINATRA_AARCH64 + return std::string(ret.first->second.data(), + ret.first->second.size()); +#else return std::string_view(ret.first->second.data(), ret.first->second.size()); +#endif } +#if CINATRA_AARCH64 + return std::string(itf->second); +#else return itf->second; +#endif } if (code_utils::is_url_encode(it->second)) { auto ret = utf8_character_params_.emplace( map_key, code_utils::get_string_by_urldecode(it->second)); +#if CINATRA_AARCH64 + return std::string(ret.first->second.data(), ret.first->second.size()); +#else return std::string_view(ret.first->second.data(), ret.first->second.size()); +#endif } +#if CINATRA_AARCH64 + return std::string(it->second); +#else return it->second; +#endif } else { const std::string &result(matches_[restful_params_.at(std::string(key))]); +#if CINATRA_AARCH64 + return std::string(result.data(), result.size()); +#else return std::string_view(result.data(), result.size()); +#endif } }