From 339b37a985b5f67ce5f0d2e02211d2c5b98a5d45 Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Tue, 22 Dec 2020 14:32:56 +0100 Subject: [PATCH 1/2] Use content_length method for setting the Content-Length header Boost.Beast changed the signature of the previously used generic `set` method so that it no longer accepts integer types, however there is alreay a more specific method for setting the Content-Length header, so use this one instead. --- lib/perfdata/elasticsearchwriter.cpp | 2 +- lib/perfdata/influxdbwriter.cpp | 2 +- lib/remote/configfileshandler.cpp | 2 +- lib/remote/httpserverconnection.cpp | 10 +++++----- lib/remote/httputility.cpp | 2 +- lib/remote/infohandler.cpp | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/perfdata/elasticsearchwriter.cpp b/lib/perfdata/elasticsearchwriter.cpp index 6870198e45c..9ab277f201f 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 5dbe785f887..3fd955bcf72 100644 --- a/lib/perfdata/influxdbwriter.cpp +++ b/lib/perfdata/influxdbwriter.cpp @@ -517,7 +517,7 @@ void InfluxdbWriter::Flush() } 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 d714f4d864a..6013d9722eb 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 182e2a51593..cb07557afeb 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, Content-Type, 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 91902ba501d..a2142e5d86f 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 18c18c0e04f..80ebba77be5 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; From eab07a7318f9e42157bc21d86585340d762759e7 Mon Sep 17 00:00:00 2001 From: Julian Brost Date: Tue, 22 Dec 2020 14:36:48 +0100 Subject: [PATCH 2/2] Provide a conversion function from icinga::String to boost::string_view Boost.Beast changed the signature of boost::beast::http::basic_fields::set in version 1.74 so that no longer allows passing an icinga::String instance as value. This adds a conversion function so that it works again. --- lib/base/string.cpp | 12 ++++++++++++ lib/base/string.hpp | 2 ++ 2 files changed, 14 insertions(+) diff --git a/lib/base/string.cpp b/lib/base/string.cpp index c4617e35785..eec5b8372d6 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 e9799e7ebc0..b9290eeee7c 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 @@ class String bool operator<(const String& rhs) const; operator const std::string&() const; + operator boost::string_view() const; const char *CStr() const;