Skip to content

Commit 332dcb5

Browse files
author
lexeyo
committed
feat core/server/http: move graceful shutdown headers logic to a middleware
commit_hash:57e00cc1af404005d3e732ec8778c6fa3e539ed2
1 parent 4f3225d commit 332dcb5

File tree

7 files changed

+103
-14
lines changed

7 files changed

+103
-14
lines changed

.mapping.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1970,6 +1970,8 @@
19701970
"core/src/server/middlewares/decompression.hpp":"taxi/uservices/userver/core/src/server/middlewares/decompression.hpp",
19711971
"core/src/server/middlewares/exceptions_handling.cpp":"taxi/uservices/userver/core/src/server/middlewares/exceptions_handling.cpp",
19721972
"core/src/server/middlewares/exceptions_handling.hpp":"taxi/uservices/userver/core/src/server/middlewares/exceptions_handling.hpp",
1973+
"core/src/server/middlewares/graceful_shutdown_headers.cpp":"taxi/uservices/userver/core/src/server/middlewares/graceful_shutdown_headers.cpp",
1974+
"core/src/server/middlewares/graceful_shutdown_headers.hpp":"taxi/uservices/userver/core/src/server/middlewares/graceful_shutdown_headers.hpp",
19731975
"core/src/server/middlewares/handler_adapter.cpp":"taxi/uservices/userver/core/src/server/middlewares/handler_adapter.cpp",
19741976
"core/src/server/middlewares/handler_adapter.hpp":"taxi/uservices/userver/core/src/server/middlewares/handler_adapter.hpp",
19751977
"core/src/server/middlewares/handler_metrics.cpp":"taxi/uservices/userver/core/src/server/middlewares/handler_metrics.cpp",

core/include/userver/server/middlewares/builtin.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ inline constexpr std::string_view kBaggage = "userver-baggage-middleware";
2020
inline constexpr std::string_view kAuth = "userver-auth-middleware";
2121
inline constexpr std::string_view kDecompression = "userver-decompression-middleware";
2222
inline constexpr std::string_view kExceptionsHandling = "userver-exceptions-handling-middleware";
23+
inline constexpr std::string_view kGracefulShutdownHeaders = "userver-graceful-shutdown-headers";
2324

2425
} // namespace server::middlewares::builtin
2526

core/src/server/http/http_request_handler.cpp

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include <userver/server/request/task_inherited_request.hpp>
2020
#include <userver/utils/assert.hpp>
2121

22-
#include <dynamic_config/variables/GRACEFUL_SHUTDOWN_HEADERS.hpp>
2322
#include <dynamic_config/variables/USERVER_RPS_CCONTROL_CUSTOM_STATUS.hpp>
2423

