diff --git a/CMakeLists.txt b/CMakeLists.txt index 0f92e092f..7331f0cf6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -165,6 +165,9 @@ add_definitions(-DBOOST_COROUTINES_NO_DEPRECATION_WARNING) add_definitions(-DBOOST_FILESYSTEM_NO_DEPRECATED) +# Required for Boost v1.74+ +add_definitions(-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + link_directories(${Boost_LIBRARY_DIRS}) include_directories(${Boost_INCLUDE_DIRS}) diff --git a/lib/base/string.cpp b/lib/base/string.cpp index c4617e357..eec5b8372 100644 --- a/lib/base/string.cpp +++ b/lib/base/string.cpp @@ -127,6 +127,18 @@ String::operator const std::string&() const return m_Data; } +/** + * Conversion function to boost::string_view. + * + * This allows using String as the value for HTTP headers in boost::beast::http::basic_fields::set. + * + * @return A boost::string_view representing this string. + */ +String::operator boost::string_view() const +{ + return boost::string_view(m_Data); +} + const char *String::CStr() const { return m_Data.c_str(); diff --git a/lib/base/string.hpp b/lib/base/string.hpp index e9799e7eb..b9290eeee 100644 --- a/lib/base/string.hpp +++ b/lib/base/string.hpp @@ -6,6 +6,7 @@ #include "base/i2-base.hpp" #include "base/object.hpp" #include +#include #include #include @@ -71,6 +72,7 @@ public: bool operator<(const String& rhs) const; operator const std::string&() const; + operator boost::string_view() const; const char *CStr() const; diff --git a/lib/base/utility.cpp b/lib/base/utility.cpp index 1add7616c..d8e6f20b0 100644 --- a/lib/base/utility.cpp +++ b/lib/base/utility.cpp @@ -725,7 +725,11 @@ void Utility::CopyFile(const String& source, const String& target) { namespace fs = boost::filesystem; +#if BOOST_VERSION >= 107400 + fs::copy_file(fs::path(source.Begin(), source.End()), fs::path(target.Begin(), target.End()), fs::copy_options::overwrite_existing); +#else /* BOOST_VERSION */ fs::copy_file(fs::path(source.Begin(), source.End()), fs::path(target.Begin(), target.End()), fs::copy_option::overwrite_if_exists); +#endif /* BOOST_VERSION */ } /* diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 7798ad8dc..1cda8afce 100644 --- a/lib/perfdata/elasticsearchwriter.cpp +++ b/lib/perfdata/elasticsearchwriter.cpp @@ -494,7 +494,7 @@ void ElasticsearchWriter::SendRequest(const String& body) request.set(http::field::authorization, "Basic " + Base64::Encode(username + ":" + password)); request.body() = body; - request.set(http::field::content_length, request.body().size()); + request.content_length(request.body().size()); /* Don't log the request body to debug log, this is already done above. */ Log(LogDebug, "ElasticsearchWriter") diff --git a/lib/perfdata/influxdbwriter.cpp b/lib/perfdata/influxdbwriter.cpp index 1e02e5213..8e64c4c6a 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -504,7 +504,7 @@ void InfluxdbWriter::Flush() request.set(http::field::host, url->GetHost() + ":" + url->GetPort()); request.body() = body; - request.set(http::field::content_length, request.body().size()); + request.content_length(request.body().size()); try { if (stream.first) { diff --git a/lib/remote/configfileshandler.cpp b/lib/remote/configfileshandler.cpp index d714f4d86..6013d9722 100644 --- a/lib/remote/configfileshandler.cpp +++ b/lib/remote/configfileshandler.cpp @@ -84,7 +84,7 @@ bool ConfigFilesHandler::HandleRequest( response.result(http::status::ok); response.set(http::field::content_type, "application/octet-stream"); response.body() = content; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); } catch (const std::exception& ex) { HttpUtility::SendJsonError(response, params, 500, "Could not read file.", DiagnosticInformation(ex)); diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 3e0a4f27f..e32e6dc90 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -186,7 +186,7 @@ bool EnsureValidHeaders( } else { response.set(http::field::content_type, "text/html"); response.body() = String("

Bad Request

") + errorMsg + "

"; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); } response.set(http::field::connection, "close"); @@ -259,7 +259,7 @@ bool HandleAccessControl( response.set(http::field::access_control_allow_methods, "GET, POST, PUT, DELETE"); response.set(http::field::access_control_allow_headers, "Authorization, X-HTTP-Method-Override"); response.body() = "Preflight OK"; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); response.set(http::field::connection, "close"); boost::system::error_code ec; @@ -290,7 +290,7 @@ bool EnsureAcceptHeader( response.result(http::status::bad_request); response.set(http::field::content_type, "text/html"); response.body() = "

Accept header is missing or not set to 'application/json'.

"; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); response.set(http::field::connection, "close"); boost::system::error_code ec; @@ -331,7 +331,7 @@ bool EnsureAuthenticatedUser( } else { response.set(http::field::content_type, "text/html"); response.body() = "

Unauthorized. Please check your user credentials.

"; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); } boost::system::error_code ec; @@ -423,7 +423,7 @@ bool EnsureValidBody( } else { response.set(http::field::content_type, "text/html"); response.body() = String("

Bad Request

") + ec.message() + "

"; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); } response.set(http::field::connection, "close"); diff --git a/lib/remote/httputility.cpp b/lib/remote/httputility.cpp index 91902ba50..a2142e5d8 100644 --- a/lib/remote/httputility.cpp +++ b/lib/remote/httputility.cpp @@ -58,7 +58,7 @@ void HttpUtility::SendJsonBody(boost::beast::http::response& response, diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp index 18c18c0e0..80ebba77b 100644 --- a/lib/remote/infohandler.cpp +++ b/lib/remote/infohandler.cpp @@ -92,7 +92,7 @@ bool InfoHandler::HandleRequest( body += R"(

More information about API requests is available in the documentation.

)"; response.body() = body; - response.set(http::field::content_length, response.body().size()); + response.content_length(response.body().size()); } return true;