web_backend: fix a regression introduced in 39c8d18
				
					
				
			* A regression was in 39c8d18 and token verification function was
  broken.
* The reason being `httplib` now requires OpenSSL 1.1+ API while
  LibreSSL 2.x provided OpenSSL 1.0 compatible API.
* The bundled LibreSSL has been updated to 3.2.2 so it now provides
  OpenSSL 1.1 compatible API now.
* Also the path hint has been added so that it will find the correct
  path to the CA certs on *nix systems.
* An option is provided so that *nix system distributions/providers can
  use their own SSL implementations when compiling Yuzu/Citra to
  (hopefully) complies with their maintenance guidelines.
* LURLParse is also removed since `httplib` can handle
  `scheme:host:port` string itself now.
			
			
This commit is contained in:
		| @@ -30,6 +30,8 @@ option(ENABLE_VULKAN "Enables Vulkan backend" ON) | |||||||
|  |  | ||||||
| option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF) | option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF) | ||||||
|  |  | ||||||
|  | option(USE_SYSTEM_SSL "Use system provided SSL library" OFF) | ||||||
|  |  | ||||||
| # Default to a Release build | # Default to a Release build | ||||||
| get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) | get_property(IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) | ||||||
| if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE) | if (NOT IS_MULTI_CONFIG AND NOT CMAKE_BUILD_TYPE) | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								externals/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								externals/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							| @@ -73,17 +73,20 @@ if (NOT LIBZIP_FOUND) | |||||||
| endif() | endif() | ||||||
|  |  | ||||||
| if (ENABLE_WEB_SERVICE) | if (ENABLE_WEB_SERVICE) | ||||||
|     # LibreSSL |     if (USE_SYSTEM_SSL) | ||||||
|     set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "") |         find_package(OpenSSL 1.1 REQUIRED) | ||||||
|     add_subdirectory(libressl EXCLUDE_FROM_ALL) |         set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) | ||||||
|     target_include_directories(ssl INTERFACE ./libressl/include) |     else() | ||||||
|     target_compile_definitions(ssl PRIVATE -DHAVE_INET_NTOP) |         # LibreSSL | ||||||
|     get_directory_property(OPENSSL_LIBRARIES |         set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "") | ||||||
|         DIRECTORY libressl |         set(OPENSSLDIR "/etc/ssl/") | ||||||
|         DEFINITION OPENSSL_LIBS) |         add_subdirectory(libressl EXCLUDE_FROM_ALL) | ||||||
|  |         target_include_directories(ssl INTERFACE ./libressl/include) | ||||||
|     # lurlparser |         target_compile_definitions(ssl PRIVATE -DHAVE_INET_NTOP) | ||||||
|     add_subdirectory(lurlparser EXCLUDE_FROM_ALL) |         get_directory_property(OPENSSL_LIBRARIES | ||||||
|  |             DIRECTORY libressl | ||||||
|  |             DEFINITION OPENSSL_LIBS) | ||||||
|  |     endif() | ||||||
|  |  | ||||||
|     # httplib |     # httplib | ||||||
|     add_library(httplib INTERFACE) |     add_library(httplib INTERFACE) | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								externals/libressl
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
							
						
						
									
										2
									
								
								externals/libressl
									
									
									
									
										vendored
									
									
								
							 Submodule externals/libressl updated: 7d01cb01cb...8289d0d07d
									
								
							
							
								
								
									
										8
									
								
								externals/lurlparser/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								externals/lurlparser/CMakeLists.txt
									
									
									
									
										vendored
									
									
								
							| @@ -1,8 +0,0 @@ | |||||||
| add_library(lurlparser |  | ||||||
|         LUrlParser.cpp |  | ||||||
|         LUrlParser.h |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| create_target_directory_groups(lurlparser) |  | ||||||
|  |  | ||||||
| target_include_directories(lurlparser INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}) |  | ||||||
							
								
								
									
										265
									
								
								externals/lurlparser/LUrlParser.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										265
									
								
								externals/lurlparser/LUrlParser.cpp
									
									
									
									
										vendored
									
									
								
							| @@ -1,265 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Lightweight URL & URI parser (RFC 1738, RFC 3986) |  | ||||||
