Skip to content

Commit

Permalink
generic proxy: enhance match input data to support more attributes (e…
Browse files Browse the repository at this point in the history
…nvoyproxy#34438)

* generic proxy: enhance match input data to support more attributes

Signed-off-by: wbpcode <[email protected]>

* generic proxy: minor code movement for re-using

Signed-off-by: wbpcode <[email protected]>

* fix format

Signed-off-by: wbpcode <[email protected]>

* fix unit test

Signed-off-by: wbpcode <[email protected]>

---------

Signed-off-by: wbpcode <[email protected]>
Signed-off-by: wbpcode <[email protected]>
Co-authored-by: wbpcode <[email protected]>
  • Loading branch information
wbpcode and wbpcode authored Jun 1, 2024
1 parent ed14926 commit 4d0d5f7
Show file tree
Hide file tree
Showing 18 changed files with 278 additions and 145 deletions.
12 changes: 12 additions & 0 deletions contrib/generic_proxy/filters/network/source/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -92,13 +92,25 @@ envoy_cc_library(
"match.h",
],
deps = [
":match_input_lib",
"//contrib/generic_proxy/filters/network/source/interface:stream_interface",
"//source/common/matcher:matcher_lib",
"@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg_cc_proto",
],
alwayslink = 1,
)

envoy_cc_library(
name = "match_input_lib",
hdrs = [
"match_input.h",
],
deps = [
"//contrib/generic_proxy/filters/network/source/interface:stream_interface",
"//envoy/stream_info:stream_info_interface",
],
)

envoy_cc_library(
name = "rds_interface",
hdrs = ["rds.h"],
Expand Down
84 changes: 33 additions & 51 deletions contrib/generic_proxy/filters/network/source/access_log.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,64 +7,46 @@ namespace Extensions {
namespace NetworkFilters {
namespace GenericProxy {

class StringValueFormatterProvider : public FormatterProvider {
public:
using ValueExtractor = std::function<absl::optional<std::string>(const FormatterContext&,
const StreamInfo::StreamInfo&)>;

StringValueFormatterProvider(ValueExtractor f, absl::optional<size_t> max_length = absl::nullopt)
: value_extractor_(f), max_length_(max_length) {}

// FormatterProvider
absl::optional<std::string>
formatWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo& stream_info) const override {
auto optional_str = value_extractor_(context, stream_info);
if (!optional_str) {
return absl::nullopt;
}
if (max_length_.has_value()) {
if (optional_str->length() > max_length_.value()) {
optional_str->resize(max_length_.value());
}
absl::optional<std::string>
StringValueFormatterProvider::formatWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo& stream_info) const {
auto optional_str = value_extractor_(context, stream_info);
if (!optional_str) {
return absl::nullopt;
}
if (max_length_.has_value()) {
if (optional_str->length() > max_length_.value()) {
optional_str->resize(max_length_.value());
}
return optional_str;
}
ProtobufWkt::Value
formatValueWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo& stream_info) const override {
return ValueUtil::optionalStringValue(formatWithContext(context, stream_info));
return optional_str;
}
ProtobufWkt::Value StringValueFormatterProvider::formatValueWithContext(
const FormatterContext& context, const StreamInfo::StreamInfo& stream_info) const {
return ValueUtil::optionalStringValue(formatWithContext(context, stream_info));
}

absl::optional<std::string>
GenericStatusCodeFormatterProvider::formatWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo&) const {
if (context.response_ == nullptr) {
return absl::nullopt;
}

private:
ValueExtractor value_extractor_;
absl::optional<size_t> max_length_;
};

class GenericStatusCodeFormatterProvider : public FormatterProvider {
public:
GenericStatusCodeFormatterProvider() = default;

// FormatterProvider
absl::optional<std::string> formatWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo&) const override {
if (context.response_ == nullptr) {
return absl::nullopt;
}
const int code = context.response_->status().code();
return std::to_string(code);
}

const int code = context.response_->status().code();
return std::to_string(code);
ProtobufWkt::Value
GenericStatusCodeFormatterProvider::formatValueWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo&) const {
if (context.response_ == nullptr) {
return ValueUtil::nullValue();
}
ProtobufWkt::Value formatValueWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo&) const override {
if (context.response_ == nullptr) {
return ValueUtil::nullValue();
}

const int code = context.response_->status().code();
return ValueUtil::numberValue(code);
}
};
const int code = context.response_->status().code();
return ValueUtil::numberValue(code);
}

class SimpleCommandParser : public CommandParser {
public:
Expand Down
32 changes: 32 additions & 0 deletions contrib/generic_proxy/filters/network/source/access_log.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,38 @@ using AccessLogInstanceFactory = AccessLog::AccessLogInstanceFactoryBase<Formatt
using FileAccessLog = FileAccessLogBase<FormatterContext>;
using FileAccessLogFactory = FileAccessLogFactoryBase<FormatterContext>;

class StringValueFormatterProvider : public FormatterProvider {
public:
using ValueExtractor = std::function<absl::optional<std::string>(const FormatterContext&,
const StreamInfo::StreamInfo&)>;

StringValueFormatterProvider(ValueExtractor f, absl::optional<size_t> max_length = absl::nullopt)
: value_extractor_(f), max_length_(max_length) {}

// FormatterProvider
absl::optional<std::string>
formatWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo& stream_info) const override;
ProtobufWkt::Value
formatValueWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo& stream_info) const override;

private:
ValueExtractor value_extractor_;
absl::optional<size_t> max_length_;
};

