9#include <userver/formats/parse/to.hpp>
10#include <userver/http/common_headers.hpp>
11#include <userver/server/http/http_method.hpp>
12#include <userver/server/middlewares/builtin.hpp>
13#include <userver/server/middlewares/http_middleware_base.hpp>
14#include <userver/yaml_config/schema.hpp>
16USERVER_NAMESPACE_BEGIN
18namespace server::middlewares {
34 ToString(http::HttpMethod::kGet),
35 ToString(http::HttpMethod::kPost),
36 ToString(http::HttpMethod::kPut),
37 ToString(http::HttpMethod::kPatch),
38 ToString(http::HttpMethod::kDelete),
39 ToString(http::HttpMethod::kHead),
40 ToString(http::HttpMethod::kOptions),
45 std::string(USERVER_NAMESPACE::http::headers::kAccept),
46 std::string(USERVER_NAMESPACE::http::headers::kAcceptLanguage),
47 std::string(USERVER_NAMESPACE::http::headers::kContentLanguage),
48 std::string(USERVER_NAMESPACE::http::headers::kContentType),
58 std::chrono::seconds
max_age{std::chrono::hours(24)};
61 explicit Cors(
const Config& config);
64 void HandleRequest(http::HttpRequest& request, request::RequestContext& context)
const override;
66 bool IsPreflightRequest(
const http::HttpRequest& request)
const;
67 void HandlePreflightRequest(http::HttpRequest& request)
const;
68 void AddCorsHeaders(http::HttpRequest& request,
const std::string& origin)
const;
69 bool IsOriginAllowed(
const std::string& origin)
const;
70 const std::string& GetOriginHeader(
const http::HttpRequest& request)
const;
95 static constexpr std::string_view
kName =
"cors-middleware";
97 CorsFactory(
const components::ComponentConfig&,
const components::ComponentContext&);
99 static yaml_config::Schema GetStaticConfigSchema();
105 const handlers::HttpHandlerBase& handler,
106 yaml_config::YamlConfig middleware_config
109 const yaml_config::YamlConfig global_config_;
118inline constexpr bool components::kHasValidate<server::middlewares::CorsFactory> =
true;
121inline constexpr auto components::kConfigFileMode<server::middlewares::CorsFactory> = ConfigFileMode::kRequired;