Coverage Report

Created: 2024-09-19 09:45

/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