|
11 | 11 | #include <userver/server/http/http_request.hpp> |
12 | 12 |
|
13 | 13 | #include <userver/components/component.hpp> |
| 14 | +#include <userver/components/scope.hpp> |
14 | 15 | #include <userver/components/statistics_storage.hpp> |
15 | 16 | #include <userver/dynamic_config/storage/component.hpp> |
16 | 17 | #include <userver/engine/deadline.hpp> |
@@ -144,17 +145,26 @@ HttpHandlerBase::HttpHandlerBase( |
144 | 145 | LOG_WARNING() << "empty allowed methods list in " << config.Name(); |
145 | 146 | } |
146 | 147 |
|
147 | | - auto& server_component = context.FindComponent<components::Server>(); |
| 148 | + auto& server = context.FindComponent<components::Server>().GetServer(); |
148 | 149 |
|
149 | 150 | engine::TaskProcessor& task_processor = |
150 | 151 | GetConfig().task_processor |
151 | 152 | ? context.GetTaskProcessor(*GetConfig().task_processor) |
152 | 153 | : engine::current_task::GetTaskProcessor(); |
153 | | - try { |
154 | | - server_component.AddHandler(*this, task_processor); |
155 | | - } catch (const std::exception& ex) { |
156 | | - throw std::runtime_error(std::string("can't add handler to server: ") + ex.what()); |
157 | | - } |
| 154 | + |
| 155 | + // Postpone handler registration as a request handling requires |
| 156 | + // HandleRequest() implementation, which is available only after |
| 157 | + // the descendant constructor. |
| 158 | + context.RegisterScope(components::MakeScope([this, &server, &task_processor] { |
| 159 | + try { |
| 160 | + server.AddHandler(*this, task_processor); |
| 161 | + |
| 162 | + // Note: no need to call RemoveHandler on scope exit, |
| 163 | + // PortInfo::Stop() automatically removes all handlers |
| 164 | + } catch (const std::exception& ex) { |
| 165 | + throw std::runtime_error(std::string("can't add handler to server: ") + ex.what()); |
| 166 | + } |
| 167 | + })); |
158 | 168 |
|
159 | 169 | BuildMiddlewarePipeline(config, context); |
160 | 170 |
|
@@ -188,9 +198,7 @@ HttpHandlerBase::HttpHandlerBase( |
188 | 198 | } |
189 | 199 |
|
190 | 200 | set_response_server_hostname_ = |
191 | | - GetConfig() |
192 | | - .set_response_server_hostname.value_or(server_component.GetServer().GetConfig().set_response_server_hostname |
193 | | - ); |
| 201 | + GetConfig().set_response_server_hostname.value_or(server.GetConfig().set_response_server_hostname); |
194 | 202 | } |
195 | 203 |
|
196 | 204 | HttpHandlerBase::~HttpHandlerBase() { statistics_holder_.Unregister(); } |
|
0 commit comments