Coverage Report

Created: 2023-11-12 09:30

/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()() const
Line
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()() const
Line
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()() const
Line
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()() const
Line
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