Skip to content

Commit 87df80d

Browse files
authored
Merge pull request #10516 from Icinga/http-handlers-stream-refactor
Refactor HTTP connection handling and some handlers to stream responses
2 parents 0c2fd00 + 7373f36 commit 87df80d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+2302
-610
lines changed

lib/remote/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ set(remote_SOURCES
2727
eventshandler.cpp eventshandler.hpp
2828
filterutility.cpp filterutility.hpp
2929
httphandler.cpp httphandler.hpp
30+
httpmessage.cpp httpmessage.hpp
3031
httpserverconnection.cpp httpserverconnection.hpp
3132
httputility.cpp httputility.hpp
3233
infohandler.cpp infohandler.hpp

lib/remote/actionshandler.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,15 @@ REGISTER_URLHANDLER("/v1/actions", ActionsHandler);
1717

1818
bool ActionsHandler::HandleRequest(
1919
const WaitGroup::Ptr& waitGroup,
20-
AsioTlsStream& stream,
21-
const ApiUser::Ptr& user,
22-
boost::beast::http::request<boost::beast::http::string_body>& request,
23-
const Url::Ptr& url,
24-
boost::beast::http::response<boost::beast::http::string_body>& response,
25-
const Dictionary::Ptr& params,
26-
boost::asio::yield_context& yc,
27-
HttpServerConnection& server
20+
const HttpRequest& request,
21+
HttpResponse& response,
22+
boost::asio::yield_context& yc
2823
)
2924
{
3025
namespace http = boost::beast::http;
26+
auto url = request.Url();
27+
auto user = request.User();
28+
auto params = request.Params();
3129

3230
if (url->GetPath().size() != 3)
3331
return false;

lib/remote/actionshandler.hpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,9 @@ class ActionsHandler final : public HttpHandler
1717

1818
bool HandleRequest(
1919
const WaitGroup::Ptr& waitGroup,
20-
AsioTlsStream& stream,
21-
const ApiUser::Ptr& user,
22-
boost::beast::http::request<boost::beast::http::string_body>& request,
23-
const Url::Ptr& url,
24-
boost::beast::http::response<boost::beast::http::string_body>& response,
25-
const Dictionary::Ptr& params,
26-
boost::asio::yield_context& yc,
27-
HttpServerConnection& server
20+
const HttpRequest& request,
21+
HttpResponse& response,
22+
boost::asio::yield_context& yc
2823
) override;
2924
};
3025

lib/remote/apilistener.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,12 +162,12 @@ class ApiListener final : public ObjectImpl<ApiListener>
162162
return m_WaitGroup;
163163
}
164164

165-
protected:
166165
void OnConfigLoaded() override;
167166
void OnAllConfigLoaded() override;
168167
void Start(bool runtimeCreated) override;
169168
void Stop(bool runtimeDeleted) override;
170169

170+
protected:
171171
void ValidateTlsProtocolmin(const Lazy<String>& lvalue, const ValidationUtils& utils) override;
172172
void ValidateTlsHandshakeTimeout(const Lazy<double>& lvalue, const ValidationUtils& utils) override;
173173

lib/remote/configfileshandler.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,17 @@ REGISTER_URLHANDLER("/v1/config/files", ConfigFilesHandler);
1515

