forked from eden-emu/eden
		
	Merge pull request #4842 from liushuyu/fix-web-srv
web_backend: fix a regression introduced in 39c8d18
			
			
This commit is contained in:
		
						commit
						7d27a7a511
					
				
					 8 changed files with 17 additions and 402 deletions
				
			
		
							
								
								
									
										25
									
								
								externals/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										25
									
								
								externals/CMakeLists.txt
									
										
									
									
										vendored
									
									
								
							|  | @ -73,17 +73,20 @@ if (NOT LIBZIP_FOUND) | |||
| endif() | ||||
| 
 | ||||
| if (ENABLE_WEB_SERVICE) | ||||
|     # LibreSSL | ||||
|     set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "") | ||||
|     add_subdirectory(libressl EXCLUDE_FROM_ALL) | ||||
|     target_include_directories(ssl INTERFACE ./libressl/include) | ||||
|     target_compile_definitions(ssl PRIVATE -DHAVE_INET_NTOP) | ||||
|     get_directory_property(OPENSSL_LIBRARIES | ||||
|         DIRECTORY libressl | ||||
|         DEFINITION OPENSSL_LIBS) | ||||
| 
 | ||||
|     # lurlparser | ||||
|     add_subdirectory(lurlparser EXCLUDE_FROM_ALL) | ||||
|     find_package(OpenSSL 1.1) | ||||
|     if (OPENSSL_FOUND) | ||||
|         set(OPENSSL_LIBRARIES OpenSSL::SSL OpenSSL::Crypto) | ||||
|     else() | ||||
|         # LibreSSL | ||||
|         set(LIBRESSL_SKIP_INSTALL ON CACHE BOOL "") | ||||
|         set(OPENSSLDIR "/etc/ssl/") | ||||
|         add_subdirectory(libressl EXCLUDE_FROM_ALL) | ||||
|         target_include_directories(ssl INTERFACE ./libressl/include) | ||||
|         target_compile_definitions(ssl PRIVATE -DHAVE_INET_NTOP) | ||||
|         get_directory_property(OPENSSL_LIBRARIES | ||||
|             DIRECTORY libressl | ||||
|             DEFINITION OPENSSL_LIBS) | ||||
|     endif() | ||||
| 
 | ||||
|     # httplib | ||||
|     add_library(httplib INTERFACE) | ||||
|  |  | |||
							
								
								
									
										2
									
								
								externals/libressl
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								externals/libressl
									
										
									
									
										vendored
									
									
								
							|  | @ -1 +1 @@ | |||
| Subproject commit 7d01cb01cb1a926ecb4c9c98b107ef3c26f59dfb | ||||
| Subproject commit 8289d0d07de6553bf4b900bf60e808ea3f7f59da | ||||
							
								
								
									
										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) | ||||
| 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 <string> | ||||
| 
 | ||||
| #include <LUrlParser.h> | ||||
| #include <fmt/format.h> | ||||
| #include <httplib.h> | ||||
| 
 | ||||
|  | @ -19,9 +18,6 @@ namespace WebService { | |||
| 
 | ||||
| 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; | ||||
| 
 | ||||
| struct Client::Impl { | ||||
|  | @ -67,21 +63,7 @@ struct Client::Impl { | |||
|                              const std::string& jwt = "", const std::string& username = "", | ||||
|                              const std::string& token = "") { | ||||
|         if (cli == nullptr) { | ||||
|             const auto parsedUrl = LUrlParser::clParseURL::ParseURL(host); | ||||
|             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 = std::make_unique<httplib::Client>(host.c_str()); | ||||
|         } | ||||
|         cli->set_connection_timeout(TIMEOUT_SECONDS); | ||||
|         cli->set_read_timeout(TIMEOUT_SECONDS); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 LC
						LC