class GenericStatusCodeFormatterProvider : public FormatterProvider {
public:
GenericStatusCodeFormatterProvider() = default;

// FormatterProvider
absl::optional<std::string> formatWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo&) const override;
ProtobufWkt::Value formatValueWithContext(const FormatterContext& context,
const StreamInfo::StreamInfo&) const override;
};

} // namespace GenericProxy
} // namespace NetworkFilters
} // namespace Extensions
Expand Down
2 changes: 2 additions & 0 deletions contrib/generic_proxy/filters/network/source/interface/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ envoy_cc_library(
],
deps = [
":stream_interface",
"//contrib/generic_proxy/filters/network/source:match_input_lib",
"//envoy/config:typed_metadata_interface",
"//envoy/event:dispatcher_interface",
"//envoy/network:connection_interface",
Expand Down Expand Up @@ -97,6 +98,7 @@ envoy_cc_library(
":filter_interface",
":route_interface",
"//contrib/generic_proxy/filters/network/source:access_log_lib",
"//contrib/generic_proxy/filters/network/source:match_input_lib",
"//envoy/tracing:trace_config_interface",
"//envoy/tracing:tracer_interface",
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "contrib/generic_proxy/filters/network/source/interface/codec.h"
#include "contrib/generic_proxy/filters/network/source/interface/filter.h"
#include "contrib/generic_proxy/filters/network/source/interface/route.h"
#include "contrib/generic_proxy/filters/network/source/match_input.h"
#include "contrib/generic_proxy/filters/network/source/stats.h"

namespace Envoy {
Expand All @@ -24,7 +25,7 @@ class FilterConfig : public FilterChainFactory {
* @param request request.
* @return RouteEntryConstSharedPtr route entry.
*/
virtual RouteEntryConstSharedPtr routeEntry(const Request& request) const PURE;
virtual RouteEntryConstSharedPtr routeEntry(const MatchInput& request) const PURE;

/**
* Get codec factory for decoding/encoding of request/response.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "envoy/router/router.h"

#include "contrib/generic_proxy/filters/network/source/interface/stream.h"
#include "contrib/generic_proxy/filters/network/source/match_input.h"

namespace Envoy {
namespace Extensions {
Expand Down Expand Up @@ -87,7 +88,7 @@ using RouteEntryConstSharedPtr = std::shared_ptr<const RouteEntry>;

class RouteMatcher : public Rds::Config {
public:
virtual RouteEntryConstSharedPtr routeEntry(const Request& request) const PURE;
virtual RouteEntryConstSharedPtr routeEntry(const MatchInput& request) const PURE;
};
using RouteMatcherPtr = std::unique_ptr<RouteMatcher>;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,6 @@ class HeaderFrame : public StreamFrame {
* @param key The metadata key of string view type.
*/
virtual void erase(absl::string_view /*key*/) {}

// Used for matcher.
static constexpr absl::string_view name() { return "generic_proxy"; }
};

// Alias for backward compatibility.
Expand Down
16 changes: 8 additions & 8 deletions contrib/generic_proxy/filters/network/source/match.cc
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,17 @@ namespace Extensions {
namespace NetworkFilters {
namespace GenericProxy {

REGISTER_FACTORY(ServiceMatchDataInputFactory, Matcher::DataInputFactory<Request>);
REGISTER_FACTORY(ServiceMatchDataInputFactory, Matcher::DataInputFactory<MatchInput>);

REGISTER_FACTORY(HostMatchDataInputFactory, Matcher::DataInputFactory<Request>);
REGISTER_FACTORY(HostMatchDataInputFactory, Matcher::DataInputFactory<MatchInput>);

REGISTER_FACTORY(PathMatchDataInputFactory, Matcher::DataInputFactory<Request>);
REGISTER_FACTORY(PathMatchDataInputFactory, Matcher::DataInputFactory<MatchInput>);

REGISTER_FACTORY(MethodMatchDataInputFactory, Matcher::DataInputFactory<Request>);
REGISTER_FACTORY(MethodMatchDataInputFactory, Matcher::DataInputFactory<MatchInput>);

REGISTER_FACTORY(PropertyMatchDataInputFactory, Matcher::DataInputFactory<Request>);
REGISTER_FACTORY(PropertyMatchDataInputFactory, Matcher::DataInputFactory<MatchInput>);

REGISTER_FACTORY(RequestMatchDataInputFactory, Matcher::DataInputFactory<Request>);
REGISTER_FACTORY(RequestMatchDataInputFactory, Matcher::DataInputFactory<MatchInput>);

using StringMatcherImpl = Matchers::StringMatcherImpl<StringMatcherProto>;

Expand Down Expand Up @@ -50,10 +50,10 @@ bool RequestMatchInputMatcher::match(const Matcher::MatchingDataType& input) {
return false;
}

return match(typed_data->request());
return match(typed_data->data().requestHeader());
}

bool RequestMatchInputMatcher::match(const Request& request) {
bool RequestMatchInputMatcher::match(const RequestHeaderFrame& request) {
// TODO(wbpcode): may add more debug log for request match?
if (host_ != nullptr) {
if (!host_->match(request.host())) {
Expand Down
Loading

0 comments on commit 4d0d5f7

Please sign in to comment.