1616
bool ConfigFilesHandler::HandleRequest(
1717
const WaitGroup::Ptr&,
18-
AsioTlsStream& stream,
19-
const ApiUser::Ptr& user,
20-
boost::beast::http::request<boost::beast::http::string_body>& request,
21-
const Url::Ptr& url,
22-
boost::beast::http::response<boost::beast::http::string_body>& response,
23-
const Dictionary::Ptr& params,
24-
boost::asio::yield_context& yc,
25-
HttpServerConnection& server
18+
const HttpRequest& request,
19+
HttpResponse& response,
20+
boost::asio::yield_context& yc
2621
)
2722
{
2823
namespace http = boost::beast::http;
2924

25+
auto url = request.Url();
26+
auto user = request.User();
27+
auto params = request.Params();
28+
3029
if (request.method() != http::verb::get)
3130
return false;
3231

@@ -78,14 +77,9 @@ bool ConfigFilesHandler::HandleRequest(
7877
}
7978

8079
try {
81-
std::ifstream fp(path.CStr(), std::ifstream::in | std::ifstream::binary);
82-
fp.exceptions(std::ifstream::badbit);
83-
84-
String content((std::istreambuf_iterator<char>(fp)), std::istreambuf_iterator<char>());
8580
response.result(http::status::ok);
8681
response.set(http::field::content_type, "application/octet-stream");
87-
response.body() = content;
88-
response.content_length(response.body().size());
82+
response.SendFile(path, yc);
8983
} catch (const std::exception& ex) {
9084
HttpUtility::SendJsonError(response, params, 500, "Could not read file.",
9185
DiagnosticInformation(ex));

lib/remote/configfileshandler.hpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,9 @@ class ConfigFilesHandler final : public HttpHandler
1515

1616
bool HandleRequest(
1717
const WaitGroup::Ptr& waitGroup,
18-
AsioTlsStream& stream,
19-
const ApiUser::Ptr& user,
20-
boost::beast::http::request<boost::beast::http::string_body>& request,
21-
const Url::Ptr& url,
22-
boost::beast::http::response<boost::beast::http::string_body>& response,
23-
const Dictionary::Ptr& params,
24-
boost::asio::yield_context& yc,
25-
HttpServerConnection& server
18+
const HttpRequest& request,
19+
HttpResponse& response,
20+
boost::asio::yield_context& yc
2621
) override;
2722
};
2823

lib/remote/configpackageshandler.cpp

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,40 @@ REGISTER_URLHANDLER("/v1/config/packages", ConfigPackagesHandler);
1313

1414
bool ConfigPackagesHandler::HandleRequest(
1515
const WaitGroup::Ptr&,
16-
AsioTlsStream& stream,
17-
const ApiUser::Ptr& user,
18-
boost::beast::http::request<boost::beast::http::string_body>& request,
19-
const Url::Ptr& url,
20-
boost::beast::http::response<boost::beast::http::string_body>& response,
21-
const Dictionary::Ptr& params,
22-
boost::asio::yield_context& yc,
23-
HttpServerConnection& server
16+
const HttpRequest& request,
17+
HttpResponse& response,
18+
boost::asio::yield_context& yc
2419
)
2520
{
2621
namespace http = boost::beast::http;
2722

23+
auto url = request.Url();
24+
auto user = request.User();
25+
auto params = request.Params();
26+
2827
if (url->GetPath().size() > 4)
2928
return false;
3029

3130
if (request.method() == http::verb::get)
32-
HandleGet(user, request, url, response, params);
31+
HandleGet(request, response);
3332
else if (request.method() == http::verb::post)
34-
HandlePost(user, request, url, response, params);
33+
HandlePost(request, response);
3534
else if (request.method() == http::verb::delete_)
36-
HandleDelete(user, request, url, response, params);
35+
HandleDelete(request, response);
3736
else
3837
return false;
3938

4039
return true;
4140
}
4241

43-
void ConfigPackagesHandler::HandleGet(
44-
const ApiUser::Ptr& user,
45-
boost::beast::http::request<boost::beast::http::string_body>& request,
46-
const Url::Ptr& url,
47-
boost::beast::http::response<boost::beast::http::string_body>& response,
48-
const Dictionary::Ptr& params
49-
)
42+
void ConfigPackagesHandler::HandleGet(const HttpRequest& request, HttpResponse& response)
5043
{
5144
namespace http = boost::beast::http;
5245

46+
auto url = request.Url();
47+
auto user = request.User();
48+
auto params = request.Params();
49+
5350
FilterUtility::CheckPermission(user, "config/query");
5451

5552
std::vector<String> packages;
@@ -90,16 +87,14 @@ void ConfigPackagesHandler::HandleGet(
9087
HttpUtility::SendJsonBody(response, params, result);
9188
}
9289

93-
void ConfigPackagesHandler::HandlePost(
94-
const ApiUser::Ptr& user,
95-
boost::beast::http::request<boost::beast::http::string_body>& request,
96-
const Url::Ptr& url,
97-
boost::beast::http::response<boost::beast::http::string_body>& response,
98-
const Dictionary::Ptr& params
99-
)
90+
void ConfigPackagesHandler::HandlePost(const HttpRequest& request, HttpResponse& response)
10091
{
10192
namespace http = boost::beast::http;
10293

94+
auto url = request.Url();
95+
auto user = request.User();
96+
auto params = request.Params();
97+
10398
FilterUtility::CheckPermission(user, "config/modify");
10499

105100
if (url->GetPath().size() >= 4)
@@ -142,16 +137,14 @@ void ConfigPackagesHandler::HandlePost(
142137
HttpUtility::SendJsonBody(response, params, result);
143138
}
144139

145-
void ConfigPackagesHandler::HandleDelete(
146-
const ApiUser::Ptr& user,
147-
boost::beast::http::request<boost::beast::http::string_body>& request,
148-
const Url::Ptr& url,
149-
boost::beast::http::response<boost::beast::http::string_body>& response,
150-
const Dictionary::Ptr& params
151-
)
140+
void ConfigPackagesHandler::HandleDelete(const HttpRequest& request, HttpResponse& response)
152141
{
153142
namespace http = boost::beast::http;
154143

144+
auto url = request.Url();
145+
auto user = request.User();
146+
auto params = request.Params();
147+
155148
FilterUtility::CheckPermission(user, "config/modify");
156149

157150
if (url->GetPath().size() >= 4)

lib/remote/configpackageshandler.hpp

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,38 +15,15 @@ class ConfigPackagesHandler final : public HttpHandler
1515

1616
bool HandleRequest(
1717
const WaitGroup::Ptr& waitGroup,
18-
AsioTlsStream& stream,
19-
const ApiUser::Ptr& user,
20-
boost::beast::http::request<boost::beast::http::string_body>& request,
21-
const Url::Ptr& url,
22-
boost::beast::http::response<boost::beast::http::string_body>& response,
23-
const Dictionary::Ptr& params,
24-
boost::asio::yield_context& yc,
25-
HttpServerConnection& server
18+
const HttpRequest& request,
19+
HttpResponse& response,
20+
boost::asio::yield_context& yc
2621
) override;
2722

2823
private:
29-
void HandleGet(
30-
const ApiUser::Ptr& user,
31-
boost::beast::http::request<boost::beast::http::string_body>& request,
32-
const Url::Ptr& url,
33-
boost::beast::http::response<boost::beast::http::string_body>& response,
34-
const Dictionary::Ptr& params
35-
);
36-
void HandlePost(
37-
const ApiUser::Ptr& user,
38-
boost::beast::http::request<boost::beast::http::string_body>& request,
39-
const Url::Ptr& url,
40-
boost::beast::http::response<boost::beast::http::string_body>& response,
41-
const Dictionary::Ptr& params
42-
);
43-
void HandleDelete(
44-
const ApiUser::Ptr& user,
45-
boost::beast::http::request<boost::beast::http::string_body>& request,
46-
const Url::Ptr& url,
47-
boost::beast::http::response<boost::beast::http::string_body>& response,
48-
const Dictionary::Ptr& params
49-
);
24+
void HandleGet(const HttpRequest& request, HttpResponse& response);
25+
void HandlePost(const HttpRequest& request, HttpResponse& response);
26+
void HandleDelete(const HttpRequest& request, HttpResponse& response);
5027

5128
};
5229

lib/remote/configstageshandler.cpp

Lines changed: 25 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -20,43 +20,40 @@ static std::mutex l_RunningPackageUpdatesMutex; // Protects the above two variab
2020

2121
bool ConfigStagesHandler::HandleRequest(
2222
const WaitGroup::Ptr&,
23-
AsioTlsStream& stream,
24-
const ApiUser::Ptr& user,
25-
boost::beast::http::request<boost::beast::http::string_body>& request,
26-
const Url::Ptr& url,
27-
boost::beast::http::response<boost::beast::http::string_body>& response,
28-
const Dictionary::Ptr& params,
29-
boost::asio::yield_context& yc,
30-
HttpServerConnection& server
23+
const HttpRequest& request,
24+
HttpResponse& response,
25+
boost::asio::yield_context& yc
3126
)
3227
{
3328
namespace http = boost::beast::http;
3429

30+
auto url = request.Url();
31+
auto user = request.User();
32+
auto params = request.Params();
33+
3534
if (url->GetPath().size() > 5)
3635
return false;
3736

3837
if (request.method() == http::verb::get)
39-
HandleGet(user, request, url, response, params);
38+
HandleGet(request, response);
4039
else if (request.method() == http::verb::post)
41-
HandlePost(user, request, url, response, params);
40+
HandlePost(request, response);
4241
else if (request.method() == http::verb::delete_)
43-
HandleDelete(user, request, url, response, params);
42+
HandleDelete(request, response);
4443
else
4544
return false;
4645

4746
return true;
4847
}
4948

50-
void ConfigStagesHandler::HandleGet(
51-
const ApiUser::Ptr& user,
52-
boost::beast::http::request<boost::beast::http::string_body>& request,
53-
const Url::Ptr& url,
54-
boost::beast::http::response<boost::beast::http::string_body>& response,
55-
const Dictionary::Ptr& params
56-
)
49+
void ConfigStagesHandler::HandleGet(const HttpRequest& request, HttpResponse& response)
5750
{
5851
namespace http = boost::beast::http;
5952

53+
auto url = request.Url();
54+
auto user = request.User();
55+
auto params = request.Params();
56+
6057
FilterUtility::CheckPermission(user, "config/query");
6158

6259
if (url->GetPath().size() >= 4)
@@ -95,16 +92,14 @@ void ConfigStagesHandler::HandleGet(
9592
HttpUtility::SendJsonBody(response, params, result);
9693
}
9794

98-
void ConfigStagesHandler::HandlePost(
99-
const ApiUser::Ptr& user,
100-
boost::beast::http::request<boost::beast::http::string_body>& request,
101-
const Url::Ptr& url,
102-
boost::beast::http::response<boost::beast::http::string_body>& response,
103-
const Dictionary::Ptr& params
104-
)
95+
void ConfigStagesHandler::HandlePost(const HttpRequest& request, HttpResponse& response)
10596
{
10697
namespace http = boost::beast::http;
10798

99+
auto url = request.Url();
100+
auto user = request.User();
101+
auto params = request.Params();
102+
108103
FilterUtility::CheckPermission(user, "config/modify");
109104

110105
if (url->GetPath().size() >= 4)
@@ -208,16 +203,14 @@ void ConfigStagesHandler::HandlePost(
208203
HttpUtility::SendJsonBody(response, params, result);
209204
}
210205

211-
void ConfigStagesHandler::HandleDelete(
212-
const ApiUser::Ptr& user,
213-
boost::beast::http::request<boost::beast::http::string_body>& request,
214-
const Url::Ptr& url,
215-
boost::beast::http::response<boost::beast::http::string_body>& response,
216-
const Dictionary::Ptr& params
217-
)
206+
void ConfigStagesHandler::HandleDelete(const HttpRequest& request, HttpResponse& response)
218207
{
219208
namespace http = boost::beast::http;
220209

210+
auto url = request.Url();
211+
auto user = request.User();
212+
auto params = request.Params();
213+
221214
FilterUtility::CheckPermission(user, "config/modify");
222215

223216
if (url->GetPath().size() >= 4)

0 commit comments

Comments
 (0)