Skip to content

Commit

Permalink
Make cdn_loop exception free (envoyproxy#38107)
Browse files Browse the repository at this point in the history
Commit Message: Make cdn_loop exception free
Additional Description:
Risk Level: low
Testing: unit tests
Docs Changes: n/a
Release Notes: n/a
Platform Specific Features: n/a

Signed-off-by: Takeshi Yoneda <[email protected]>
  • Loading branch information
mathetake authored Jan 21, 2025
1 parent 2b41333 commit 9dd80f2
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 14 deletions.
7 changes: 4 additions & 3 deletions source/extensions/filters/http/cdn_loop/config.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@ using ::Envoy::Extensions::HttpFilters::CdnLoop::Parser::parseCdnId;
using ::Envoy::Extensions::HttpFilters::CdnLoop::Parser::ParseContext;
using ::Envoy::Extensions::HttpFilters::CdnLoop::Parser::ParsedCdnId;

Http::FilterFactoryCb CdnLoopFilterFactory::createFilterFactoryFromProtoTyped(
absl::StatusOr<Http::FilterFactoryCb> CdnLoopFilterFactory::createFilterFactoryFromProtoTyped(
const envoy::extensions::filters::http::cdn_loop::v3::CdnLoopConfig& config,
const std::string& /*stats_prefix*/, Server::Configuration::FactoryContext& /*context*/) {
StatusOr<ParsedCdnId> context = parseCdnId(ParseContext(config.cdn_id()));
if (!context.ok() || !context->context().atEnd()) {
throw EnvoyException(fmt::format("Provided cdn_id \"{}\" is not a valid CDN identifier: {}",
config.cdn_id(), context.status()));
return absl::InvalidArgumentError(
fmt::format("Provided cdn_id \"{}\" is not a valid CDN identifier: {}", config.cdn_id(),
context.status().message()));
}
return [config](Http::FilterChainFactoryCallbacks& callbacks) -> void {
callbacks.addStreamDecoderFilter(
Expand Down
8 changes: 4 additions & 4 deletions source/extensions/filters/http/cdn_loop/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ namespace Extensions {
namespace HttpFilters {
namespace CdnLoop {

class CdnLoopFilterFactory
: public Common::FactoryBase<envoy::extensions::filters::http::cdn_loop::v3::CdnLoopConfig> {
class CdnLoopFilterFactory : public Common::ExceptionFreeFactoryBase<
envoy::extensions::filters::http::cdn_loop::v3::CdnLoopConfig> {
public:
CdnLoopFilterFactory() : FactoryBase("envoy.filters.http.cdn_loop") {}
CdnLoopFilterFactory() : ExceptionFreeFactoryBase("envoy.filters.http.cdn_loop") {}

private:
Http::FilterFactoryCb createFilterFactoryFromProtoTyped(
absl::StatusOr<Http::FilterFactoryCb> createFilterFactoryFromProtoTyped(
const envoy::extensions::filters::http::cdn_loop::v3::CdnLoopConfig& config,
const std::string& stats_prefix, Server::Configuration::FactoryContext& context) override;
};
Expand Down
15 changes: 9 additions & 6 deletions test/extensions/filters/http/cdn_loop/config_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,9 @@ TEST(CdnLoopFilterFactoryTest, InvalidCdnId) {
config.set_cdn_id("[not-token-or-ip");
CdnLoopFilterFactory factory;

EXPECT_THAT_THROWS_MESSAGE(factory.createFilterFactoryFromProto(config, "stats", context).value(),
EnvoyException, HasSubstr("is not a valid CDN identifier"));
auto status_or = factory.createFilterFactoryFromProto(config, "stats", context);
EXPECT_FALSE(status_or.ok());
EXPECT_THAT(status_or.status().message(), HasSubstr("is not a valid CDN identifier"));
}

TEST(CdnLoopFilterFactoryTest, InvalidCdnIdNonHeaderWhitespace) {
Expand All @@ -61,8 +62,9 @@ TEST(CdnLoopFilterFactoryTest, InvalidCdnIdNonHeaderWhitespace) {
config.set_cdn_id("\r\n");
CdnLoopFilterFactory factory;

EXPECT_THAT_THROWS_MESSAGE(factory.createFilterFactoryFromProto(config, "stats", context).value(),
EnvoyException, HasSubstr("is not a valid CDN identifier"));
auto status_or = factory.createFilterFactoryFromProto(config, "stats", context);
EXPECT_FALSE(status_or.ok());
EXPECT_THAT(status_or.status().message(), HasSubstr("is not a valid CDN identifier"));
}

TEST(CdnLoopFilterFactoryTest, InvalidParsedCdnIdNotInput) {
Expand All @@ -72,8 +74,9 @@ TEST(CdnLoopFilterFactoryTest, InvalidParsedCdnIdNotInput) {
config.set_cdn_id("cdn,cdn");
CdnLoopFilterFactory factory;

EXPECT_THAT_THROWS_MESSAGE(factory.createFilterFactoryFromProto(config, "stats", context).value(),
EnvoyException, HasSubstr("is not a valid CDN identifier"));
auto status_or = factory.createFilterFactoryFromProto(config, "stats", context);
EXPECT_FALSE(status_or.ok());
EXPECT_THAT(status_or.status().message(), HasSubstr("is not a valid CDN identifier"));
}

} // namespace CdnLoop
Expand Down
1 change: 0 additions & 1 deletion tools/code_format/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,6 @@ paths:
- source/extensions/filters/http/aws_lambda
- source/extensions/filters/http/basic_auth
- source/extensions/filters/http/cache
- source/extensions/filters/http/cdn_loop
- source/extensions/filters/http/common
- source/extensions/filters/http/composite
- source/extensions/filters/http/ext_authz
Expand Down

0 comments on commit 9dd80f2

Please sign in to comment.