|  * https://github.com/corporateshark/LUrlParser |  | ||||||
|  * |  | ||||||
|  * The MIT License (MIT) |  | ||||||
|  * |  | ||||||
|  * Copyright (C) 2015 Sergey Kosarevsky (sk@linderdaum.com) |  | ||||||
|  * |  | ||||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
|  * of this software and associated documentation files (the "Software"), to deal |  | ||||||
|  * in the Software without restriction, including without limitation the rights |  | ||||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
|  * copies of the Software, and to permit persons to whom the Software is |  | ||||||
|  * furnished to do so, subject to the following conditions: |  | ||||||
|  * |  | ||||||
|  * The above copyright notice and this permission notice shall be included in all |  | ||||||
|  * copies or substantial portions of the Software. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |  | ||||||
|  * SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #include "LUrlParser.h" |  | ||||||
|  |  | ||||||
| #include <algorithm> |  | ||||||
| #include <cstring> |  | ||||||
| #include <stdlib.h> |  | ||||||
|  |  | ||||||
| // check if the scheme name is valid |  | ||||||
| static bool IsSchemeValid( const std::string& SchemeName ) |  | ||||||
| { |  | ||||||
|     for ( auto c : SchemeName  ) |  | ||||||
|     { |  | ||||||
|         if ( !isalpha( c ) && c != '+' && c != '-' && c != '.' ) return false; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| bool LUrlParser::clParseURL::GetPort( int* OutPort ) const |  | ||||||
| { |  | ||||||
|     if ( !IsValid() ) { return false; } |  | ||||||
|  |  | ||||||
|     int Port = atoi( m_Port.c_str() ); |  | ||||||
|  |  | ||||||
|     if ( Port <= 0 || Port > 65535 ) { return false; } |  | ||||||
|  |  | ||||||
|     if ( OutPort ) { *OutPort = Port; } |  | ||||||
|  |  | ||||||
|     return true; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // based on RFC 1738 and RFC 3986 |  | ||||||
| LUrlParser::clParseURL LUrlParser::clParseURL::ParseURL( const std::string& URL ) |  | ||||||
| { |  | ||||||
|     LUrlParser::clParseURL Result; |  | ||||||
|  |  | ||||||
|     const char* CurrentString = URL.c_str(); |  | ||||||
|  |  | ||||||
|     /* |  | ||||||
|      *	<scheme>:<scheme-specific-part> |  | ||||||
|      *	<scheme> := [a-z\+\-\.]+ |  | ||||||
|      *	For resiliency, programs interpreting URLs should treat upper case letters as equivalent to lower case in scheme names |  | ||||||
|      */ |  | ||||||
|  |  | ||||||
|     // try to read scheme |  | ||||||
|     { |  | ||||||
|         const char* LocalString = strchr( CurrentString, ':' ); |  | ||||||
|  |  | ||||||
|         if ( !LocalString ) |  | ||||||
|         { |  | ||||||
|             return clParseURL( LUrlParserError_NoUrlCharacter ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // save the scheme name |  | ||||||
|         Result.m_Scheme = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|         if ( !IsSchemeValid( Result.m_Scheme ) ) |  | ||||||
|         { |  | ||||||
|             return clParseURL( LUrlParserError_InvalidSchemeName ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // scheme should be lowercase |  | ||||||
|         std::transform( Result.m_Scheme.begin(), Result.m_Scheme.end(), Result.m_Scheme.begin(), ::tolower ); |  | ||||||
|  |  | ||||||
|         // skip ':' |  | ||||||
|         CurrentString = LocalString+1; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /* |  | ||||||
|      *	//<user>:<password>@<host>:<port>/<url-path> |  | ||||||
|      *	any ":", "@" and "/" must be normalized |  | ||||||
|      */ |  | ||||||
|  |  | ||||||
|     // skip "//" |  | ||||||
|     if ( *CurrentString++ != '/' ) return clParseURL( LUrlParserError_NoDoubleSlash ); |  | ||||||
|     if ( *CurrentString++ != '/' ) return clParseURL( LUrlParserError_NoDoubleSlash ); |  | ||||||
|  |  | ||||||
|     // check if the user name and password are specified |  | ||||||
|     bool bHasUserName = false; |  | ||||||
|  |  | ||||||
|     const char* LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|     while ( *LocalString ) |  | ||||||
|     { |  | ||||||
|         if ( *LocalString == '@' ) |  | ||||||
|         { |  | ||||||
|             // user name and password are specified |  | ||||||
|             bHasUserName = true; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         else if ( *LocalString == '/' ) |  | ||||||
|         { |  | ||||||
|             // end of <host>:<port> specification |  | ||||||
|             bHasUserName = false; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         LocalString++; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // user name and password |  | ||||||
|     LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|     if ( bHasUserName ) |  | ||||||
|     { |  | ||||||
|         // read user name |  | ||||||
|         while ( *LocalString && *LocalString != ':' && *LocalString != '@' ) LocalString++; |  | ||||||
|  |  | ||||||
|         Result.m_UserName = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|         // proceed with the current pointer |  | ||||||
|         CurrentString = LocalString; |  | ||||||
|  |  | ||||||
|         if ( *CurrentString == ':' ) |  | ||||||
|         { |  | ||||||
|             // skip ':' |  | ||||||
|             CurrentString++; |  | ||||||
|  |  | ||||||
|             // read password |  | ||||||
|             LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|             while ( *LocalString && *LocalString != '@' ) LocalString++; |  | ||||||
|  |  | ||||||
|             Result.m_Password = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|             CurrentString = LocalString; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // skip '@' |  | ||||||
|         if ( *CurrentString != '@' ) |  | ||||||
|         { |  | ||||||
|             return clParseURL( LUrlParserError_NoAtSign ); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         CurrentString++; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     bool bHasBracket = ( *CurrentString == '[' ); |  | ||||||
|  |  | ||||||
|     // go ahead, read the host name |  | ||||||
|     LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|     while ( *LocalString ) |  | ||||||
|     { |  | ||||||
|         if ( bHasBracket && *LocalString == ']' ) |  | ||||||
|         { |  | ||||||
|             // end of IPv6 address |  | ||||||
|             LocalString++; |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|         else if ( !bHasBracket && ( *LocalString == ':' || *LocalString == '/' ) ) |  | ||||||
|         { |  | ||||||
|             // port number is specified |  | ||||||
|             break; |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         LocalString++; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     Result.m_Host = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|     CurrentString = LocalString; |  | ||||||
|  |  | ||||||
|     // is port number specified? |  | ||||||
|     if ( *CurrentString == ':' ) |  | ||||||
|     { |  | ||||||
|         CurrentString++; |  | ||||||
|  |  | ||||||
|         // read port number |  | ||||||
|         LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|         while ( *LocalString && *LocalString != '/' ) LocalString++; |  | ||||||
|  |  | ||||||
|         Result.m_Port = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|         CurrentString = LocalString; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // end of string |  | ||||||
|     if ( !*CurrentString ) |  | ||||||
|     { |  | ||||||
|         Result.m_ErrorCode = LUrlParserError_Ok; |  | ||||||
|  |  | ||||||
|         return Result; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // skip '/' |  | ||||||
|     if ( *CurrentString != '/' ) |  | ||||||
|     { |  | ||||||
|         return clParseURL( LUrlParserError_NoSlash ); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     CurrentString++; |  | ||||||
|  |  | ||||||
|     // parse the path |  | ||||||
|     LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|     while ( *LocalString && *LocalString != '#' && *LocalString != '?' ) LocalString++; |  | ||||||
|  |  | ||||||
|     Result.m_Path = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|     CurrentString = LocalString; |  | ||||||
|  |  | ||||||
|     // check for query |  | ||||||
|     if ( *CurrentString == '?' ) |  | ||||||
|     { |  | ||||||
|         // skip '?' |  | ||||||
|         CurrentString++; |  | ||||||
|  |  | ||||||
|         // read query |  | ||||||
|         LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|         while ( *LocalString && *LocalString != '#' ) LocalString++; |  | ||||||
|  |  | ||||||
|         Result.m_Query = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|         CurrentString = LocalString; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     // check for fragment |  | ||||||
|     if ( *CurrentString == '#' ) |  | ||||||
|     { |  | ||||||
|         // skip '#' |  | ||||||
|         CurrentString++; |  | ||||||
|  |  | ||||||
|         // read fragment |  | ||||||
|         LocalString = CurrentString; |  | ||||||
|  |  | ||||||
|         while ( *LocalString ) LocalString++; |  | ||||||
|  |  | ||||||
|         Result.m_Fragment = std::string( CurrentString, LocalString - CurrentString ); |  | ||||||
|  |  | ||||||
|         CurrentString = LocalString; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     Result.m_ErrorCode = LUrlParserError_Ok; |  | ||||||
|  |  | ||||||
|     return Result; |  | ||||||
| } |  | ||||||
							
								
								
									
										78
									
								
								externals/lurlparser/LUrlParser.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										78
									
								
								externals/lurlparser/LUrlParser.h
									
									
									
									
										vendored
									
									
								
							| @@ -1,78 +0,0 @@ | |||||||
| /* |  | ||||||
|  * Lightweight URL & URI parser (RFC 1738, RFC 3986) |  | ||||||
|  * https://github.com/corporateshark/LUrlParser |  | ||||||
|  * |  | ||||||
|  * The MIT License (MIT) |  | ||||||
|  * |  | ||||||
|  * Copyright (C) 2015 Sergey Kosarevsky (sk@linderdaum.com) |  | ||||||
|  * |  | ||||||
|  * Permission is hereby granted, free of charge, to any person obtaining a copy |  | ||||||
|  * of this software and associated documentation files (the "Software"), to deal |  | ||||||
|  * in the Software without restriction, including without limitation the rights |  | ||||||
|  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |  | ||||||
|  * copies of the Software, and to permit persons to whom the Software is |  | ||||||
|  * furnished to do so, subject to the following conditions: |  | ||||||
|  * |  | ||||||
|  * The above copyright notice and this permission notice shall be included in all |  | ||||||
|  * copies or substantial portions of the Software. |  | ||||||
|  * |  | ||||||
|  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |  | ||||||
|  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |  | ||||||
|  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |  | ||||||
|  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |  | ||||||
|  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |  | ||||||
|  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |  | ||||||
|  * SOFTWARE. |  | ||||||
|  */ |  | ||||||
|  |  | ||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include <string> |  | ||||||
|  |  | ||||||
| namespace LUrlParser |  | ||||||
| { |  | ||||||
| enum LUrlParserError |  | ||||||
| { |  | ||||||
|     LUrlParserError_Ok = 0, |  | ||||||
|     LUrlParserError_Uninitialized = 1, |  | ||||||
|     LUrlParserError_NoUrlCharacter = 2, |  | ||||||
|     LUrlParserError_InvalidSchemeName = 3, |  | ||||||
|     LUrlParserError_NoDoubleSlash = 4, |  | ||||||
|     LUrlParserError_NoAtSign = 5, |  | ||||||
|     LUrlParserError_UnexpectedEndOfLine = 6, |  | ||||||
|     LUrlParserError_NoSlash = 7, |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| class clParseURL |  | ||||||
| { |  | ||||||
| public: |  | ||||||
|     LUrlParserError m_ErrorCode; |  | ||||||
|     std::string m_Scheme; |  | ||||||
|     std::string m_Host; |  | ||||||
|     std::string m_Port; |  | ||||||
|     std::string m_Path; |  | ||||||
|     std::string m_Query; |  | ||||||
|     std::string m_Fragment; |  | ||||||
|     std::string m_UserName; |  | ||||||
|     std::string m_Password; |  | ||||||
|  |  | ||||||
|     clParseURL() |  | ||||||
|             : m_ErrorCode( LUrlParserError_Uninitialized ) |  | ||||||
|     {} |  | ||||||
|  |  | ||||||
|     /// return 'true' if the parsing was successful |  | ||||||
|     bool IsValid() const { return m_ErrorCode == LUrlParserError_Ok; } |  | ||||||
|  |  | ||||||
|     /// helper to convert the port number to int, return 'true' if the port is valid (within the 0..65535 range) |  | ||||||
|     bool GetPort( int* OutPort ) const; |  | ||||||
|  |  | ||||||
|     /// parse the URL |  | ||||||
|     static clParseURL ParseURL( const std::string& URL ); |  | ||||||
|  |  | ||||||
| private: |  | ||||||
|     explicit clParseURL( LUrlParserError ErrorCode ) |  | ||||||
|             : m_ErrorCode( ErrorCode ) |  | ||||||
|     {} |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| } // namespace LUrlParser |  | ||||||
							
								
								
									
										19
									
								
								externals/lurlparser/README.md
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										19
									
								
								externals/lurlparser/README.md
									
									
									
									
										vendored
									
									
								
							| @@ -1,19 +0,0 @@ | |||||||
| From https://github.com/corporateshark/LUrlParser/commit/455d5e2d27e3946f11ad0328fee9ee2628e6a8e2 |  | ||||||
|  |  | ||||||
| MIT License |  | ||||||
|  |  | ||||||
| === |  | ||||||
|  |  | ||||||
| Lightweight URL & URI parser (RFC 1738, RFC 3986) |  | ||||||
|  |  | ||||||
| (C) Sergey Kosarevsky, 2015 |  | ||||||
|  |  | ||||||
| @corporateshark sk@linderdaum.com |  | ||||||
|  |  | ||||||
| http://www.linderdaum.com |  | ||||||
|  |  | ||||||
| http://blog.linderdaum.com |  | ||||||
|  |  | ||||||
| ============================= |  | ||||||
|  |  | ||||||
| A tiny and lightweight URL & URI parser (RFC 1738, RFC 3986) written in C++. |  | ||||||
| @@ -9,4 +9,4 @@ add_library(web_service STATIC | |||||||
| ) | ) | ||||||
|  |  | ||||||
| create_target_directory_groups(web_service) | create_target_directory_groups(web_service) | ||||||
| target_link_libraries(web_service PRIVATE common nlohmann_json::nlohmann_json httplib lurlparser) | target_link_libraries(web_service PRIVATE common nlohmann_json::nlohmann_json httplib) | ||||||
|   | |||||||
| @@ -7,7 +7,6 @@ | |||||||
| #include <mutex> | #include <mutex> | ||||||
| #include <string> | #include <string> | ||||||
|  |  | ||||||
| #include <LUrlParser.h> |  | ||||||
| #include <fmt/format.h> | #include <fmt/format.h> | ||||||
| #include <httplib.h> | #include <httplib.h> | ||||||
|  |  | ||||||
| @@ -19,9 +18,6 @@ namespace WebService { | |||||||
|  |  | ||||||
| constexpr std::array<const char, 1> API_VERSION{'1'}; | constexpr std::array<const char, 1> API_VERSION{'1'}; | ||||||
|  |  | ||||||
| constexpr int HTTP_PORT = 80; |  | ||||||
| constexpr int HTTPS_PORT = 443; |  | ||||||
|  |  | ||||||
| constexpr std::size_t TIMEOUT_SECONDS = 30; | constexpr std::size_t TIMEOUT_SECONDS = 30; | ||||||
|  |  | ||||||
| struct Client::Impl { | struct Client::Impl { | ||||||
| @@ -67,21 +63,7 @@ struct Client::Impl { | |||||||
|                              const std::string& jwt = "", const std::string& username = "", |                              const std::string& jwt = "", const std::string& username = "", | ||||||
|                              const std::string& token = "") { |                              const std::string& token = "") { | ||||||
|         if (cli == nullptr) { |         if (cli == nullptr) { | ||||||
|             const auto parsedUrl = LUrlParser::clParseURL::ParseURL(host); |             cli = std::make_unique<httplib::Client>(host.c_str()); | ||||||
|             int port{}; |  | ||||||
|             if (parsedUrl.m_Scheme == "http") { |  | ||||||
|                 if (!parsedUrl.GetPort(&port)) { |  | ||||||
|                     port = HTTP_PORT; |  | ||||||
|                 } |  | ||||||
|             } else if (parsedUrl.m_Scheme == "https") { |  | ||||||
|                 if (!parsedUrl.GetPort(&port)) { |  | ||||||
|                     port = HTTPS_PORT; |  | ||||||
|                 } |  | ||||||
|             } else { |  | ||||||
|                 LOG_ERROR(WebService, "Bad URL scheme {}", parsedUrl.m_Scheme); |  | ||||||
|                 return WebResult{WebResult::Code::InvalidURL, "Bad URL scheme", ""}; |  | ||||||
|             } |  | ||||||
|             cli = std::make_unique<httplib::Client>(parsedUrl.m_Host.c_str(), port); |  | ||||||
|         } |         } | ||||||
|         cli->set_connection_timeout(TIMEOUT_SECONDS); |         cli->set_connection_timeout(TIMEOUT_SECONDS); | ||||||
|         cli->set_read_timeout(TIMEOUT_SECONDS); |         cli->set_read_timeout(TIMEOUT_SECONDS); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 liushuyu
					liushuyu