Skip to content

Commit 48e7d34

Browse files
EItanyasoloio-bulldozer[bot]
authored andcommitted
Transform extend (#27)
* compile and tests passing * started stats * added stats to base class * added stats * fixed bad find and replace * unit tests now test all paths * works with config from transformer * integration tests work * PR comments
1 parent fb35a70 commit 48e7d34

12 files changed

+430
-187
lines changed

source/extensions/filters/http/aws_lambda/config.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace HttpFilters {
1919
namespace AwsLambda {
2020

2121
/**
22-
* All stats for the fault filter. @see stats_macros.h
22+
* All stats for the aws filter. @see stats_macros.h
2323
*/
2424
#define ALL_AWS_LAMBDA_FILTER_STATS(COUNTER, GAUGE) \
2525
COUNTER(fetch_failed) \
@@ -28,7 +28,7 @@ namespace AwsLambda {
2828
GAUGE(current_state, NeverImport)
2929

3030
/**
31-
* Wrapper struct for connection manager stats. @see stats_macros.h
31+
* Wrapper struct for aws filter stats. @see stats_macros.h
3232
*/
3333
struct AwsLambdaFilterStats {
3434
ALL_AWS_LAMBDA_FILTER_STATS(GENERATE_COUNTER_STRUCT, GENERATE_GAUGE_STRUCT)
@@ -44,7 +44,7 @@ typedef std::shared_ptr<
4444
class AWSLambdaConfig {
4545
public:
4646
virtual CredentialsConstSharedPtr getCredentials() const PURE;
47-
virtual ~AWSLambdaConfig() = default;
47+
virtual ~AWSLambdaConfig() = default;
4848
};
4949

5050
class AWSLambdaConfigImpl

source/extensions/filters/http/transformation/BUILD

+4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ envoy_cc_library(
2525
":body_header_transformer_lib",
2626
":inja_transformer_lib",
2727
":transformer_lib",
28+
"//source/extensions/filters/http:solo_well_known_names",
2829
"//api/envoy/config/filter/http/transformation/v2:transformation_filter_proto_cc",
2930
"@envoy//include/envoy/router:router_interface",
3031
],
@@ -47,6 +48,8 @@ envoy_cc_library(
4748
"@envoy//source/common/common:enum_to_int",
4849
"@envoy//source/common/config:metadata_lib",
4950
"@envoy//source/common/http:utility_lib",
51+
"@envoy//include/envoy/stats:stats_interface",
52+
"@envoy//include/envoy/stats:stats_macros",
5053
],
5154
)
5255

@@ -98,6 +101,7 @@ envoy_cc_library(
98101
deps = [
99102
"@envoy//include/envoy/buffer:buffer_interface",
100103
"@envoy//include/envoy/http:header_map_interface",
104+
"@envoy//include/envoy/router:router_interface",
101105
],
102106
)
103107

source/extensions/filters/http/transformation/transformation_filter.cc

+26-14
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ struct RcDetailsValues {
1919
};
2020
typedef ConstSingleton<RcDetailsValues> RcDetails;
2121

22-
TransformationFilter::TransformationFilter() {}
22+
TransformationFilter::TransformationFilter(FilterConfigSharedPtr config) : filter_config_(config) {}
2323

2424
TransformationFilter::~TransformationFilter() {}
2525

@@ -41,6 +41,7 @@ TransformationFilter::decodeHeaders(Http::HeaderMap &header_map,
4141
request_headers_ = &header_map;
4242

4343
if (end_stream || request_transformation_->passthrough_body()) {
44+
filter_config_->stats().request_header_transformations_.inc();
4445
transformRequest();
4546

4647
return is_error() ? Http::FilterHeadersStatus::StopIteration
@@ -65,6 +66,7 @@ Http::FilterDataStatus TransformationFilter::decodeData(Buffer::Instance &data,
6566
}
6667

6768
if (end_stream) {
69+
filter_config_->stats().request_body_transformations_.inc();
6870
transformRequest();
6971
return is_error() ? Http::FilterDataStatus::StopIterationNoBuffer
7072
: Http::FilterDataStatus::Continue;
@@ -76,6 +78,7 @@ Http::FilterDataStatus TransformationFilter::decodeData(Buffer::Instance &data,
7678
Http::FilterTrailersStatus
7779
TransformationFilter::decodeTrailers(Http::HeaderMap &) {
7880
if (requestActive()) {
81+
filter_config_->stats().request_body_transformations_.inc();
7982
transformRequest();
8083
}
8184
return is_error() ? Http::FilterTrailersStatus::StopIteration
@@ -96,6 +99,7 @@ TransformationFilter::encodeHeaders(Http::HeaderMap &header_map,
9699
response_headers_ = &header_map;
97100

98101
if (end_stream || response_transformation_->passthrough_body()) {
102+
filter_config_->stats().response_header_transformations_.inc();
99103
transformResponse();
100104
return Http::FilterHeadersStatus::Continue;
101105
}
@@ -113,6 +117,7 @@ Http::FilterDataStatus TransformationFilter::encodeData(Buffer::Instance &data,
113117
if ((encoder_buffer_limit_ != 0) &&
114118
(response_body_.length() > encoder_buffer_limit_)) {
115119
error(Error::PayloadTooLarge);
120+
filter_config_->stats().response_body_transformations_.inc();
116121
responseError();
117122
return Http::FilterDataStatus::Continue;
118123
}
@@ -128,6 +133,7 @@ Http::FilterDataStatus TransformationFilter::encodeData(Buffer::Instance &data,
128133
Http::FilterTrailersStatus
129134
TransformationFilter::encodeTrailers(Http::HeaderMap &) {
130135
if (responseActive()) {
136+
filter_config_->stats().response_body_transformations_.inc();
131137
transformResponse();
132138
}
133139
return Http::FilterTrailersStatus::Continue;
@@ -151,24 +157,28 @@ TransformerConstSharedPtr TransformationFilter::getTransformFromRoute(
151157
return nullptr;
152158
}
153159

154-
const auto *config = Http::Utility::resolveMostSpecificPerFilterConfig<
155-
RouteTransformationFilterConfig>(
156-
SoloHttpFilterNames::get().Transformation, route_);
157-
158-
if (config != nullptr) {
159-
switch (direction) {
160+
const auto *route_config = Http::Utility::resolveMostSpecificPerFilterConfig<
161+
RouteTransformationFilterConfig>(filter_config_->name(), route_);
162+
163+
switch (direction) {
160164
case TransformationFilter::Direction::Request: {
161-
should_clear_cache_ = config->shouldClearCache();
162-
return config->getRequestTranformation();
165+
should_clear_cache_ = filter_config_->shouldClearCache();
166+
if (route_config != nullptr && route_config->getRequestTranformation() != nullptr) {
167+
should_clear_cache_ = route_config->shouldClearCache();
168+
return route_config->getRequestTranformation();
169+
} else {
170+
return filter_config_->getRequestTranformation();
171+
}
163172
}
164173
case TransformationFilter::Direction::Response: {
165-
return config->getResponseTranformation();
166-
}
167-
default:
168-
// TODO(yuval-k): should this be a warning log?
169-
NOT_REACHED_GCOVR_EXCL_LINE;
174+
if (route_config != nullptr && route_config->getResponseTranformation() != nullptr) {
175+
return route_config->getResponseTranformation();
176+
} else {
177+
return filter_config_->getResponseTranformation();
178+
}
170179
}
171180
}
181+
172182
return nullptr;
173183
}
174184

@@ -227,13 +237,15 @@ void TransformationFilter::transformSomething(
227237

228238
void TransformationFilter::requestError() {
229239
ASSERT(is_error());
240+
filter_config_->stats().request_error_.inc();
230241
decoder_callbacks_->sendLocalReply(error_code_, error_messgae_, nullptr,
231242
absl::nullopt,
232243
RcDetails::get().TransformError);
233244
}
234245

235246
void TransformationFilter::responseError() {
236247
ASSERT(is_error());
248+
filter_config_->stats().response_error_.inc();
237249
response_headers_->Status()->value(enumToInt(error_code_));
238250
Buffer::OwnedImpl data(error_messgae_);
239251
response_headers_->removeContentType();

source/extensions/filters/http/transformation/transformation_filter.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "common/buffer/buffer_impl.h"
66

77
#include "extensions/filters/http/transformation/transformation_filter_config.h"
8+
#include "extensions/filters/http/transformation/transformer.h"
89

910
#include "api/envoy/config/filter/http/transformation/v2/transformation_filter.pb.validate.h"
1011

@@ -20,7 +21,7 @@ namespace Transformation {
2021
class TransformationFilter : public Http::StreamFilter,
2122
Logger::Loggable<Logger::Id::filter> {
2223
public:
23-
TransformationFilter();
24+
TransformationFilter(FilterConfigSharedPtr);
2425
~TransformationFilter();
2526

2627
// Http::FunctionalFilterBase
@@ -112,6 +113,8 @@ class TransformationFilter : public Http::StreamFilter,
112113
Http::Code error_code_;
113114
std::string error_messgae_;
114115
bool should_clear_cache_{};
116+
117+
FilterConfigSharedPtr filter_config_;
115118
};
116119

117120
} // namespace Transformation

source/extensions/filters/http/transformation/transformation_filter_config.h

+42-10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "envoy/router/router.h"
66

77
#include "extensions/filters/http/transformation/transformer.h"
8+
#include "extensions/filters/http/solo_well_known_names.h"
89

910
#include "api/envoy/config/filter/http/transformation/v2/transformation_filter.pb.validate.h"
1011

@@ -19,13 +20,47 @@ class Transformation {
1920
const envoy::api::v2::filter::http::Transformation &transformation);
2021
};
2122

22-
class RouteTransformationFilterConfig
23-
: public Router::RouteSpecificFilterConfig {
23+
using TransformationConfigProto = envoy::api::v2::filter::http::RouteTransformations;
24+
using RouteTransformationConfigProto = envoy::api::v2::filter::http::RouteTransformations;
2425

25-
using ProtoConfig = envoy::api::v2::filter::http::RouteTransformations;
26+
class TransformationFilterConfig : public FilterConfig {
27+
public:
28+
TransformationFilterConfig(const TransformationConfigProto &proto_config, const std::string& prefix, Stats::Scope& scope)
29+
: FilterConfig(prefix, scope), clear_route_cache_(proto_config.clear_route_cache()) {
30+
if (proto_config.has_request_transformation()) {
31+
request_transformation_ =
32+
Transformation::getTransformer(proto_config.request_transformation());
33+
}
34+
if (proto_config.has_response_transformation()) {
35+
response_transformation_ = Transformation::getTransformer(
36+
proto_config.response_transformation());
37+
}
38+
}
39+
40+
std::string name() const override {
41+
return SoloHttpFilterNames::get().Transformation;
42+
}
43+
44+
TransformerConstSharedPtr getRequestTranformation() const override {
45+
return request_transformation_;
46+
}
2647

48+
bool shouldClearCache() const override { return clear_route_cache_; }
49+
50+
TransformerConstSharedPtr getResponseTranformation() const override {
51+
return response_transformation_;
52+
}
53+
54+
private:
55+
TransformerConstSharedPtr request_transformation_;
56+
TransformerConstSharedPtr response_transformation_;
57+
bool clear_route_cache_{};
58+
};
59+
60+
61+
class RouteTransformationFilterConfig : public RouteFilterConfig {
2762
public:
28-
RouteTransformationFilterConfig(ProtoConfig proto_config)
63+
RouteTransformationFilterConfig(const RouteTransformationConfigProto &proto_config)
2964
: clear_route_cache_(proto_config.clear_route_cache()) {
3065
if (proto_config.has_request_transformation()) {
3166
request_transformation_ =
@@ -37,13 +72,13 @@ class RouteTransformationFilterConfig
3772
}
3873
}
3974

40-
TransformerConstSharedPtr getRequestTranformation() const {
75+
TransformerConstSharedPtr getRequestTranformation() const override {
4176
return request_transformation_;
4277
}
4378

44-
bool shouldClearCache() const { return clear_route_cache_; }
79+
bool shouldClearCache() const override { return clear_route_cache_; }
4580

46-
TransformerConstSharedPtr getResponseTranformation() const {
81+
TransformerConstSharedPtr getResponseTranformation() const override {
4782
return response_transformation_;
4883
}
4984

@@ -53,9 +88,6 @@ class RouteTransformationFilterConfig
5388
bool clear_route_cache_{};
5489
};
5590

56-
typedef std::shared_ptr<const RouteTransformationFilterConfig>
57-
RouteTransformationFilterConfigConstSharedPtr;
58-
5991
} // namespace Transformation
6092
} // namespace HttpFilters
6193
} // namespace Extensions

source/extensions/filters/http/transformation/transformation_filter_config_factory.cc

+13-15
Original file line numberDiff line numberDiff line change
@@ -16,27 +16,25 @@ namespace Extensions {
1616
namespace HttpFilters {
1717
namespace Transformation {
1818

19-
Http::FilterFactoryCb TransformationFilterConfigFactory::createFilter(
20-
const std::string &, Server::Configuration::FactoryContext &) {
2119

22-
return [](Http::FilterChainFactoryCallbacks &callbacks) -> void {
23-
auto filter = new TransformationFilter();
20+
Http::FilterFactoryCb
21+
TransformationFilterConfigFactory::createFilterFactoryFromProtoTyped(
22+
const TransformationConfigProto &proto_config, const std::string &stats_prefix,
23+
Server::Configuration::FactoryContext &context) {
24+
25+
FilterConfigSharedPtr config =
26+
std::make_shared<TransformationFilterConfig>(proto_config, stats_prefix, context.scope());
27+
28+
return [config](Http::FilterChainFactoryCallbacks &callbacks) -> void {
29+
auto filter = new TransformationFilter(config);
2430
callbacks.addStreamFilter(Http::StreamFilterSharedPtr{filter});
2531
};
2632
}
2733

28-
ProtobufTypes::MessagePtr
29-
TransformationFilterConfigFactory::createEmptyRouteConfigProto() {
30-
return std::make_unique<envoy::api::v2::filter::http::RouteTransformations>();
31-
}
32-
3334
Router::RouteSpecificFilterConfigConstSharedPtr
34-
TransformationFilterConfigFactory::createRouteSpecificFilterConfig(
35-
const Protobuf::Message &config, Server::Configuration::FactoryContext &) {
36-
const auto &proto_config =
37-
dynamic_cast<const envoy::api::v2::filter::http::RouteTransformations &>(
38-
config);
39-
return std::make_shared<const RouteTransformationFilterConfig>(proto_config);
35+
TransformationFilterConfigFactory::createRouteSpecificFilterConfigTyped(const RouteTransformationConfigProto& proto_config,
36+
Server::Configuration::FactoryContext&) {
37+
return std::make_shared<const RouteTransformationFilterConfig>(proto_config);
4038
}
4139

4240
/**

source/extensions/filters/http/transformation/transformation_filter_config_factory.h

+14-12
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "extensions/filters/http/common/empty_http_filter_config.h"
88
#include "extensions/filters/http/common/factory_base.h"
99
#include "extensions/filters/http/solo_well_known_names.h"
10+
#include "extensions/filters/http/transformation/transformation_filter_config.h"
1011

1112
#include "api/envoy/config/filter/http/transformation/v2/transformation_filter.pb.validate.h"
1213

@@ -15,21 +16,22 @@ namespace Extensions {
1516
namespace HttpFilters {
1617
namespace Transformation {
1718

18-
using Common::EmptyHttpFilterConfig;
19+
using Extensions::HttpFilters::Common::FactoryBase;
1920

20-
class TransformationFilterConfigFactory : public EmptyHttpFilterConfig {
21+
class TransformationFilterConfigFactory : public Common::FactoryBase<TransformationConfigProto, RouteTransformationConfigProto> {
2122
public:
2223
TransformationFilterConfigFactory()
23-
: EmptyHttpFilterConfig(SoloHttpFilterNames::get().Transformation) {}
24-
25-
ProtobufTypes::MessagePtr createEmptyRouteConfigProto() override;
26-
Router::RouteSpecificFilterConfigConstSharedPtr
27-
createRouteSpecificFilterConfig(
28-
const Protobuf::Message &,
29-
Server::Configuration::FactoryContext &) override;
30-
Http::FilterFactoryCb
31-
createFilter(const std::string &stat_prefix,
32-
Server::Configuration::FactoryContext &context) override;
24+
: FactoryBase(SoloHttpFilterNames::get().Transformation) {}
25+
26+
private:
27+
28+
Http::FilterFactoryCb createFilterFactoryFromProtoTyped(
29+
const TransformationConfigProto &proto_config, const std::string &stats_prefix,
30+
Server::Configuration::FactoryContext &context) override;
31+
32+
Router::RouteSpecificFilterConfigConstSharedPtr
33+
createRouteSpecificFilterConfigTyped(const RouteTransformationConfigProto&,
34+
Server::Configuration::FactoryContext&) override;
3335
};
3436

3537
} // namespace Transformation

0 commit comments

Comments
 (0)