/proc/self/cwd/source/common/http/matching/inputs.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include "envoy/http/filter.h" |
4 | | #include "envoy/matcher/matcher.h" |
5 | | #include "envoy/server/factory_context.h" |
6 | | #include "envoy/type/matcher/v3/http_inputs.pb.h" |
7 | | #include "envoy/type/matcher/v3/http_inputs.pb.validate.h" |
8 | | |
9 | | #include "source/common/http/header_utility.h" |
10 | | #include "source/common/http/utility.h" |
11 | | |
12 | | namespace Envoy { |
13 | | namespace Http { |
14 | | namespace Matching { |
15 | | /** |
16 | | * Common base class for all the header/trailer DataInputs. |
17 | | */ |
18 | | template <class HeaderType> |
19 | | class HttpHeadersDataInputBase : public Matcher::DataInput<HttpMatchingData> { |
20 | | public: |
21 | 27.9k | explicit HttpHeadersDataInputBase(const std::string& name) : name_(name) {} Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::RequestHeaderMap>::HttpHeadersDataInputBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 21 | 18.5k | explicit HttpHeadersDataInputBase(const std::string& name) : name_(name) {} |
Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::ResponseHeaderMap>::HttpHeadersDataInputBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 21 | 4.64k | explicit HttpHeadersDataInputBase(const std::string& name) : name_(name) {} |
Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::RequestTrailerMap>::HttpHeadersDataInputBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 21 | 4.07k | explicit HttpHeadersDataInputBase(const std::string& name) : name_(name) {} |
Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::ResponseTrailerMap>::HttpHeadersDataInputBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 21 | 739 | explicit HttpHeadersDataInputBase(const std::string& name) : name_(name) {} |
|
22 | | |
23 | | virtual OptRef<const HeaderType> headerMap(const HttpMatchingData& data) const PURE; |
24 | | |
25 | 7.39k | Matcher::DataInputGetResult get(const HttpMatchingData& data) const override { |
26 | 7.39k | const OptRef<const HeaderType> maybe_headers = headerMap(data); |
27 | | |
28 | 7.39k | if (!maybe_headers) { |
29 | 0 | return {Matcher::DataInputGetResult::DataAvailability::NotAvailable, absl::monostate()}; |
30 | 0 | } |
31 | | |
32 | 7.39k | auto header_string = HeaderUtility::getAllOfHeaderAsString(*maybe_headers, name_, ","); |
33 | | |
34 | 7.39k | if (header_string.result()) { |
35 | 5.56k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, |
36 | 5.56k | std::string(header_string.result().value())}; |
37 | 5.56k | } |
38 | | |
39 | 1.83k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, absl::monostate()}; |
40 | 7.39k | } Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::RequestHeaderMap>::get(Envoy::Http::HttpMatchingData const&) const Line | Count | Source | 25 | 7.39k | Matcher::DataInputGetResult get(const HttpMatchingData& data) const override { | 26 | 7.39k | const OptRef<const HeaderType> maybe_headers = headerMap(data); | 27 | | | 28 | 7.39k | if (!maybe_headers) { | 29 | 0 | return {Matcher::DataInputGetResult::DataAvailability::NotAvailable, absl::monostate()}; | 30 | 0 | } | 31 | | | 32 | 7.39k | auto header_string = HeaderUtility::getAllOfHeaderAsString(*maybe_headers, name_, ","); | 33 | | | 34 | 7.39k | if (header_string.result()) { | 35 | 5.56k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, | 36 | 5.56k | std::string(header_string.result().value())}; | 37 | 5.56k | } | 38 | | | 39 | 1.83k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, absl::monostate()}; | 40 | 7.39k | } |
Unexecuted instantiation: Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::ResponseHeaderMap>::get(Envoy::Http::HttpMatchingData const&) const Unexecuted instantiation: Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::RequestTrailerMap>::get(Envoy::Http::HttpMatchingData const&) const Unexecuted instantiation: Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::ResponseTrailerMap>::get(Envoy::Http::HttpMatchingData const&) const |
41 | | |
42 | | private: |
43 | | const LowerCaseString name_; |
44 | | }; |
45 | | |
46 | | /** |
47 | | * Common base class for all the header/trailer DataInputsFactory. |
48 | | */ |
49 | | template <class DataInputType, class ProtoType> |
50 | | class HttpHeadersDataInputFactoryBase : public Matcher::DataInputFactory<HttpMatchingData> { |
51 | | public: |
52 | 472 | explicit HttpHeadersDataInputFactoryBase(const std::string& name) : name_(name) {} Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::HttpHeadersDataInputFactoryBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 52 | 118 | explicit HttpHeadersDataInputFactoryBase(const std::string& name) : name_(name) {} |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput>::HttpHeadersDataInputFactoryBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 52 | 118 | explicit HttpHeadersDataInputFactoryBase(const std::string& name) : name_(name) {} |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::HttpHeadersDataInputFactoryBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 52 | 118 | explicit HttpHeadersDataInputFactoryBase(const std::string& name) : name_(name) {} |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::HttpHeadersDataInputFactoryBase(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 52 | 118 | explicit HttpHeadersDataInputFactoryBase(const std::string& name) : name_(name) {} |
|
53 | | |
54 | 18.8k | std::string name() const override { return "envoy.matching.inputs." + name_; } Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::name() const Line | Count | Source | 54 | 4.70k | std::string name() const override { return "envoy.matching.inputs." + name_; } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput>::name() const Line | Count | Source | 54 | 4.70k | std::string name() const override { return "envoy.matching.inputs." + name_; } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::name() const Line | Count | Source | 54 | 4.70k | std::string name() const override { return "envoy.matching.inputs." + name_; } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::name() const Line | Count | Source | 54 | 4.70k | std::string name() const override { return "envoy.matching.inputs." + name_; } |
|
55 | | |
56 | | Matcher::DataInputFactoryCb<HttpMatchingData> |
57 | | createDataInputFactoryCb(const Protobuf::Message& config, |
58 | 32.9k | ProtobufMessage::ValidationVisitor& validation_visitor) override { |
59 | 32.9k | const auto& typed_config = |
60 | 32.9k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); |
61 | | |
62 | 32.9k | return [header_name = typed_config.header_name()] { |
63 | 27.9k | return std::make_unique<DataInputType>(header_name); |
64 | 27.9k | }; Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() const Line | Count | Source | 62 | 18.5k | return [header_name = typed_config.header_name()] { | 63 | 18.5k | return std::make_unique<DataInputType>(header_name); | 64 | 18.5k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() const Line | Count | Source | 62 | 4.64k | return [header_name = typed_config.header_name()] { | 63 | 4.64k | return std::make_unique<DataInputType>(header_name); | 64 | 4.64k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() const Line | Count | Source | 62 | 4.07k | return [header_name = typed_config.header_name()] { | 63 | 4.07k | return std::make_unique<DataInputType>(header_name); | 64 | 4.07k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() const Line | Count | Source | 62 | 739 | return [header_name = typed_config.header_name()] { | 63 | 739 | return std::make_unique<DataInputType>(header_name); | 64 | 739 | }; |
|
65 | 32.9k | }; Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&) Line | Count | Source | 58 | 21.1k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 21.1k | const auto& typed_config = | 60 | 21.1k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 21.1k | return [header_name = typed_config.header_name()] { | 63 | 21.1k | return std::make_unique<DataInputType>(header_name); | 64 | 21.1k | }; | 65 | 21.1k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&) Line | Count | Source | 58 | 6.12k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 6.12k | const auto& typed_config = | 60 | 6.12k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 6.12k | return [header_name = typed_config.header_name()] { | 63 | 6.12k | return std::make_unique<DataInputType>(header_name); | 64 | 6.12k | }; | 65 | 6.12k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&) Line | Count | Source | 58 | 4.74k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 4.74k | const auto& typed_config = | 60 | 4.74k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 4.74k | return [header_name = typed_config.header_name()] { | 63 | 4.74k | return std::make_unique<DataInputType>(header_name); | 64 | 4.74k | }; | 65 | 4.74k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&) Line | Count | Source | 58 | 953 | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 953 | const auto& typed_config = | 60 | 953 | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 953 | return [header_name = typed_config.header_name()] { | 63 | 953 | return std::make_unique<DataInputType>(header_name); | 64 | 953 | }; | 65 | 953 | }; |
|
66 | 33.0k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { |
67 | 33.0k | return std::make_unique<ProtoType>(); |
68 | 33.0k | } Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 21.1k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 21.1k | return std::make_unique<ProtoType>(); | 68 | 21.1k | } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 6.14k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 6.14k | return std::make_unique<ProtoType>(); | 68 | 6.14k | } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 4.77k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 4.77k | return std::make_unique<ProtoType>(); | 68 | 4.77k | } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 970 | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 970 | return std::make_unique<ProtoType>(); | 68 | 970 | } |
|
69 | | |
70 | | private: |
71 | | const std::string name_; |
72 | | }; |
73 | | |
74 | | class HttpRequestHeadersDataInput : public HttpHeadersDataInputBase<RequestHeaderMap> { |
75 | | public: |
76 | 18.5k | explicit HttpRequestHeadersDataInput(const std::string& name) : HttpHeadersDataInputBase(name) {} |
77 | | |
78 | 7.39k | OptRef<const RequestHeaderMap> headerMap(const HttpMatchingData& data) const override { |
79 | 7.39k | return data.requestHeaders(); |
80 | 7.39k | } |
81 | | }; |
82 | | |
83 | | class HttpRequestHeadersDataInputFactory |
84 | | : public HttpHeadersDataInputFactoryBase< |
85 | | HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput> { |
86 | | public: |
87 | 118 | HttpRequestHeadersDataInputFactory() : HttpHeadersDataInputFactoryBase("request_headers") {} |
88 | | }; |
89 | | |
90 | | DECLARE_FACTORY(HttpRequestHeadersDataInputFactory); |
91 | | |
92 | | class HttpResponseHeadersDataInput : public HttpHeadersDataInputBase<ResponseHeaderMap> { |
93 | | public: |
94 | 4.64k | explicit HttpResponseHeadersDataInput(const std::string& name) : HttpHeadersDataInputBase(name) {} |
95 | | |
96 | 0 | OptRef<const ResponseHeaderMap> headerMap(const HttpMatchingData& data) const override { |
97 | 0 | return data.responseHeaders(); |
98 | 0 | } |
99 | | }; |
100 | | |
101 | | class HttpResponseHeadersDataInputFactory |
102 | | : public HttpHeadersDataInputFactoryBase< |
103 | | HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput> { |
104 | | public: |
105 | 118 | HttpResponseHeadersDataInputFactory() : HttpHeadersDataInputFactoryBase("response_headers") {} |
106 | | }; |
107 | | |
108 | | DECLARE_FACTORY(HttpResponseHeadersDataInputFactory); |
109 | | |
110 | | class HttpRequestTrailersDataInput : public HttpHeadersDataInputBase<RequestTrailerMap> { |
111 | | public: |
112 | 4.07k | explicit HttpRequestTrailersDataInput(const std::string& name) : HttpHeadersDataInputBase(name) {} |
113 | | |
114 | 0 | OptRef<const RequestTrailerMap> headerMap(const HttpMatchingData& data) const override { |
115 | 0 | return data.requestTrailers(); |
116 | 0 | } |
117 | | }; |
118 | | |
119 | | class HttpRequestTrailersDataInputFactory |
120 | | : public HttpHeadersDataInputFactoryBase< |
121 | | HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput> { |
122 | | public: |
123 | 118 | HttpRequestTrailersDataInputFactory() : HttpHeadersDataInputFactoryBase("request_trailers") {} |
124 | | }; |
125 | | |
126 | | DECLARE_FACTORY(HttpRequestTrailersDataInputFactory); |
127 | | |
128 | | class HttpResponseTrailersDataInput : public HttpHeadersDataInputBase<ResponseTrailerMap> { |
129 | | public: |
130 | | explicit HttpResponseTrailersDataInput(const std::string& name) |
131 | 739 | : HttpHeadersDataInputBase(name) {} |
132 | | |
133 | 0 | OptRef<const ResponseTrailerMap> headerMap(const HttpMatchingData& data) const override { |
134 | 0 | return data.responseTrailers(); |
135 | 0 | } |
136 | | }; |
137 | | |
138 | | class HttpResponseTrailersDataInputFactory |
139 | | : public HttpHeadersDataInputFactoryBase< |
140 | | HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput> { |
141 | | public: |
142 | 118 | HttpResponseTrailersDataInputFactory() : HttpHeadersDataInputFactoryBase("response_trailers") {} |
143 | | }; |
144 | | |
145 | | DECLARE_FACTORY(HttpResponseTrailersDataInputFactory); |
146 | | |
147 | | class HttpRequestQueryParamsDataInput : public Matcher::DataInput<HttpMatchingData> { |
148 | | public: |
149 | | explicit HttpRequestQueryParamsDataInput(const std::string& query_param) |
150 | 0 | : query_param_(query_param) {} |
151 | | |
152 | 0 | Matcher::DataInputGetResult get(const HttpMatchingData& data) const override { |
153 | 0 | const auto maybe_headers = data.requestHeaders(); |
154 | |
|
155 | 0 | if (!maybe_headers) { |
156 | 0 | return {Matcher::DataInputGetResult::DataAvailability::NotAvailable, absl::monostate()}; |
157 | 0 | } |
158 | | |
159 | 0 | const auto ret = maybe_headers->Path(); |
160 | 0 | if (!ret) { |
161 | 0 | return {Matcher::DataInputGetResult::DataAvailability::NotAvailable, absl::monostate()}; |
162 | 0 | } |
163 | | |
164 | 0 | auto params = |
165 | 0 | Http::Utility::QueryParamsMulti::parseAndDecodeQueryString(ret->value().getStringView()); |
166 | |
|
167 | 0 | auto ItParam = params.getFirstValue(query_param_); |
168 | 0 | if (!ItParam.has_value()) { |
169 | 0 | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, absl::monostate()}; |
170 | 0 | } |
171 | 0 | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, |
172 | 0 | std::move(ItParam.value())}; |
173 | 0 | } |
174 | | |
175 | | private: |
176 | | const std::string query_param_; |
177 | | }; |
178 | | |
179 | | class HttpRequestQueryParamsDataInputFactory : public Matcher::DataInputFactory<HttpMatchingData> { |
180 | | public: |
181 | 4.70k | std::string name() const override { return "query_params"; } |
182 | | |
183 | | Matcher::DataInputFactoryCb<HttpMatchingData> |
184 | | createDataInputFactoryCb(const Protobuf::Message& config, |
185 | 1 | ProtobufMessage::ValidationVisitor& validation_visitor) override { |
186 | 1 | const auto& typed_config = MessageUtil::downcastAndValidate< |
187 | 1 | const envoy::type::matcher::v3::HttpRequestQueryParamMatchInput&>(config, |
188 | 1 | validation_visitor); |
189 | | |
190 | 1 | return [query_param = typed_config.query_param()] { |
191 | 0 | return std::make_unique<HttpRequestQueryParamsDataInput>(query_param); |
192 | 0 | }; |
193 | 1 | }; |
194 | 18 | ProtobufTypes::MessagePtr createEmptyConfigProto() override { |
195 | 18 | return std::make_unique<envoy::type::matcher::v3::HttpRequestQueryParamMatchInput>(); |
196 | 18 | } |
197 | | }; |
198 | | |
199 | | DECLARE_FACTORY(HttpRequestQueryParamsDataInputFactory); |
200 | | |
201 | | } // namespace Matching |
202 | | } // namespace Http |
203 | | } // namespace Envoy |