/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 | 25.8k | 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 | 22.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 | 1.27k | 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 | 997 | 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 | 945 | explicit HttpHeadersDataInputBase(const std::string& name) : name_(name) {} |
|
22 | | |
23 | | virtual OptRef<const HeaderType> headerMap(const HttpMatchingData& data) const PURE; |
24 | | |
25 | 10.7k | Matcher::DataInputGetResult get(const HttpMatchingData& data) const override { |
26 | 10.7k | const OptRef<const HeaderType> maybe_headers = headerMap(data); |
27 | | |
28 | 10.7k | if (!maybe_headers) { |
29 | 0 | return {Matcher::DataInputGetResult::DataAvailability::NotAvailable, absl::monostate()}; |
30 | 0 | } |
31 | | |
32 | 10.7k | auto header_string = HeaderUtility::getAllOfHeaderAsString(*maybe_headers, name_, ","); |
33 | | |
34 | 10.7k | if (header_string.result()) { |
35 | 8.42k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, |
36 | 8.42k | std::string(header_string.result().value())}; |
37 | 8.42k | } |
38 | | |
39 | 2.30k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, absl::monostate()}; |
40 | 10.7k | } Envoy::Http::Matching::HttpHeadersDataInputBase<Envoy::Http::RequestHeaderMap>::get(Envoy::Http::HttpMatchingData const&) const Line | Count | Source | 25 | 10.7k | Matcher::DataInputGetResult get(const HttpMatchingData& data) const override { | 26 | 10.7k | const OptRef<const HeaderType> maybe_headers = headerMap(data); | 27 | | | 28 | 10.7k | if (!maybe_headers) { | 29 | 0 | return {Matcher::DataInputGetResult::DataAvailability::NotAvailable, absl::monostate()}; | 30 | 0 | } | 31 | | | 32 | 10.7k | auto header_string = HeaderUtility::getAllOfHeaderAsString(*maybe_headers, name_, ","); | 33 | | | 34 | 10.7k | if (header_string.result()) { | 35 | 8.42k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, | 36 | 8.42k | std::string(header_string.result().value())}; | 37 | 8.42k | } | 38 | | | 39 | 2.30k | return {Matcher::DataInputGetResult::DataAvailability::AllDataAvailable, absl::monostate()}; | 40 | 10.7k | } |
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 | 440 | 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 | 110 | 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 | 110 | 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 | 110 | 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 | 110 | explicit HttpHeadersDataInputFactoryBase(const std::string& name) : name_(name) {} |
|
53 | | |
54 | 22.2k | 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 | 5.56k | 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 | 5.56k | 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 | 5.56k | 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 | 5.56k | std::string name() const override { return "envoy.matching.inputs." + name_; } |
|
55 | | |
56 | | Matcher::DataInputFactoryCb<HttpMatchingData> |
57 | | createDataInputFactoryCb(const Protobuf::Message& config, |
58 | 32.2k | ProtobufMessage::ValidationVisitor& validation_visitor) override { |
59 | 32.2k | const auto& typed_config = |
60 | 32.2k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); |
61 | | |
62 | 32.2k | return [header_name = typed_config.header_name()] { |
63 | 25.8k | return std::make_unique<DataInputType>(header_name); |
64 | 25.8k | }; Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() constLine | Count | Source | 62 | 22.5k | return [header_name = typed_config.header_name()] { | 63 | 22.5k | return std::make_unique<DataInputType>(header_name); | 64 | 22.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()() constLine | Count | Source | 62 | 1.27k | return [header_name = typed_config.header_name()] { | 63 | 1.27k | return std::make_unique<DataInputType>(header_name); | 64 | 1.27k | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() constLine | Count | Source | 62 | 997 | return [header_name = typed_config.header_name()] { | 63 | 997 | return std::make_unique<DataInputType>(header_name); | 64 | 997 | }; |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::createDataInputFactoryCb(google::protobuf::Message const&, Envoy::ProtobufMessage::ValidationVisitor&)::{lambda()#1}::operator()() constLine | Count | Source | 62 | 945 | return [header_name = typed_config.header_name()] { | 63 | 945 | return std::make_unique<DataInputType>(header_name); | 64 | 945 | }; |
|
65 | 32.2k | }; 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 | 27.0k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 27.0k | const auto& typed_config = | 60 | 27.0k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 27.0k | return [header_name = typed_config.header_name()] { | 63 | 27.0k | return std::make_unique<DataInputType>(header_name); | 64 | 27.0k | }; | 65 | 27.0k | }; |
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 | 1.96k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 1.96k | const auto& typed_config = | 60 | 1.96k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 1.96k | return [header_name = typed_config.header_name()] { | 63 | 1.96k | return std::make_unique<DataInputType>(header_name); | 64 | 1.96k | }; | 65 | 1.96k | }; |
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 | 1.86k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 1.86k | const auto& typed_config = | 60 | 1.86k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 1.86k | return [header_name = typed_config.header_name()] { | 63 | 1.86k | return std::make_unique<DataInputType>(header_name); | 64 | 1.86k | }; | 65 | 1.86k | }; |
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 | 1.36k | ProtobufMessage::ValidationVisitor& validation_visitor) override { | 59 | 1.36k | const auto& typed_config = | 60 | 1.36k | MessageUtil::downcastAndValidate<const ProtoType&>(config, validation_visitor); | 61 | | | 62 | 1.36k | return [header_name = typed_config.header_name()] { | 63 | 1.36k | return std::make_unique<DataInputType>(header_name); | 64 | 1.36k | }; | 65 | 1.36k | }; |
|
66 | 32.2k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { |
67 | 32.2k | return std::make_unique<ProtoType>(); |
68 | 32.2k | } Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 27.0k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 27.0k | return std::make_unique<ProtoType>(); | 68 | 27.0k | } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseHeadersDataInput, envoy::type::matcher::v3::HttpResponseHeaderMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 1.98k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 1.98k | return std::make_unique<ProtoType>(); | 68 | 1.98k | } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpRequestTrailersDataInput, envoy::type::matcher::v3::HttpRequestTrailerMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 1.87k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 1.87k | return std::make_unique<ProtoType>(); | 68 | 1.87k | } |
Envoy::Http::Matching::HttpHeadersDataInputFactoryBase<Envoy::Http::Matching::HttpResponseTrailersDataInput, envoy::type::matcher::v3::HttpResponseTrailerMatchInput>::createEmptyConfigProto() Line | Count | Source | 66 | 1.38k | ProtobufTypes::MessagePtr createEmptyConfigProto() override { | 67 | 1.38k | return std::make_unique<ProtoType>(); | 68 | 1.38k | } |
|
69 | | |
70 | | private: |
71 | | const std::string name_; |
72 | | }; |
73 | | |
74 | | class HttpRequestHeadersDataInput : public HttpHeadersDataInputBase<RequestHeaderMap> { |
75 | | public: |
76 | 22.5k | explicit HttpRequestHeadersDataInput(const std::string& name) : HttpHeadersDataInputBase(name) {} |
77 | | |
78 | 10.7k | OptRef<const RequestHeaderMap> headerMap(const HttpMatchingData& data) const override { |
79 | 10.7k | return data.requestHeaders(); |
80 | 10.7k | } |
81 | | }; |
82 | | |
83 | | class HttpRequestHeadersDataInputFactory |
84 | | : public HttpHeadersDataInputFactoryBase< |
85 | | HttpRequestHeadersDataInput, envoy::type::matcher::v3::HttpRequestHeaderMatchInput> { |
86 | | public: |
87 | 110 | HttpRequestHeadersDataInputFactory() : HttpHeadersDataInputFactoryBase("request_headers") {} |
88 | | }; |
89 | | |
90 | | DECLARE_FACTORY(HttpRequestHeadersDataInputFactory); |
91 | | |
92 | | class HttpResponseHeadersDataInput : public HttpHeadersDataInputBase<ResponseHeaderMap> { |
93 | | public: |
94 | 1.27k | 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 | 110 | HttpResponseHeadersDataInputFactory() : HttpHeadersDataInputFactoryBase("response_headers") {} |
106 | | }; |
107 | | |
108 | | DECLARE_FACTORY(HttpResponseHeadersDataInputFactory); |
109 | | |
110 | | class HttpRequestTrailersDataInput : public HttpHeadersDataInputBase<RequestTrailerMap> { |
111 | | public: |
112 | 997 | 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 | 110 | 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 | 945 | : 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 | 110 | 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 | 5.56k | 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 | 17 | ProtobufTypes::MessagePtr createEmptyConfigProto() override { |
195 | 17 | return std::make_unique<envoy::type::matcher::v3::HttpRequestQueryParamMatchInput>(); |
196 | 17 | } |
197 | | }; |
198 | | |
199 | | DECLARE_FACTORY(HttpRequestQueryParamsDataInputFactory); |
200 | | |
201 | | } // namespace Matching |
202 | | } // namespace Http |
203 | | } // namespace Envoy |