2524
USERVER_NAMESPACE_BEGIN
@@ -33,8 +32,7 @@ HttpRequestHandler::HttpRequestHandler(
3332
bool is_monitor,
3433
std::string server_name
3534
)
36-
: components_state_(component_context),
37-
is_monitor_(is_monitor),
35+
: is_monitor_(is_monitor),
3836
server_name_(std::move(server_name)),
3937
rate_limit_(utils::TokenBucket::MakeUnbounded()),
4038
metrics_(component_context.FindComponent<components::StatisticsStorage>().GetMetricsStorage()),
@@ -81,15 +79,6 @@ engine::TaskWithResult<void> HttpRequestHandler::StartRequestTask(std::shared_pt
8179
) const {
8280
auto& http_response = http_request->GetHttpResponse();
8381
http_response.SetHeader(USERVER_NAMESPACE::http::headers::kServer, server_name_);
84-
if (components_state_.GetServiceLifetimeStage() == components::ServiceLifetimeStage::kGracefulShutdown) {
85-
const auto config = config_source_.GetSnapshot();
86-
auto config_var = config[::dynamic_config::GRACEFUL_SHUTDOWN_HEADERS];
87-
if (config_var.enabled) {
88-
for (const auto& [name, values] : config_var.headers.extra) {
89-
http_response.SetHeader(name, fmt::to_string(fmt::join(values, ", ")));
90-
}
91-
}
92-
}
9382
if (http_response.IsReady()) {
9483
// Request is broken somehow, user handler must not be called
9584
http_request->SetTaskCreateTime();

core/src/server/http/http_request_handler.hpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
#include <server/http/request_handler_base.hpp>
66
#include <userver/components/component_context.hpp>
7-
#include <userver/components/state.hpp>
87
#include <userver/engine/mutex.hpp>
98
#include <userver/engine/task/task_processor_fwd.hpp>
109
#include <userver/engine/task/task_with_result.hpp>
@@ -54,7 +53,6 @@ class HttpRequestHandler final : public RequestHandlerBase {
5453

5554
HandlerInfoIndex handler_info_index_;
5655

57-
const components::State components_state_;
5856
const bool is_monitor_;
5957
const std::string server_name_;
6058
NewRequestHook new_request_hook_;

core/src/server/middlewares/configuration.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <server/middlewares/deadline_propagation.hpp>
1212
#include <server/middlewares/decompression.hpp>
1313
#include <server/middlewares/exceptions_handling.hpp>
14+
#include <server/middlewares/graceful_shutdown_headers.hpp>
1415
#include <server/middlewares/handler_adapter.hpp>
1516
#include <server/middlewares/handler_metrics.hpp>
1617
#include <server/middlewares/rate_limit.hpp>
@@ -37,6 +38,7 @@ MiddlewaresList DefaultPipeline() {
3738

3839
// Setting headers middlewares should be before terminating middlewares to set headers for errors
3940
std::string{builtin::kTracing},
41+
std::string{builtin::kGracefulShutdownHeaders},
4042
std::string{builtin::kSetAcceptEncoding},
4143

4244
// Should be self-explanatory
@@ -73,6 +75,7 @@ components::ComponentList DefaultMiddlewareComponents() {
7375
.Append<SetAcceptEncodingFactory>()
7476
.Append<ExceptionsHandlingFactory>()
7577
.Append<UnknownExceptionsHandlingFactory>()
78+
.Append<GracefulShutdownHeadersFactory>()
7679
.Append<testsuite::ExceptionsHandlingMiddlewareFactory>();
7780
}
7881

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include <server/middlewares/graceful_shutdown_headers.hpp>
2+
3+
#include <dynamic_config/variables/GRACEFUL_SHUTDOWN_HEADERS.hpp>
4+
5+
#include <server/request/internal_request_context.hpp>
6+
#include <userver/components/component_config.hpp>
7+
#include <userver/components/component_context.hpp>
8+
#include <userver/server/http/http_request.hpp>
9+
#include <userver/server/request/request_context.hpp>
10+
11+
USERVER_NAMESPACE_BEGIN
12+
13+
namespace server::middlewares {
14+
15+
GracefulShutdownHeaders::GracefulShutdownHeaders(const handlers::HttpHandlerBase&, const components::State& state)
16+
: HttpMiddlewareBase(),
17+
state_(state)
18+
{}
19+
20+
void GracefulShutdownHeaders::HandleRequest(http::HttpRequest& request, request::RequestContext& context) const {
21+
if (state_.GetServiceLifetimeStage() == components::ServiceLifetimeStage::kGracefulShutdown) {
22+
const auto config = context.GetInternalContext().GetConfigSnapshot();
23+
auto graceful_shutdown_headers = config[::dynamic_config::GRACEFUL_SHUTDOWN_HEADERS];
24+
if (graceful_shutdown_headers.enabled) {
25+
auto& response = request.GetHttpResponse();
26+
for (const auto& [name, values] : graceful_shutdown_headers.headers.extra) {
27+
response.SetHeader(name, fmt::to_string(fmt::join(values, ", ")));
28+
}
29+
}
30+
}
31+
32+
Next(request, context);
33+
}
34+
35+
GracefulShutdownHeadersFactory::GracefulShutdownHeadersFactory(
36+
const components::ComponentConfig& config,
37+
const components::ComponentContext& context
38+
)
39+
: HttpMiddlewareFactoryBase(config, context),
40+
state_(context)
41+
{}
42+
43+
std::unique_ptr<HttpMiddlewareBase> GracefulShutdownHeadersFactory::Create(
44+
const handlers::HttpHandlerBase& handler,
45+
yaml_config::YamlConfig
46+
) const {
47+
return std::make_unique<GracefulShutdownHeaders>(handler, state_);
48+
}
49+
50+
} // namespace server::middlewares
51+
52+
USERVER_NAMESPACE_END
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#pragma once
2+
3+
#include <userver/components/state.hpp>
4+
#include <userver/server/middlewares/builtin.hpp>
5+
#include <userver/server/middlewares/http_middleware_base.hpp>
6+
USERVER_NAMESPACE_BEGIN
7+
8+
namespace server::middlewares {
9+
10+
class GracefulShutdownHeaders final : public HttpMiddlewareBase {
11+
public:
12+
explicit GracefulShutdownHeaders(const handlers::HttpHandlerBase&, const components::State& state);
13+
14+
private:
15+
void HandleRequest(http::HttpRequest& request, request::RequestContext& context) const override;
16+
17+
const components::State state_;
18+
};
19+
20+
class GracefulShutdownHeadersFactory final : public HttpMiddlewareFactoryBase {
21+
public:
22+
static constexpr std::string_view kName = builtin::kGracefulShutdownHeaders;
23+
24+
GracefulShutdownHeadersFactory(const components::ComponentConfig&, const components::ComponentContext& context);
25+
26+
private:
27+
std::unique_ptr<HttpMiddlewareBase> Create(
28+
const handlers::HttpHandlerBase&,
29+
yaml_config::YamlConfig middleware_config
30+
) const override;
31+
32+
const components::State state_;
33+
};
34+
35+
} // namespace server::middlewares
36+
37+
template <>
38+
inline constexpr bool components::kHasValidate<server::middlewares::GracefulShutdownHeadersFactory> = true;
39+
40+
template <>
41+
inline constexpr auto
42+
components::kConfigFileMode<server::middlewares::GracefulShutdownHeadersFactory> = ConfigFileMode::kNotRequired;
43+
44+
USERVER_NAMESPACE_END

0 commit comments

Comments
 (0)