10#include <userver/engine/task/task_processor_fwd.hpp>
12#include <userver/engine/io/sockaddr.hpp>
13#include <userver/server/http/form_data_arg.hpp>
14#include <userver/server/http/http_method.hpp>
15#include <userver/server/http/http_response.hpp>
16#include <userver/utils/datetime/wall_coarse_clock.hpp>
17#include <userver/utils/impl/internal_tag.hpp>
18#include <userver/utils/impl/transparent_hash.hpp>
19#include <userver/utils/str_icase.hpp>
21USERVER_NAMESPACE_BEGIN
23namespace server::handlers {
24class HttpRequestStatistics;
34class HttpRequest
final {
36 using HeadersMap = USERVER_NAMESPACE::
http::
headers::HeaderMap;
38 using HeadersMapKeys =
decltype(
utils::impl::MakeKeysView(HeadersMap
()));
40 using CookiesMap = std::unordered_map<std::string, std::string,
utils::
StrCaseHash>;
42 using CookiesMapKeys =
decltype(
utils::impl::MakeKeysView(CookiesMap()));
45 explicit HttpRequest(
request::ResponseDataAccounter& data_accounter,
utils::impl::InternalTag);
48 HttpRequest(HttpRequest&&) =
delete;
49 HttpRequest(
const HttpRequest&) =
delete;
75 std::chrono::duration<
double> GetRequestTime()
const;
77 std::chrono::duration<
double> GetResponseTime()
const;
94 const std::string&
GetArg(std::string_view arg_name)
const;
104 const std::vector<std::string>&
GetArgVector(std::string_view arg_name)
const;
113 bool HasArg(std::string_view arg_name)
const;
147 const std::string&
GetPathArg(std::string_view arg_name)
const;
166 const std::string&
GetHeader(std::string_view header_name)
const;
195 const std::string&
GetCookie(
const std::string& cookie_name)
const;
217 void SetRequestBody(std::string body);
218 void ParseArgsFromBody();
219 bool IsFinal()
const;
232 HttpResponse& GetHttpResponse()
const;
238 void MarkAsInternalServerError()
const;
240 void SetStartSendResponseTime();
241 void SetFinishSendResponseTime();
243 void WriteAccessLogs(
244 const logging::TextLoggerPtr& logger_access,
245 const logging::TextLoggerPtr& logger_access_tskv,
246 const std::string& remote_address
250 const logging::TextLoggerPtr& logger_access,
252 const std::string& remote_address
255 void WriteAccessTskvLog(
256 const logging::TextLoggerPtr& logger_access_tskv,
258 const std::string& remote_address
261 using UpgradeCallback = std::function<
void(std::unique_ptr<engine::
io::RwBase>&&, engine::
io::Sockaddr&&)>;
263 bool IsUpgradeWebsocket()
const;
264 void SetUpgradeWebsocket(UpgradeCallback cb)
const;
265 void DoUpgrade(std::unique_ptr<engine::
io::RwBase>&& socket, engine::
io::Sockaddr&& peer_name)
const;
269 void AccountResponseTime();
271 void SetPathArgs(std::vector<std::pair<std::string, std::string>> args);
276 void SetTaskProcessor(engine::TaskProcessor& task_processor);
277 engine::TaskProcessor* GetTaskProcessor()
const;
279 void SetHttpHandlerStatistics(handlers::HttpRequestStatistics&);
282 void SetResponseStreamId(std::int32_t);
283 void SetStreamProducer(impl::Http2StreamEventProducer&& producer);
285 void SetTaskCreateTime();
286 void SetTaskStartTime();
287 void SetResponseNotifyTime();
288 void SetResponseNotifyTime(std::chrono::steady_clock::time_point now);
290 friend class HttpRequestBuilder;
291 friend class HttpRequestHandler;
294 utils::FastPimpl<Impl, 1648, 16> pimpl_;