userver: userver/server/handlers/handler_base.hpp Source File
Loading...
Searching...
No Matches
handler_base.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/server/handlers/handler_base.hpp
4/// @brief @copybrief server::handlers::HandlerBase
5
6#include <userver/components/component_base.hpp>
7#include <userver/server/handlers/exceptions.hpp>
8#include <userver/server/handlers/handler_config.hpp>
9#include <userver/server/http/http_request.hpp>
10#include <userver/server/request/request_context.hpp>
11
12USERVER_NAMESPACE_BEGIN
13
14namespace server::handlers {
15
16// clang-format off
17
18/// @brief Base class for the request handlers.
19///
20/// Each handler has an associated path and invoked only for the requests for
21/// that path.
22///
23/// ## Static options:
24/// Name | Description | Default value
25/// ---- | ----------- | -------------
26/// path | if a request matches this path wildcard then process it by handler | -
27/// as_fallback | set to "implicit-http-options" and do not specify a path if this handler processes the OPTIONS requests for paths that do not process OPTIONS method | -
28/// task_processor | a task processor to execute the requests | -
29/// method | comma-separated list of allowed HTTP methods. HEAD method is implicitly enabled if GET method is enabled | -
30/// max_request_size | max size of the whole request | 1024 * 1024
31/// max_headers_size | max request headers size | 65536
32/// parse_args_from_body | optional field to parse request according to x-www-form-urlencoded rules and make parameters accessible as query parameters | false
33/// auth | server::handlers::auth::HandlerAuthConfig authorization config | -
34/// url_trailing_slash | 'both' to treat URLs with and without a trailing slash as equal, 'strict-match' otherwise | 'both'
35/// max_requests_in_flight | integer to limit max pending requests to this handler | <no limit>
36/// request_body_size_log_limit | trim request to this size before logging | 512
37/// request_headers_size_log_limit | limit on the total length of logged headers | 512
38/// response_data_size_log_limit | trim responses to this size before logging | 512
39/// max_requests_per_second | integer to limit RPS to this handler | <no limit>
40/// decompress_request | allow decompression of the requests | true
41/// throttling_enabled | allow throttling of the requests by components::Server , for more info see its `max_response_size_in_flight` and `requests_queue_size_threshold` options | true
42/// set-response-server-hostname | set to true to add the `X-YaTaxi-Server-Hostname` header with instance name, set to false to not add the header | <takes the value from components::Server config>
43/// monitor-handler | Overrides the in-code `is_monitor` flag that makes the handler run either on `server.listener` or on `server.listener-monitor` | --
44/// set_tracing_headers | whether to set http tracing headers (X-YaTraceId, X-YaSpanId, X-RequestId) | true
45/// deadline_propagation_enabled | when `false`, disables HTTP handler @ref scripts/docs/en/userver/deadline_propagation.md "deadline propagation" | true
46/// deadline_expired_status_code | the HTTP status code to return if the request @ref scripts/docs/en/userver/deadline_propagation.md "deadline expires" | 498
47
48// clang-format on
50public:
51 HandlerBase(
52 const components::ComponentConfig& config,
53 const components::ComponentContext& component_context,
54 bool is_monitor = false
55 );
56 ~HandlerBase() noexcept override = default;
57
58 /// Parses request, executes processing routines, and fills response
59 /// accordingly. Does not throw.
60 virtual void PrepareAndHandleRequest(http::HttpRequest& request, request::RequestContext& context) const = 0;
61
62 /// Produces response to a request unrecognized by the protocol based on
63 /// provided generic response. Does not throw.
64 virtual void ReportMalformedRequest(http::HttpRequest&) const {}
65
66 /// Returns whether this is a monitoring handler.
67 bool IsMonitor() const { return is_monitor_; }
68
69 /// Returns handler config.
70 const HandlerConfig& GetConfig() const;
71
72 static yaml_config::Schema GetStaticConfigSchema();
73
74protected:
75 // Pull the type names in the handler's scope to shorten throwing code
76 using HandlerErrorCode = handlers::HandlerErrorCode;
77 using InternalMessage = handlers::InternalMessage;
78 using ExternalBody = handlers::ExternalBody;
79
80 using ClientError = handlers::ClientError;
81 using InternalServerError = handlers::InternalServerError;
82
83private:
84 bool is_monitor_;
85 HandlerConfig config_;
86};
87
88} // namespace server::handlers
89
90USERVER_NAMESPACE_END