1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
From 339b37a985b5f67ce5f0d2e02211d2c5b98a5d45 Mon Sep 17 00:00:00 2001
From: Julian Brost <julian.brost@icinga.com>
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 6870198e45..9ab277f201 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 5dbe785f88..3fd955bcf7 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 d714f4d864..6013d9722e 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 182e2a5159..cb07557afe 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("<h1>Bad Request</h1><p><pre>") + errorMsg + "</pre></p>";
- 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() = "<h1>Accept header is missing or not set to 'application/json'.</h1>";
- 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() = "<h1>Unauthorized. Please check your user credentials.</h1>";
- 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("<h1>Bad Request</h1><p><pre>") + ec.message() + "</pre></p>";
- 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 91902ba501..a2142e5d86 100644
--- a/lib/remote/httputility.cpp
+++ b/lib/remote/httputility.cpp
@@ -58,7 +58,7 @@ void HttpUtility::SendJsonBody(boost::beast::http::response<boost::beast::http::
response.set(http::field::content_type, "application/json");
response.body() = JsonEncode(val, params && GetLastParameter(params, "pretty"));
- response.set(http::field::content_length, response.body().size());
+ response.content_length(response.body().size());
}
void HttpUtility::SendJsonError(boost::beast::http::response<boost::beast::http::string_body>& response,
diff --git a/lib/remote/infohandler.cpp b/lib/remote/infohandler.cpp
index 18c18c0e04..80ebba77be 100644
--- a/lib/remote/infohandler.cpp
+++ b/lib/remote/infohandler.cpp
@@ -92,7 +92,7 @@ bool InfoHandler::HandleRequest(
body += R"(<p>More information about API requests is available in the <a href="https://icinga.com/docs/icinga2/latest/" target="_blank">documentation</a>.</p></html>)";
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 <julian.brost@icinga.com>
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 c4617e3578..eec5b8372d 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 e9799e7ebc..b9290eeee7 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 <boost/range/iterator.hpp>
+#include <boost/utility/string_view.hpp>
#include <string>
#include <iosfwd>
@@ -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;
|