diff --git a/CODEOWNERS b/CODEOWNERS index 70b75854270a..f01d75d63d15 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -343,8 +343,6 @@ extensions/filters/http/oauth2 @derekargueta @mattklein123 /*/extensions/geoip_providers/maxmind @nezdolik @ravenblackx # Match delegate extension /*/extensions/filters/http/match_delegate @wbpcode @jstraceski @tyxia -# Generic proxy and related extensions -/*/extensions/filters/network/generic_proxy/ @wbpcode @soulxu /*/extensions/health_checkers/common @zuercher @botengyao diff --git a/api/BUILD b/api/BUILD index 7a1db4f427aa..1a65a88f889e 100644 --- a/api/BUILD +++ b/api/BUILD @@ -81,7 +81,13 @@ proto_library( "//contrib/envoy/extensions/filters/http/squash/v3:pkg", "//contrib/envoy/extensions/filters/http/sxg/v3alpha:pkg", "//contrib/envoy/extensions/filters/network/client_ssl_auth/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/action/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3:pkg", "//contrib/envoy/extensions/filters/network/generic_proxy/codecs/kafka/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/router/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg", "//contrib/envoy/extensions/filters/network/golang/v3alpha:pkg", "//contrib/envoy/extensions/filters/network/kafka_broker/v3:pkg", "//contrib/envoy/extensions/filters/network/kafka_mesh/v3alpha:pkg", @@ -224,12 +230,6 @@ proto_library( "//envoy/extensions/filters/network/dubbo_proxy/v3:pkg", "//envoy/extensions/filters/network/echo/v3:pkg", "//envoy/extensions/filters/network/ext_authz/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/action/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/codecs/http1/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/router/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/v3:pkg", "//envoy/extensions/filters/network/http_connection_manager/v3:pkg", "//envoy/extensions/filters/network/local_ratelimit/v3:pkg", "//envoy/extensions/filters/network/mongo_proxy/v3:pkg", diff --git a/api/envoy/extensions/filters/network/generic_proxy/action/v3/BUILD b/api/contrib/envoy/extensions/filters/network/generic_proxy/action/v3/BUILD similarity index 100% rename from api/envoy/extensions/filters/network/generic_proxy/action/v3/BUILD rename to api/contrib/envoy/extensions/filters/network/generic_proxy/action/v3/BUILD diff --git a/api/envoy/extensions/filters/network/generic_proxy/action/v3/action.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/action/v3/action.proto similarity index 95% rename from api/envoy/extensions/filters/network/generic_proxy/action/v3/action.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/action/v3/action.proto index 3e1b7a790788..d7c3dd04df2e 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/action/v3/action.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/action/v3/action.proto @@ -16,7 +16,7 @@ import "validate/validate.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.action.v3"; option java_outer_classname = "ActionProto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/action/v3;actionv3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/action/v3;actionv3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/BUILD b/api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/BUILD similarity index 100% rename from api/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/BUILD rename to api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/BUILD diff --git a/api/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto similarity index 81% rename from api/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto index d5b6782e6662..47a2af159394 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.proto @@ -9,7 +9,7 @@ import "udpa/annotations/status.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.codecs.dubbo.v3"; option java_outer_classname = "DubboProto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3;dubbov3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3;dubbov3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/BUILD b/api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/BUILD similarity index 100% rename from api/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/BUILD rename to api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/BUILD diff --git a/api/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto similarity index 94% rename from api/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto index 2a57db6083f5..973a190d8138 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.proto @@ -11,7 +11,7 @@ import "udpa/annotations/status.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.codecs.http1.v3"; option java_outer_classname = "Http1Proto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3;http1v3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3;http1v3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/envoy/extensions/filters/network/generic_proxy/matcher/v3/BUILD b/api/contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/BUILD similarity index 100% rename from api/envoy/extensions/filters/network/generic_proxy/matcher/v3/BUILD rename to api/contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/BUILD diff --git a/api/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto similarity index 95% rename from api/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto index 13990866e0fd..2490a0b9bffd 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.proto @@ -12,7 +12,7 @@ import "validate/validate.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.matcher.v3"; option java_outer_classname = "MatcherProto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/matcher/v3;matcherv3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3;matcherv3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/envoy/extensions/filters/network/generic_proxy/router/v3/BUILD b/api/contrib/envoy/extensions/filters/network/generic_proxy/router/v3/BUILD similarity index 100% rename from api/envoy/extensions/filters/network/generic_proxy/router/v3/BUILD rename to api/contrib/envoy/extensions/filters/network/generic_proxy/router/v3/BUILD diff --git a/api/envoy/extensions/filters/network/generic_proxy/router/v3/router.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.proto similarity index 93% rename from api/envoy/extensions/filters/network/generic_proxy/router/v3/router.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.proto index 67f14fecfd33..a7064152354e 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/router/v3/router.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.proto @@ -9,7 +9,7 @@ import "udpa/annotations/status.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.router.v3"; option java_outer_classname = "RouterProto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/router/v3;routerv3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/router/v3;routerv3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/envoy/extensions/filters/network/generic_proxy/v3/BUILD b/api/contrib/envoy/extensions/filters/network/generic_proxy/v3/BUILD similarity index 100% rename from api/envoy/extensions/filters/network/generic_proxy/v3/BUILD rename to api/contrib/envoy/extensions/filters/network/generic_proxy/v3/BUILD diff --git a/api/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto similarity index 92% rename from api/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto index 9ae2560470cf..7e35eabdb54c 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.proto @@ -2,10 +2,10 @@ syntax = "proto3"; package envoy.extensions.filters.network.generic_proxy.v3; +import "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.proto"; import "envoy/config/accesslog/v3/accesslog.proto"; import "envoy/config/core/v3/config_source.proto"; import "envoy/config/core/v3/extension.proto"; -import "envoy/extensions/filters/network/generic_proxy/v3/route.proto"; import "envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.proto"; import "xds/annotations/v3/status.proto"; @@ -16,7 +16,7 @@ import "validate/validate.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.v3"; option java_outer_classname = "GenericProxyProto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/v3;generic_proxyv3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/v3;generic_proxyv3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/envoy/extensions/filters/network/generic_proxy/v3/route.proto b/api/contrib/envoy/extensions/filters/network/generic_proxy/v3/route.proto similarity index 97% rename from api/envoy/extensions/filters/network/generic_proxy/v3/route.proto rename to api/contrib/envoy/extensions/filters/network/generic_proxy/v3/route.proto index c29826618d04..2ac8b0f93377 100644 --- a/api/envoy/extensions/filters/network/generic_proxy/v3/route.proto +++ b/api/contrib/envoy/extensions/filters/network/generic_proxy/v3/route.proto @@ -11,7 +11,7 @@ import "validate/validate.proto"; option java_package = "io.envoyproxy.envoy.extensions.filters.network.generic_proxy.v3"; option java_outer_classname = "RouteProto"; option java_multiple_files = true; -option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/generic_proxy/v3;generic_proxyv3"; +option go_package = "github.com/envoyproxy/go-control-plane/contrib/envoy/extensions/filters/network/generic_proxy/v3;generic_proxyv3"; option (udpa.annotations.file_status).package_version_status = ACTIVE; option (xds.annotations.v3.file_status).work_in_progress = true; diff --git a/api/versioning/BUILD b/api/versioning/BUILD index 96791470d5df..97772178dd97 100644 --- a/api/versioning/BUILD +++ b/api/versioning/BUILD @@ -19,7 +19,13 @@ proto_library( "//contrib/envoy/extensions/filters/http/squash/v3:pkg", "//contrib/envoy/extensions/filters/http/sxg/v3alpha:pkg", "//contrib/envoy/extensions/filters/network/client_ssl_auth/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/action/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3:pkg", "//contrib/envoy/extensions/filters/network/generic_proxy/codecs/kafka/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/router/v3:pkg", + "//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg", "//contrib/envoy/extensions/filters/network/golang/v3alpha:pkg", "//contrib/envoy/extensions/filters/network/kafka_broker/v3:pkg", "//contrib/envoy/extensions/filters/network/kafka_mesh/v3alpha:pkg", @@ -162,12 +168,6 @@ proto_library( "//envoy/extensions/filters/network/dubbo_proxy/v3:pkg", "//envoy/extensions/filters/network/echo/v3:pkg", "//envoy/extensions/filters/network/ext_authz/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/action/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/codecs/http1/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/router/v3:pkg", - "//envoy/extensions/filters/network/generic_proxy/v3:pkg", "//envoy/extensions/filters/network/http_connection_manager/v3:pkg", "//envoy/extensions/filters/network/local_ratelimit/v3:pkg", "//envoy/extensions/filters/network/mongo_proxy/v3:pkg", diff --git a/contrib/contrib_build_config.bzl b/contrib/contrib_build_config.bzl index 905788c00eca..7be1cd02ffad 100644 --- a/contrib/contrib_build_config.bzl +++ b/contrib/contrib_build_config.bzl @@ -27,6 +27,7 @@ CONTRIB_EXTENSIONS = { "envoy.filters.network.mysql_proxy": "//contrib/mysql_proxy/filters/network/source:config", "envoy.filters.network.postgres_proxy": "//contrib/postgres_proxy/filters/network/source:config", "envoy.filters.network.rocketmq_proxy": "//contrib/rocketmq_proxy/filters/network/source:config", + "envoy.filters.network.generic_proxy": "//contrib/generic_proxy/filters/network/source:config", "envoy.filters.network.golang": "//contrib/golang/filters/network/source:config", # @@ -70,6 +71,9 @@ CONTRIB_EXTENSIONS = { # # Extensions for generic proxy # + "envoy.filters.generic.router": "//contrib/generic_proxy/filters/network/source/router:config", + "envoy.generic_proxy.codecs.dubbo": "//contrib/generic_proxy/filters/network/source/codecs/dubbo:config", + "envoy.generic_proxy.codecs.http1": "//contrib/generic_proxy/filters/network/source/codecs/http1:config", "envoy.generic_proxy.codecs.kafka": "//contrib/generic_proxy/filters/network/source/codecs/kafka:config", # diff --git a/contrib/extensions_metadata.yaml b/contrib/extensions_metadata.yaml index 4b704af159df..76218e5a2b85 100644 --- a/contrib/extensions_metadata.yaml +++ b/contrib/extensions_metadata.yaml @@ -118,6 +118,25 @@ envoy.xds_delegates.kv_store: - envoy.xds_delegates security_posture: data_plane_agnostic status: wip +envoy.filters.network.generic_proxy: + categories: + - envoy.filters.network + security_posture: requires_trusted_downstream_and_upstream + status: wip +envoy.filters.generic.router: + categories: + - envoy.generic_proxy.filters + security_posture: requires_trusted_downstream_and_upstream + status: wip + type_urls: + - envoy.extensions.filters.network.generic_proxy.router.v3.Router +envoy.generic_proxy.codecs.dubbo: + categories: + - envoy.generic_proxy.codecs + security_posture: requires_trusted_downstream_and_upstream + status: wip + type_urls: + - envoy.extensions.filters.network.generic_proxy.codecs.dubbo.v3.DubboCodecConfig envoy.generic_proxy.codecs.kafka: categories: - envoy.generic_proxy.codecs @@ -125,6 +144,13 @@ envoy.generic_proxy.codecs.kafka: status: wip type_urls: - envoy.extensions.filters.network.generic_proxy.codecs.kafka.v3.KafkaCodecConfig +envoy.generic_proxy.codecs.http1: + categories: + - envoy.generic_proxy.codecs + security_posture: requires_trusted_downstream_and_upstream + status: wip + type_urls: + - envoy.extensions.filters.network.generic_proxy.codecs.http1.v3.Http1CodecConfig envoy.router.cluster_specifier_plugin.golang: categories: - envoy.router.cluster_specifier_plugin diff --git a/source/extensions/filters/network/generic_proxy/BUILD b/contrib/generic_proxy/filters/network/source/BUILD similarity index 56% rename from source/extensions/filters/network/generic_proxy/BUILD rename to contrib/generic_proxy/filters/network/source/BUILD index 7559e538ed05..e98163938231 100644 --- a/source/extensions/filters/network/generic_proxy/BUILD +++ b/contrib/generic_proxy/filters/network/source/BUILD @@ -1,13 +1,13 @@ load( "//bazel:envoy_build_system.bzl", - "envoy_cc_extension", + "envoy_cc_contrib_extension", "envoy_cc_library", - "envoy_extension_package", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_extension_package() +envoy_contrib_package() envoy_cc_library( name = "proxy_lib", @@ -18,11 +18,13 @@ envoy_cc_library( "proxy.h", ], deps = [ - ":proxy_config_interface", ":rds_lib", ":route_lib", ":stats_lib", ":tracing_lib", + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", + "//contrib/generic_proxy/filters/network/source/interface:proxy_config_interface", + "//contrib/generic_proxy/filters/network/source/router:router_lib", "//envoy/network:filter_interface", "//envoy/server:factory_context_interface", "//envoy/stats:timespan_interface", @@ -34,14 +36,12 @@ envoy_cc_library( "//source/common/tracing:tracer_lib", "//source/common/tracing:tracer_manager_lib", "//source/extensions/filters/network/common:factory_base_lib", - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", - "//source/extensions/filters/network/generic_proxy/router:router_lib", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", "@envoy_api//envoy/config/core/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", ], ) -envoy_cc_extension( +envoy_cc_contrib_extension( name = "config", srcs = [ "config.cc", @@ -51,34 +51,35 @@ envoy_cc_extension( ], deps = [ ":proxy_lib", + "//contrib/generic_proxy/filters/network/source/router:config", "//envoy/server:filter_config_interface", "//source/common/access_log:access_log_lib", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", ], ) envoy_cc_library( name = "route_lib", srcs = [ - "route_impl.cc", + "route.cc", ], hdrs = [ - "route_impl.h", + "route.h", ], deps = [ ":match_lib", - ":route_interface", + "//contrib/generic_proxy/filters/network/source/interface:config_interface", + "//contrib/generic_proxy/filters/network/source/interface:route_interface", "//envoy/server:factory_context_interface", "//source/common/common:matchers_lib", "//source/common/config:metadata_lib", "//source/common/config:utility_lib", "//source/common/http:header_utility_lib", "//source/common/matcher:matcher_lib", - "//source/extensions/filters/network/generic_proxy/interface:filter_interface", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/action/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", "@envoy_api//envoy/config/core/v3:pkg_cc_proto", "@envoy_api//envoy/config/route/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/action/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", ], ) @@ -92,9 +93,9 @@ envoy_cc_library( ], deps = [ ":match_input_lib", + "//contrib/generic_proxy/filters/network/source/interface:stream_interface", "//source/common/matcher:matcher_lib", - "//source/extensions/filters/network/generic_proxy/interface:stream_interface", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3:pkg_cc_proto", ], alwayslink = 1, ) @@ -105,8 +106,8 @@ envoy_cc_library( "match_input.h", ], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:stream_interface", "//envoy/stream_info:stream_info_interface", - "//source/extensions/filters/network/generic_proxy/interface:stream_interface", ], ) @@ -115,7 +116,7 @@ envoy_cc_library( hdrs = ["rds.h"], deps = [ "//envoy/rds:rds_interface", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", ], ) @@ -129,7 +130,7 @@ envoy_cc_library( ":route_lib", "//envoy/rds:rds_interface", "//source/common/rds:rds_lib", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", ], ) @@ -170,7 +171,7 @@ envoy_cc_library( ], deps = [ ":file_access_log_lib", - "//source/extensions/filters/network/generic_proxy/interface:stream_interface", + "//contrib/generic_proxy/filters/network/source/interface:stream_interface", ], # Ensure this factory in the source is always linked in. alwayslink = 1, @@ -190,64 +191,8 @@ envoy_cc_library( "abseil_status", ], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:stream_interface", "//envoy/common:pure_lib", "//envoy/tracing:trace_context_interface", - "//source/extensions/filters/network/generic_proxy/interface:stream_interface", - ], -) - -envoy_cc_library( - name = "codec_callbacks_interface", - hdrs = [ - "codec_callbacks.h", - ], - deps = [ - ":route_interface", - "//envoy/buffer:buffer_interface", - "//envoy/network:drain_decision_interface", - ], -) - -envoy_cc_library( - name = "route_interface", - hdrs = [ - "route.h", - ], - deps = [ - "//envoy/config:typed_metadata_interface", - "//envoy/event:dispatcher_interface", - "//envoy/network:connection_interface", - "//envoy/rds:rds_config_interface", - "//envoy/router:router_interface", - "//envoy/stream_info:stream_info_interface", - "//source/extensions/filters/network/generic_proxy:match_input_lib", - "//source/extensions/filters/network/generic_proxy/interface:stream_interface", - "@envoy_api//envoy/config/core/v3:pkg_cc_proto", - ], -) - -envoy_cc_library( - name = "proxy_config_interface", - hdrs = [ - "proxy_config.h", - ], - deps = [ - ":route_interface", - "//envoy/tracing:trace_config_interface", - "//envoy/tracing:tracer_interface", - "//source/extensions/filters/network/generic_proxy:access_log_lib", - "//source/extensions/filters/network/generic_proxy:match_input_lib", - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", - "//source/extensions/filters/network/generic_proxy/interface:filter_interface", - ], -) - -envoy_cc_library( - name = "filter_callbacks_interface", - hdrs = [ - "filter_callbacks.h", - ], - deps = [ - ":route_interface", ], ) diff --git a/source/extensions/filters/network/generic_proxy/access_log.cc b/contrib/generic_proxy/filters/network/source/access_log.cc similarity index 94% rename from source/extensions/filters/network/generic_proxy/access_log.cc rename to contrib/generic_proxy/filters/network/source/access_log.cc index 67402011fa57..b1398d34a42b 100644 --- a/source/extensions/filters/network/generic_proxy/access_log.cc +++ b/contrib/generic_proxy/filters/network/source/access_log.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/access_log.h" +#include "contrib/generic_proxy/filters/network/source/access_log.h" #include "envoy/registry/registry.h" @@ -146,7 +146,10 @@ class SimpleCommandParser : public CommandParser { return std::string(optional_view.value()); }); }}, - {"GENERIC_RESPONSE_CODE", + // A formatter for the response status code. This supports the case where the response + // code is minus value and will override the common RESPONSE_CODE formatter for generic + // proxy. + {"RESPONSE_CODE", [](absl::string_view, absl::optional) -> FormatterProviderPtr { return std::make_unique(); }}, @@ -165,7 +168,7 @@ namespace Formatter { using FormatterContext = Extensions::NetworkFilters::GenericProxy::FormatterContext; using SimpleCommandParser = Extensions::NetworkFilters::GenericProxy::SimpleCommandParser; -// Register the built-in command parsers for the FormatterContext. +// Regiter the built-in command parsers for the FormatterContext. REGISTER_BUILT_IN_COMMAND_PARSER(FormatterContext, SimpleCommandParser); } // namespace Formatter diff --git a/source/extensions/filters/network/generic_proxy/access_log.h b/contrib/generic_proxy/filters/network/source/access_log.h similarity index 94% rename from source/extensions/filters/network/generic_proxy/access_log.h rename to contrib/generic_proxy/filters/network/source/access_log.h index dba0a2dbd4ee..3c8dbf11b00c 100644 --- a/source/extensions/filters/network/generic_proxy/access_log.h +++ b/contrib/generic_proxy/filters/network/source/access_log.h @@ -1,7 +1,7 @@ #pragma once -#include "source/extensions/filters/network/generic_proxy/file_access_log.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" +#include "contrib/generic_proxy/filters/network/source/file_access_log.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" namespace Envoy { namespace Extensions { diff --git a/contrib/generic_proxy/filters/network/source/codecs/dubbo/BUILD b/contrib/generic_proxy/filters/network/source/codecs/dubbo/BUILD new file mode 100644 index 000000000000..4533271d4701 --- /dev/null +++ b/contrib/generic_proxy/filters/network/source/codecs/dubbo/BUILD @@ -0,0 +1,24 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_contrib_extension", + "envoy_contrib_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_contrib_package() + +envoy_cc_contrib_extension( + name = "config", + srcs = [ + "config.cc", + ], + hdrs = [ + "config.h", + ], + deps = [ + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", + "//source/extensions/common/dubbo:codec_lib", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3:pkg_cc_proto", + ], +) diff --git a/source/extensions/filters/network/generic_proxy/codecs/dubbo/config.cc b/contrib/generic_proxy/filters/network/source/codecs/dubbo/config.cc similarity index 98% rename from source/extensions/filters/network/generic_proxy/codecs/dubbo/config.cc rename to contrib/generic_proxy/filters/network/source/codecs/dubbo/config.cc index d6ac161c4364..ef172852d55d 100644 --- a/source/extensions/filters/network/generic_proxy/codecs/dubbo/config.cc +++ b/contrib/generic_proxy/filters/network/source/codecs/dubbo/config.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/codecs/dubbo/config.h" +#include "contrib/generic_proxy/filters/network/source/codecs/dubbo/config.h" #include diff --git a/source/extensions/filters/network/generic_proxy/codecs/dubbo/config.h b/contrib/generic_proxy/filters/network/source/codecs/dubbo/config.h similarity index 88% rename from source/extensions/filters/network/generic_proxy/codecs/dubbo/config.h rename to contrib/generic_proxy/filters/network/source/codecs/dubbo/config.h index a64cee717131..379784363c15 100644 --- a/source/extensions/filters/network/generic_proxy/codecs/dubbo/config.h +++ b/contrib/generic_proxy/filters/network/source/codecs/dubbo/config.h @@ -2,12 +2,12 @@ #include -#include "envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.validate.h" - #include "source/common/common/logger.h" #include "source/extensions/common/dubbo/codec.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/codecs/dubbo/v3/dubbo.pb.validate.h" +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" namespace Envoy { namespace Extensions { @@ -28,12 +28,14 @@ class DubboRequest : public Request { ASSERT(inner_metadata_ != nullptr); ASSERT(inner_metadata_->hasContext()); ASSERT(inner_metadata_->hasRequest()); - ASSERT(!inner_metadata_->heartbeat()); // Heartbeat should be handled by codec directly. uint32_t frame_flags = FrameFlags::FLAG_END_STREAM; // Dubbo message only has one frame. if (!inner_metadata_->context().isTwoWay()) { frame_flags |= FrameFlags::FLAG_ONE_WAY; } + if (inner_metadata_->context().heartbeat()) { + frame_flags |= FrameFlags::FLAG_HEARTBEAT; + } stream_frame_flags_ = {static_cast(inner_metadata_->requestId()), frame_flags}; } @@ -64,11 +66,17 @@ class DubboResponse : public Response { ASSERT(inner_metadata_ != nullptr); ASSERT(inner_metadata_->hasContext()); ASSERT(inner_metadata_->hasResponse()); - ASSERT(!inner_metadata_->heartbeat()); // Heartbeat should be handled by codec directly. - refreshStatus(); - stream_frame_flags_ = {static_cast(inner_metadata_->requestId())}; + uint32_t frame_flags = FrameFlags::FLAG_END_STREAM; // Dubbo message only has one frame. + if (!inner_metadata_->context().isTwoWay()) { + frame_flags |= FrameFlags::FLAG_ONE_WAY; + } + if (inner_metadata_->context().heartbeat()) { + frame_flags |= FrameFlags::FLAG_HEARTBEAT; + } + + stream_frame_flags_ = {static_cast(inner_metadata_->requestId()), frame_flags}; } void refreshStatus(); @@ -106,7 +114,7 @@ class DubboDecoderBase : public DubboCodecBase, public CodecType { metadata_ = std::make_shared(); } - TRY_NEEDS_AUDIT { + try { Common::Dubbo::DecodeStatus decode_status{Common::Dubbo::DecodeStatus::Success}; if (!metadata_->hasContext()) { ENVOY_LOG(debug, "Dubbo codec: try to decode new dubbo request/response header"); @@ -119,8 +127,12 @@ class DubboDecoderBase : public DubboCodecBase, public CodecType { decode_status = codec_->decodeData(buffer, *metadata_); } - // Ignore DecodeStatus::Failure as the codec will never return it. - // TODO(wbpcode): make the codec exception free and handle the error status of the codec. + if (decode_status == Common::Dubbo::DecodeStatus::Failure) { + ENVOY_LOG(warn, "Dubbo codec: unexpected decoding error"); + metadata_.reset(); + callback_->onDecodingFailure(); + return Common::Dubbo::DecodeStatus::Failure; + } if (decode_status == Common::Dubbo::DecodeStatus::Waiting) { ENVOY_LOG(debug, "Dubbo codec: waiting for more input data"); @@ -152,8 +164,7 @@ class DubboDecoderBase : public DubboCodecBase, public CodecType { callback_->onDecodingSuccess(std::move(message)); return Common::Dubbo::DecodeStatus::Success; - } - END_TRY catch (const EnvoyException& error) { + } catch (const EnvoyException& error) { ENVOY_LOG(warn, "Dubbo codec: decoding error: {}", error.what()); metadata_.reset(); diff --git a/source/extensions/filters/network/generic_proxy/codecs/http1/BUILD b/contrib/generic_proxy/filters/network/source/codecs/http1/BUILD similarity index 59% rename from source/extensions/filters/network/generic_proxy/codecs/http1/BUILD rename to contrib/generic_proxy/filters/network/source/codecs/http1/BUILD index 3c5925ff783d..adbc830baa9d 100644 --- a/source/extensions/filters/network/generic_proxy/codecs/http1/BUILD +++ b/contrib/generic_proxy/filters/network/source/codecs/http1/BUILD @@ -1,14 +1,14 @@ load( "//bazel:envoy_build_system.bzl", - "envoy_cc_extension", - "envoy_extension_package", + "envoy_cc_contrib_extension", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_extension_package() +envoy_contrib_package() -envoy_cc_extension( +envoy_cc_contrib_extension( name = "config", srcs = [ "config.cc", @@ -17,12 +17,12 @@ envoy_cc_extension( "config.h", ], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", "//source/common/http:codes_lib", "//source/common/http:header_utility_lib", "//source/common/http:headers_lib", "//source/common/http:utility_lib", "//source/common/http/http1:balsa_parser_lib", - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/codecs/http1/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3:pkg_cc_proto", ], ) diff --git a/source/extensions/filters/network/generic_proxy/codecs/http1/config.cc b/contrib/generic_proxy/filters/network/source/codecs/http1/config.cc similarity index 90% rename from source/extensions/filters/network/generic_proxy/codecs/http1/config.cc rename to contrib/generic_proxy/filters/network/source/codecs/http1/config.cc index 49e336e3c274..c5167e14fb5f 100644 --- a/source/extensions/filters/network/generic_proxy/codecs/http1/config.cc +++ b/contrib/generic_proxy/filters/network/source/codecs/http1/config.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/codecs/http1/config.h" +#include "contrib/generic_proxy/filters/network/source/codecs/http1/config.h" #include "source/common/http/codes.h" #include "source/common/http/header_utility.h" @@ -28,7 +28,6 @@ static constexpr uint32_t DEFAULT_MAX_BUFFER_SIZE = 8 * 1024 * 1024; static constexpr absl::string_view _100_CONTINUE_RESPONSE = "HTTP/1.1 100 Continue\r\n" "content-length: 0\r\n" "\r\n"; -static constexpr absl::string_view ZERO_VIEW = "0"; void encodeNormalHeaders(Buffer::Instance& buffer, const Http::RequestOrResponseHeaderMap& headers, bool chunk_encoding) { @@ -50,7 +49,7 @@ void encodeNormalHeaders(Buffer::Instance& buffer, const Http::RequestOrResponse if (chunk_encoding) { if (headers.TransferEncoding() == nullptr) { - buffer.add("transfer-encoding: chunked\r\n"); + buffer.add("Transfer-Encoding: chunked\r\n"); } } } @@ -118,7 +117,8 @@ absl::Status Utility::validateRequestHeaders(Http::RequestHeaderMap& headers) { return absl::OkStatus(); } -absl::Status Utility::validateResponseHeaders(Http::ResponseHeaderMap& headers, Http::Code code) { +absl::Status Utility::validateResponseHeaders(Http::ResponseHeaderMap& headers, + Envoy::Http::Code code) { if (auto status = validateCommonHeaders(headers); !status.ok()) { return status; } @@ -126,18 +126,21 @@ absl::Status Utility::validateResponseHeaders(Http::ResponseHeaderMap& headers, ASSERT(headers.Status() != nullptr); if (code < Http::Code::OK || code == Http::Code::NoContent || code == Http::Code::NotModified) { - // 1xx, 204 responses should not have transfer-encoding. See - // https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-6. - // There is no clear description in the RFC about the transfer-encoding behavior of NotModified - // response. But it is safe to treat it as same as 1xx and 204 responses. - if (headers.TransferEncoding() != nullptr) { - return absl::InvalidArgumentError("transfer-encoding is set for 1xx/204/304 response"); + // There is no clear description in the RFC about the transfer-encoding behavior + // of NotModified response. But 1xx, 204 responses should not have transfer-encoding. + // See https://datatracker.ietf.org/doc/html/rfc9112#section-6.1-6 + if (code != Http::Code::NotModified) { + if (headers.TransferEncoding() != nullptr) { + return absl::InvalidArgumentError("transfer-encoding is set for 1xx, 204 response"); + } } // 1xx, 204, 304 responses should not have body. - const auto content_length = headers.ContentLength(); - if (content_length != nullptr && content_length->value().getStringView() != ZERO_VIEW) { - return absl::InvalidArgumentError("non-zero content-length is set for 1xx/204/304 response"); + if (headers.ContentLength() != nullptr) { + if (headers.ContentLength()->value().getStringView() != "0") { + return absl::InvalidArgumentError( + "content-length (non-zero) is set for 1xx, 204, 304 response"); + } } } @@ -277,49 +280,51 @@ bool Http1CodecBase::decodeBuffer(Buffer::Instance& buffer) { const auto slice = decoding_buffer_.frontSlice(); const auto nread = parser_->execute(static_cast(slice.mem_), slice.len_); decoding_buffer_.drain(nread); + const auto status = parser_->getStatus(); - if (const auto status = parser_->getStatus(); status == Http::Http1::ParserStatus::Error) { - // Parser has encountered an error. Return false to indicate decoding failure. Ignore the - // buffered body. + // Parser is paused by the callback. Do nothing and return. Don't handle the buffered body + // because parser is paused and no callback should be called. + if (status == Http::Http1::ParserStatus::Paused) { + return true; + } + // Parser has encountered an error. Return false to indicate decoding failure. Ignore the + // buffered body. + if (status == Http::Http1::ParserStatus::Error) { + // Decoding error. return false; - } else if (status == Http::Http1::ParserStatus::Paused || nread == 0) { - // If parser is paused by the callback. Do nothing and return. Don't handle the buffered body - // because parser is paused and no callback should be called. - // If consumed buffer size is 0 means no more data to read, break to avoid infinite loop. This - // is preventive check. The parser should not be in this state in normal cases. + } + // No more data to read and parser is not paused, break to avoid infinite loop. This is + // preventive check. The parser should not be in this state in normal cases. + if (nread == 0) { return true; } } - - // Try to dispatch any buffered body. We assume the headers should be handled in the callbacks. - // And if the headers are not handled then the buffered body should be empty, this should be a - // no-op. And if the message is complete then this will also be a no-op. - return dispatchBufferedBody(false); + // Try to dispatch any buffered body. If the message is complete then this will be a no-op. + dispatchBufferedBody(false); + return true; } -bool Http1CodecBase::dispatchBufferedBody(bool end_stream) { +void Http1CodecBase::dispatchBufferedBody(bool end_stream) { if (single_frame_mode_) { - // Do nothing to the buffered body until the onMessageComplete callback if we are in single - // frame mode. + // Do nothing until the onMessageComplete callback if we are in single frame mode. // Check if the buffered body is too large. if (bufferedBodyOverflow()) { // Pause the parser to avoid further parsing. parser_->pause(); // Tell the caller that the decoding failed. - return false; + onDecodingFailure(); } - return true; + return; } if (buffered_body_.length() > 0 || end_stream) { - ENVOY_LOG(debug, "Generic proxy HTTP1 codec: decoding message body (end_stream={} size={})", + ENVOY_LOG(debug, + "Generic proxy HTTP1 codec: decoding request/response body (end_stream={} size={})", end_stream, buffered_body_.length()); auto frame = std::make_unique(buffered_body_, end_stream); onDecodingSuccess(std::move(frame)); } - - return true; } bool Http1CodecBase::bufferedBodyOverflow() { @@ -363,7 +368,6 @@ Http::Http1::CallbackResult Http1ServerCodec::onHeadersCompleteImpl() { } const bool non_end_stream = Utility::hasBody(*parser_, false, false); - active_request_->request_has_body_ = non_end_stream; ENVOY_LOG(debug, "decoding request headers complete (end_stream={}):\n{}", !non_end_stream, *active_request_->request_headers_); @@ -431,11 +435,6 @@ Http::Http1::CallbackResult Http1ServerCodec::onMessageCompleteImpl() { } EncodingResult Http1ServerCodec::encode(const StreamFrame& frame, EncodingContext&) { - if (!active_request_.has_value()) { - ENVOY_LOG(debug, "Generic proxy HTTP1 server codec: no request for coming response"); - return absl::InvalidArgumentError("no request for coming response"); - } - const bool response_end_stream = frame.frameFlags().endStream(); if (auto* headers = dynamic_cast(&frame); headers != nullptr) { @@ -475,6 +474,11 @@ EncodingResult Http1ServerCodec::encode(const StreamFrame& frame, EncodingContex ASSERT(encoding_buffer_.length() == 0); if (response_end_stream) { + if (!active_request_.has_value()) { + ENVOY_LOG(debug, "Generic proxy HTTP1 server codec: response complete without request"); + return absl::InvalidArgumentError("response complete without request"); + } + if (!active_request_->request_complete_) { ENVOY_LOG(debug, "Generic proxy HTTP1 server codec: response complete before request complete"); @@ -567,7 +571,7 @@ Http::Http1::CallbackResult Http1ClientCodec::onHeadersCompleteImpl() { } const bool non_end_stream = Utility::hasBody(*parser_, true, expect_response_->head_request_); - expect_response_->response_has_body_ = non_end_stream; + ENVOY_LOG(debug, "decoding response headers complete (end_stream={}):\n{}", !non_end_stream, *expect_response_->response_headers_); diff --git a/source/extensions/filters/network/generic_proxy/codecs/http1/config.h b/contrib/generic_proxy/filters/network/source/codecs/http1/config.h similarity index 96% rename from source/extensions/filters/network/generic_proxy/codecs/http1/config.h rename to contrib/generic_proxy/filters/network/source/codecs/http1/config.h index ab9fd0206276..f96223bcb35b 100644 --- a/source/extensions/filters/network/generic_proxy/codecs/http1/config.h +++ b/contrib/generic_proxy/filters/network/source/codecs/http1/config.h @@ -1,12 +1,12 @@ #pragma once -#include "envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.h" - #include "source/common/buffer/buffer_impl.h" #include "source/common/http/header_map_impl.h" #include "source/common/http/http1/balsa_parser.h" #include "source/common/http/http1/parser.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/codecs/http1/v3/http1.pb.h" +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" namespace Envoy { namespace Extensions { @@ -144,21 +144,15 @@ class Utility { static uint64_t statusToHttpStatus(absl::StatusCode status_code); }; -// ActiveRequest is used to store the state of server codec for decoding a request -// and encoding a response. struct ActiveRequest { Http::RequestHeaderMapPtr request_headers_; - bool request_has_body_{}; bool request_complete_{}; bool response_chunk_encoding_{}; }; -// ExpectResponse is used to store the state of client codec for decoding a response -// and encoding a request. struct ExpectResponse { Http::ResponseHeaderMapPtr response_headers_; - bool response_has_body_{}; bool request_complete_{}; bool head_request_{}; @@ -251,7 +245,7 @@ class Http1CodecBase : public Http::Http1::ParserCallbacks, bool decodeBuffer(Buffer::Instance& buffer); - bool dispatchBufferedBody(bool end_stream); + void dispatchBufferedBody(bool end_stream); bool bufferedBodyOverflow(); virtual Http::HeaderMap& headerMap() PURE; @@ -302,7 +296,7 @@ class Http1ServerCodec : public Http1CodecBase, public ServerCodec { void setCodecCallbacks(ServerCodecCallbacks& callbacks) override { callbacks_ = &callbacks; } void decode(Envoy::Buffer::Instance& buffer, bool) override { if (!decodeBuffer(buffer)) { - onDecodingFailure(); + callbacks_->onDecodingFailure(); } } EncodingResult encode(const StreamFrame& frame, EncodingContext& ctx) override; @@ -363,7 +357,7 @@ class Http1ClientCodec : public Http1CodecBase, public ClientCodec { void setCodecCallbacks(ClientCodecCallbacks& callbacks) override { callbacks_ = &callbacks; } void decode(Envoy::Buffer::Instance& buffer, bool) override { if (!decodeBuffer(buffer)) { - onDecodingFailure(); + callbacks_->onDecodingFailure(); } } EncodingResult encode(const StreamFrame& frame, EncodingContext& ctx) override; diff --git a/contrib/generic_proxy/filters/network/source/codecs/kafka/BUILD b/contrib/generic_proxy/filters/network/source/codecs/kafka/BUILD index e96582eba3a1..807d8a1c160b 100644 --- a/contrib/generic_proxy/filters/network/source/codecs/kafka/BUILD +++ b/contrib/generic_proxy/filters/network/source/codecs/kafka/BUILD @@ -17,9 +17,9 @@ envoy_cc_contrib_extension( "config.h", ], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", "//contrib/kafka/filters/network/source:kafka_request_codec_lib", "//contrib/kafka/filters/network/source:kafka_response_codec_lib", - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/codecs/kafka/v3:pkg_cc_proto", ], ) diff --git a/contrib/generic_proxy/filters/network/source/codecs/kafka/config.h b/contrib/generic_proxy/filters/network/source/codecs/kafka/config.h index 44b59895af3b..b4b9f9d65ff6 100644 --- a/contrib/generic_proxy/filters/network/source/codecs/kafka/config.h +++ b/contrib/generic_proxy/filters/network/source/codecs/kafka/config.h @@ -1,9 +1,9 @@ #pragma once #include "source/common/buffer/buffer_impl.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" #include "contrib/envoy/extensions/filters/network/generic_proxy/codecs/kafka/v3/kafka.pb.h" +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" #include "contrib/kafka/filters/network/source/request_codec.h" #include "contrib/kafka/filters/network/source/response_codec.h" diff --git a/source/extensions/filters/network/generic_proxy/config.cc b/contrib/generic_proxy/filters/network/source/config.cc similarity index 97% rename from source/extensions/filters/network/generic_proxy/config.cc rename to contrib/generic_proxy/filters/network/source/config.cc index dd43702e0432..6a10fd79446d 100644 --- a/source/extensions/filters/network/generic_proxy/config.cc +++ b/contrib/generic_proxy/filters/network/source/config.cc @@ -1,11 +1,11 @@ -#include "source/extensions/filters/network/generic_proxy/config.h" +#include "contrib/generic_proxy/filters/network/source/config.h" #include "source/common/access_log/access_log_impl.h" #include "source/common/tracing/tracer_manager_impl.h" -#include "source/extensions/filters/network/generic_proxy/rds.h" -#include "source/extensions/filters/network/generic_proxy/rds_impl.h" #include "access_log.h" +#include "contrib/generic_proxy/filters/network/source/rds.h" +#include "contrib/generic_proxy/filters/network/source/rds_impl.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/config.h b/contrib/generic_proxy/filters/network/source/config.h similarity index 81% rename from source/extensions/filters/network/generic_proxy/config.h rename to contrib/generic_proxy/filters/network/source/config.h index 8708223d1e65..b6d59b69a454 100644 --- a/source/extensions/filters/network/generic_proxy/config.h +++ b/contrib/generic_proxy/filters/network/source/config.h @@ -1,12 +1,13 @@ #pragma once -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" #include "envoy/registry/registry.h" #include "source/extensions/filters/network/common/factory_base.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/proxy.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" +#include "contrib/generic_proxy/filters/network/source/interface/config.h" +#include "contrib/generic_proxy/filters/network/source/proxy.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/file_access_log.h b/contrib/generic_proxy/filters/network/source/file_access_log.h similarity index 100% rename from source/extensions/filters/network/generic_proxy/file_access_log.h rename to contrib/generic_proxy/filters/network/source/file_access_log.h diff --git a/contrib/generic_proxy/filters/network/source/interface/BUILD b/contrib/generic_proxy/filters/network/source/interface/BUILD new file mode 100644 index 000000000000..c799b0f7b939 --- /dev/null +++ b/contrib/generic_proxy/filters/network/source/interface/BUILD @@ -0,0 +1,105 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_library", + "envoy_contrib_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_contrib_package() + +envoy_cc_library( + name = "stream_interface", + hdrs = [ + "stream.h", + ], + deps = [ + "//envoy/tracing:trace_context_interface", + ], +) + +envoy_cc_library( + name = "codec_callbacks_interface", + hdrs = [ + "codec_callbacks.h", + ], + deps = [ + ":route_interface", + ":stream_interface", + "//envoy/buffer:buffer_interface", + "//envoy/network:drain_decision_interface", + ], +) + +envoy_cc_library( + name = "codec_interface", + hdrs = [ + "codec.h", + ], + deps = [ + ":codec_callbacks_interface", + ":stream_interface", + "//envoy/buffer:buffer_interface", + "//envoy/config:typed_config_interface", + "//envoy/network:filter_interface", + "//envoy/server:factory_context_interface", + ], +) + +envoy_cc_library( + name = "filter_interface", + hdrs = [ + "filter.h", + ], + deps = [ + ":codec_interface", + ":route_interface", + ":stream_interface", + ], +) + +envoy_cc_library( + name = "route_interface", + hdrs = [ + "route.h", + ], + 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", + "//envoy/rds:rds_config_interface", + "//envoy/router:router_interface", + "//envoy/stream_info:stream_info_interface", + "@envoy_api//envoy/config/core/v3:pkg_cc_proto", + ], +) + +envoy_cc_library( + name = "config_interface", + hdrs = [ + "config.h", + ], + deps = [ + ":filter_interface", + "//envoy/config:typed_config_interface", + "//envoy/server:factory_context_interface", + ], +) + +envoy_cc_library( + name = "proxy_config_interface", + hdrs = [ + "proxy_config.h", + ], + deps = [ + ":codec_interface", + ":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", + ], +) diff --git a/source/extensions/filters/network/generic_proxy/interface/codec.h b/contrib/generic_proxy/filters/network/source/interface/codec.h similarity index 97% rename from source/extensions/filters/network/generic_proxy/interface/codec.h rename to contrib/generic_proxy/filters/network/source/interface/codec.h index 2b1ba02ceefc..e9ca99af5674 100644 --- a/source/extensions/filters/network/generic_proxy/interface/codec.h +++ b/contrib/generic_proxy/filters/network/source/interface/codec.h @@ -5,8 +5,8 @@ #include "envoy/network/filter.h" #include "envoy/server/factory_context.h" -#include "source/extensions/filters/network/generic_proxy/codec_callbacks.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" +#include "contrib/generic_proxy/filters/network/source/interface/codec_callbacks.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/codec_callbacks.h b/contrib/generic_proxy/filters/network/source/interface/codec_callbacks.h similarity index 97% rename from source/extensions/filters/network/generic_proxy/codec_callbacks.h rename to contrib/generic_proxy/filters/network/source/interface/codec_callbacks.h index 2831447066cd..367cb8783e4b 100644 --- a/source/extensions/filters/network/generic_proxy/codec_callbacks.h +++ b/contrib/generic_proxy/filters/network/source/interface/codec_callbacks.h @@ -5,8 +5,8 @@ #include "envoy/network/connection.h" #include "envoy/network/drain_decision.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/interface/filter.h b/contrib/generic_proxy/filters/network/source/interface/config.h similarity index 50% rename from source/extensions/filters/network/generic_proxy/interface/filter.h rename to contrib/generic_proxy/filters/network/source/interface/config.h index 6d82082a0ca7..f3716cd1e08a 100644 --- a/source/extensions/filters/network/generic_proxy/interface/filter.h +++ b/contrib/generic_proxy/filters/network/source/interface/config.h @@ -1,63 +1,15 @@ #pragma once -#include "envoy/event/dispatcher.h" -#include "envoy/network/connection.h" -#include "envoy/stream_info/stream_info.h" +#include "envoy/config/typed_config.h" +#include "envoy/server/factory_context.h" -#include "source/extensions/filters/network/generic_proxy/filter_callbacks.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/filter.h" namespace Envoy { namespace Extensions { namespace NetworkFilters { namespace GenericProxy { -// The status of the filter chain. -// 1. Continue: If Continue is returned, the filter chain will continue to the next filter in the -// chain. -// 2. StopIteration: If StopIteration is returned, the filter chain will stop and not continue -// to the next filter in the chain until the continueDecoding/continueEncoding is called. -enum class HeaderFilterStatus { Continue, StopIteration }; - -// The status of the filter chain. -// 1. Continue: If Continue is returned, the filter chain will continue to the next filter in the -// chain. -// 2. StopIteration: If StopIteration is returned, the filter chain will stop and not continue -// to the next filter in the chain until the continueDecoding/continueEncoding is called. -enum class CommonFilterStatus { Continue, StopIteration }; - -class DecoderFilter { -public: - virtual ~DecoderFilter() = default; - - virtual void onDestroy() PURE; - - virtual void setDecoderFilterCallbacks(DecoderFilterCallback& callbacks) PURE; - - virtual HeaderFilterStatus decodeHeaderFrame(RequestHeaderFrame& request) PURE; - virtual CommonFilterStatus decodeCommonFrame(RequestCommonFrame& request) PURE; -}; - -class EncoderFilter { -public: - virtual ~EncoderFilter() = default; - - virtual void onDestroy() PURE; - - virtual void setEncoderFilterCallbacks(EncoderFilterCallback& callbacks) PURE; - - virtual HeaderFilterStatus encodeHeaderFrame(ResponseHeaderFrame& response) PURE; - virtual CommonFilterStatus encodeCommonFrame(ResponseCommonFrame& response) PURE; -}; - -class StreamFilter : public DecoderFilter, public EncoderFilter {}; - -using DecoderFilterSharedPtr = std::shared_ptr; -using EncoderFilterSharedPtr = std::shared_ptr; -using StreamFilterSharedPtr = std::shared_ptr; - using TypedExtensionConfig = envoy::config::core::v3::TypedExtensionConfig; /** diff --git a/source/extensions/filters/network/generic_proxy/filter_callbacks.h b/contrib/generic_proxy/filters/network/source/interface/filter.h similarity index 75% rename from source/extensions/filters/network/generic_proxy/filter_callbacks.h rename to contrib/generic_proxy/filters/network/source/interface/filter.h index beefeeac8108..1c10487ee7ae 100644 --- a/source/extensions/filters/network/generic_proxy/filter_callbacks.h +++ b/contrib/generic_proxy/filters/network/source/interface/filter.h @@ -4,9 +4,9 @@ #include "envoy/network/connection.h" #include "envoy/stream_info/stream_info.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" +#include "contrib/generic_proxy/filters/network/source/interface/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" namespace Envoy { namespace Extensions { @@ -62,6 +62,7 @@ class StreamFilterCallbacks { /** * @return StreamInfo::StreamInfo& the stream info object associated with the stream. */ + virtual const StreamInfo::StreamInfo& streamInfo() const PURE; virtual StreamInfo::StreamInfo& streamInfo() PURE; /** @@ -136,9 +137,49 @@ class EncoderFilterCallback : public virtual StreamFilterCallbacks { virtual void continueEncoding() PURE; }; -class DecoderFilter; -class EncoderFilter; -class StreamFilter; +// The status of the filter chain. +// 1. Continue: If Continue is returned, the filter chain will continue to the next filter in the +// chain. +// 2. StopIteration: If StopIteration is returned, the filter chain will stop and not continue +// to the next filter in the chain until the continueDecoding/continueEncoding is called. +enum class HeaderFilterStatus { Continue, StopIteration }; + +// The status of the filter chain. +// 1. Continue: If Continue is returned, the filter chain will continue to the next filter in the +// chain. +// 2. StopIteration: If StopIteration is returned, the filter chain will stop and not continue +// to the next filter in the chain until the continueDecoding/continueEncoding is called. +enum class CommonFilterStatus { Continue, StopIteration }; + +class DecoderFilter { +public: + virtual ~DecoderFilter() = default; + + virtual void onDestroy() PURE; + + virtual void setDecoderFilterCallbacks(DecoderFilterCallback& callbacks) PURE; + + virtual HeaderFilterStatus decodeHeaderFrame(RequestHeaderFrame& request) PURE; + virtual CommonFilterStatus decodeCommonFrame(RequestCommonFrame& request) PURE; +}; + +class EncoderFilter { +public: + virtual ~EncoderFilter() = default; + + virtual void onDestroy() PURE; + + virtual void setEncoderFilterCallbacks(EncoderFilterCallback& callbacks) PURE; + + virtual HeaderFilterStatus encodeHeaderFrame(ResponseHeaderFrame& response) PURE; + virtual CommonFilterStatus encodeCommonFrame(ResponseCommonFrame& response) PURE; +}; + +class StreamFilter : public DecoderFilter, public EncoderFilter {}; + +using DecoderFilterSharedPtr = std::shared_ptr; +using EncoderFilterSharedPtr = std::shared_ptr; +using StreamFilterSharedPtr = std::shared_ptr; class FilterChainFactoryCallbacks { public: @@ -148,21 +189,23 @@ class FilterChainFactoryCallbacks { * Add a decoder filter that is used when reading connection data. * @param filter supplies the filter to add. */ - virtual void addDecoderFilter(std::shared_ptr filter) PURE; + virtual void addDecoderFilter(DecoderFilterSharedPtr filter) PURE; /** * Add a encoder filter that is used when writing connection data. * @param filter supplies the filter to add. */ - virtual void addEncoderFilter(std::shared_ptr filter) PURE; + virtual void addEncoderFilter(EncoderFilterSharedPtr filter) PURE; /** * Add a decoder/encoder filter that is used both when reading and writing connection data. * @param filter supplies the filter to add. */ - virtual void addFilter(std::shared_ptr filter) PURE; + virtual void addFilter(StreamFilterSharedPtr filter) PURE; }; +using FilterFactoryCb = std::function; + /** * Simple struct of additional contextual information of filter, e.g. filter config name * from configuration. @@ -170,13 +213,11 @@ class FilterChainFactoryCallbacks { struct FilterContext { // The name of the filter configuration that used to create related filter factory function. // This could be any legitimate non-empty string. - // This config name will have longer lifetime than any related filter instance. So string + // This config name will have longger lifetime than any related filter instance. So string // view could be used here safely. absl::string_view config_name; }; -using FilterFactoryCb = std::function; - /** * The filter chain manager is provided by the connection manager to the filter chain factory. * The filter chain factory will post the filter factory context and filter factory to the diff --git a/source/extensions/filters/network/generic_proxy/proxy_config.h b/contrib/generic_proxy/filters/network/source/interface/proxy_config.h similarity index 79% rename from source/extensions/filters/network/generic_proxy/proxy_config.h rename to contrib/generic_proxy/filters/network/source/interface/proxy_config.h index a91a35068dd6..a744ae06c448 100644 --- a/source/extensions/filters/network/generic_proxy/proxy_config.h +++ b/contrib/generic_proxy/filters/network/source/interface/proxy_config.h @@ -3,12 +3,12 @@ #include "envoy/tracing/trace_config.h" #include "envoy/tracing/tracer.h" -#include "source/extensions/filters/network/generic_proxy/access_log.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/match_input.h" -#include "source/extensions/filters/network/generic_proxy/route.h" -#include "source/extensions/filters/network/generic_proxy/stats.h" +#include "contrib/generic_proxy/filters/network/source/access_log.h" +#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 { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/route.h b/contrib/generic_proxy/filters/network/source/interface/route.h similarity index 93% rename from source/extensions/filters/network/generic_proxy/route.h rename to contrib/generic_proxy/filters/network/source/interface/route.h index 5f705d61941d..9fa58ae960c7 100644 --- a/source/extensions/filters/network/generic_proxy/route.h +++ b/contrib/generic_proxy/filters/network/source/interface/route.h @@ -7,8 +7,8 @@ #include "envoy/rds/config.h" #include "envoy/router/router.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/match_input.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 { @@ -22,7 +22,7 @@ class RouteSpecificFilterConfig { using RouteSpecificFilterConfigConstSharedPtr = std::shared_ptr; /** - * Interface of typed metadata factory. Reuse the same interface as the HTTP router filter because + * Interface of typed metadata factory. Reuse the same interface as the HTTP's router filter because * part of these abstractions are protocol independent. */ using RouteTypedMetadataFactory = Envoy::Router::HttpRouteTypedMetadataFactory; diff --git a/source/extensions/filters/network/generic_proxy/interface/stream.h b/contrib/generic_proxy/filters/network/source/interface/stream.h similarity index 95% rename from source/extensions/filters/network/generic_proxy/interface/stream.h rename to contrib/generic_proxy/filters/network/source/interface/stream.h index 8a1b68d61d09..41e66ca7c865 100644 --- a/source/extensions/filters/network/generic_proxy/interface/stream.h +++ b/contrib/generic_proxy/filters/network/source/interface/stream.h @@ -57,11 +57,6 @@ class FrameFlags { */ uint32_t frameTags() const { return frame_tags_; } - /** - * @return the raw flags of the current stream frame. - */ - uint32_t rawFlags() const { return flags_; } - /** * @return whether the current frame is the last frame of the request or response. */ @@ -83,11 +78,9 @@ class FrameFlags { /** * @return whether the current request/response is a heartbeat request/response. - * NOTE: Only the header frame's heartbeat() flag will be used. In most cases, the heartbeat - * should be handled directly by the underlying codec and should not be exposed to the generic - * proxy filter. This should only be used when we need to send the heartbeat to the peer. + * NOTE: Only the header frame's isHeartbeat() flag will be used. */ - bool heartbeat() const { return flags_ & FLAG_HEARTBEAT; } + bool isHeartbeat() const { return flags_ & FLAG_HEARTBEAT; } private: uint64_t stream_id_{}; diff --git a/source/extensions/filters/network/generic_proxy/match.cc b/contrib/generic_proxy/filters/network/source/match.cc similarity index 98% rename from source/extensions/filters/network/generic_proxy/match.cc rename to contrib/generic_proxy/filters/network/source/match.cc index b9244deedd56..a65b65f1de90 100644 --- a/source/extensions/filters/network/generic_proxy/match.cc +++ b/contrib/generic_proxy/filters/network/source/match.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/match.h" +#include "contrib/generic_proxy/filters/network/source/match.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/match.h b/contrib/generic_proxy/filters/network/source/match.h similarity index 96% rename from source/extensions/filters/network/generic_proxy/match.h rename to contrib/generic_proxy/filters/network/source/match.h index 8eedc9c6ec2b..36ca5d1e73f2 100644 --- a/source/extensions/filters/network/generic_proxy/match.h +++ b/contrib/generic_proxy/filters/network/source/match.h @@ -3,12 +3,12 @@ #include #include -#include "envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.validate.h" - #include "source/common/matcher/matcher.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/match_input.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/matcher/v3/matcher.pb.validate.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 { diff --git a/source/extensions/filters/network/generic_proxy/match_input.h b/contrib/generic_proxy/filters/network/source/match_input.h similarity index 96% rename from source/extensions/filters/network/generic_proxy/match_input.h rename to contrib/generic_proxy/filters/network/source/match_input.h index 1df97345049c..ccd102dbf146 100644 --- a/source/extensions/filters/network/generic_proxy/match_input.h +++ b/contrib/generic_proxy/filters/network/source/match_input.h @@ -4,7 +4,7 @@ #include "envoy/stream_info/stream_info.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/proxy.cc b/contrib/generic_proxy/filters/network/source/proxy.cc similarity index 91% rename from source/extensions/filters/network/generic_proxy/proxy.cc rename to contrib/generic_proxy/filters/network/source/proxy.cc index fad6c85444db..310058f54aaa 100644 --- a/source/extensions/filters/network/generic_proxy/proxy.cc +++ b/contrib/generic_proxy/filters/network/source/proxy.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/proxy.h" +#include "contrib/generic_proxy/filters/network/source/proxy.h" #include @@ -8,8 +8,10 @@ #include "source/common/config/utility.h" #include "source/common/protobuf/protobuf.h" #include "source/common/stream_info/stream_info_impl.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/route_impl.h" + +#include "contrib/generic_proxy/filters/network/source/interface/config.h" +#include "contrib/generic_proxy/filters/network/source/interface/filter.h" +#include "contrib/generic_proxy/filters/network/source/route.h" namespace Envoy { namespace Extensions { @@ -66,15 +68,15 @@ ActiveStream::ActiveStream(Filter& parent, RequestHeaderFramePtr request, parent_.stats_helper_.onRequest(); - conn_manager_tracing_config_ = parent_.config_->tracingConfig(); + connection_manager_tracing_config_ = parent_.config_->tracingConfig(); auto tracer = parent_.config_->tracingProvider(); - if (!conn_manager_tracing_config_.has_value() || !tracer.has_value()) { + if (!connection_manager_tracing_config_.has_value() || !tracer.has_value()) { return; } - auto decision = tracingDecision(conn_manager_tracing_config_.value(), parent_.runtime_); + auto decision = tracingDecision(connection_manager_tracing_config_.value(), parent_.runtime_); if (decision.traced) { stream_info_.setTraceReason(decision.reason); } @@ -84,28 +86,28 @@ ActiveStream::ActiveStream(Filter& parent, RequestHeaderFramePtr request, } Tracing::OperationName ActiveStream::operationName() const { - ASSERT(conn_manager_tracing_config_.has_value()); - return conn_manager_tracing_config_->operationName(); + ASSERT(connection_manager_tracing_config_.has_value()); + return connection_manager_tracing_config_->operationName(); } const Tracing::CustomTagMap* ActiveStream::customTags() const { - ASSERT(conn_manager_tracing_config_.has_value()); - return &conn_manager_tracing_config_->getCustomTags(); + ASSERT(connection_manager_tracing_config_.has_value()); + return &connection_manager_tracing_config_->getCustomTags(); } bool ActiveStream::verbose() const { - ASSERT(conn_manager_tracing_config_.has_value()); - return conn_manager_tracing_config_->verbose(); + ASSERT(connection_manager_tracing_config_.has_value()); + return connection_manager_tracing_config_->verbose(); } uint32_t ActiveStream::maxPathTagLength() const { - ASSERT(conn_manager_tracing_config_.has_value()); - return conn_manager_tracing_config_->maxPathTagLength(); + ASSERT(connection_manager_tracing_config_.has_value()); + return connection_manager_tracing_config_->maxPathTagLength(); } bool ActiveStream::spawnUpstreamSpan() const { - ASSERT(conn_manager_tracing_config_.has_value()); - return conn_manager_tracing_config_->spawnUpstreamSpan(); + ASSERT(connection_manager_tracing_config_.has_value()); + return connection_manager_tracing_config_->spawnUpstreamSpan(); } Envoy::Event::Dispatcher& ActiveStream::dispatcher() { @@ -145,7 +147,7 @@ bool ActiveStream::sendFrameToDownstream(const StreamFrame& frame, bool header_f void ActiveStream::sendLocalReply(Status status, absl::string_view data, ResponseUpdateFunction func) { // To ensure only one response header frame is sent for local reply. - // If there is a previous response header but has not been sent to the downstream, + // If there is a previsous response header but has not been sent to the downstream, // we should send the latest local reply to the downstream directly without any // filter processing. // If the previous response header has been sent to the downstream, it is an invalid @@ -275,18 +277,18 @@ void ActiveStream::processRequestCommonFrame() { ENVOY_LOG(debug, "Generic proxy: complete decoder filters for common frame (end_stream: {})", request_common_frame_->frameFlags().endStream()); - RequestCommonFramePtr local_common_frame = std::move(request_common_frame_); - // Reset the iterator and frame for the next common frame. - request_common_frame_ = nullptr; - decoder_filter_iter_common_ = decoder_filters_.begin(); - // Transfer the active common frame to the request stream frame handler. if (request_stream_frames_handler_ != nullptr) { - request_stream_frames_handler_->onRequestCommonFrame(std::move(local_common_frame)); + request_stream_frames_handler_->onRequestCommonFrame(std::move(request_common_frame_)); if (stream_reset_or_complete_) { stop_decoder_filter_chain_ = true; + return; } } + + // Reset the iter and frame for the next common frame. + request_common_frame_ = nullptr; + decoder_filter_iter_common_ = decoder_filters_.begin(); } void ActiveStream::processResponseHeaderFrame() { @@ -354,15 +356,15 @@ void ActiveStream::processResponseCommonFrame() { ENVOY_LOG(debug, "Generic proxy: complete encoder filters for common frame (end_stream: {})", response_common_frame_->frameFlags().endStream()); - auto local_common_frame = std::move(response_common_frame_); - // Reset the iterator and frame for the next common frame. - response_common_frame_ = nullptr; - encoder_filter_iter_common_ = encoder_filters_.begin(); - // Send the common frame to downstream. - if (!sendFrameToDownstream(*local_common_frame, false)) { + if (!sendFrameToDownstream(*response_common_frame_, false)) { stop_encoder_filter_chain_ = true; + return; } + + // Reset the iter and frame for the next common frame. + response_common_frame_ = nullptr; + encoder_filter_iter_common_ = encoder_filters_.begin(); }; // Handle the special case where no filter is added to the encoder filter chain. @@ -435,19 +437,16 @@ void ActiveStream::continueDecoding() { return; } - // Handle the active request common frame first if exists. + // Handle the active request common frame if exists. if (request_common_frame_ != nullptr) { processRequestCommonFrame(); } + if (stop_decoder_filter_chain_) { + return; + } // Handle the other request common frames if exists. while (!request_common_frames_.empty()) { - // Check the stop flag first because the filter chain may be - // stopped by the previous active request frame. - if (stop_decoder_filter_chain_) { - break; - } - ASSERT(request_common_frame_ == nullptr); ASSERT(decoder_filter_iter_common_ == decoder_filters_.begin()); @@ -457,6 +456,9 @@ void ActiveStream::continueDecoding() { request_common_frame_ = std::move(frame); processRequestCommonFrame(); + if (stop_decoder_filter_chain_) { + break; + } } } @@ -540,19 +542,16 @@ void ActiveStream::continueEncoding() { return; } - // Handle the active response common frame first if exists. + // Handle the active response common frame if exists. if (response_common_frame_ != nullptr) { processResponseCommonFrame(); } + if (stop_encoder_filter_chain_) { + return; + } // Handle the other response common frames if exists. while (!response_common_frames_.empty()) { - // Check the stop flag first because the filter chain may be - // stopped by the previous active response frame. - if (stop_encoder_filter_chain_) { - break; - } - ASSERT(response_common_frame_ == nullptr); ASSERT(encoder_filter_iter_common_ == encoder_filters_.begin()); @@ -562,6 +561,9 @@ void ActiveStream::continueEncoding() { response_common_frame_ = std::move(frame); processResponseCommonFrame(); + if (stop_encoder_filter_chain_) { + break; + } } } @@ -612,8 +614,7 @@ void ActiveStream::completeStream(absl::optional re stream_info_.onRequestComplete(); bool error_reply = false; - // This response frame may be nullptr if the request is one-way or the response is not - // sent to the downstream. + // This response frame may be nullptr if the request is one-way. if (response_header_frame_ != nullptr) { error_reply = !response_header_frame_->status().ok(); } @@ -655,12 +656,6 @@ Envoy::Network::FilterStatus Filter::onData(Envoy::Buffer::Instance& data, bool void Filter::onDecodingSuccess(RequestHeaderFramePtr request_header_frame, absl::optional start_time) { - if (request_header_frame == nullptr) { - ENVOY_LOG(error, "generic proxy: request header frame from codec is null"); - onDecodingFailure(); - return; - } - const uint64_t stream_id = request_header_frame->frameFlags().streamId(); if (!frame_handlers_.empty()) { // Quick empty check to avoid the map lookup. @@ -675,12 +670,6 @@ void Filter::onDecodingSuccess(RequestHeaderFramePtr request_header_frame, } void Filter::onDecodingSuccess(RequestCommonFramePtr request_common_frame) { - if (request_common_frame == nullptr) { - ENVOY_LOG(error, "generic proxy: request common frame from codec is null"); - onDecodingFailure(); - return; - } - const uint64_t stream_id = request_common_frame->frameFlags().streamId(); // One existing stream expects this frame. if (auto iter = frame_handlers_.find(stream_id); iter != frame_handlers_.end()) { @@ -716,8 +705,15 @@ OptRef Filter::connection() { } void Filter::registerFrameHandler(uint64_t stream_id, ActiveStream* raw_stream) { - // Repeated stream id will be detected in the onDecodingSuccess method. - ASSERT(frame_handlers_.find(stream_id) == frame_handlers_.end()); + // If the stream expects variable length frames, then add it to the frame + // handler map. + // This map entry will be removed when the request or response end frame is + // received. + if (frame_handlers_.contains(stream_id)) { + ENVOY_LOG(error, "generic proxy: repetitive stream id: {} at same time", stream_id); + onDecodingFailure(); + return; + } frame_handlers_[stream_id] = raw_stream; } diff --git a/source/extensions/filters/network/generic_proxy/proxy.h b/contrib/generic_proxy/filters/network/source/proxy.h similarity index 93% rename from source/extensions/filters/network/generic_proxy/proxy.h rename to contrib/generic_proxy/filters/network/source/proxy.h index 27c1f63b9d58..5b37e9e0f5eb 100644 --- a/source/extensions/filters/network/generic_proxy/proxy.h +++ b/contrib/generic_proxy/filters/network/source/proxy.h @@ -5,9 +5,6 @@ #include #include "envoy/config/core/v3/extension.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" #include "envoy/network/connection.h" #include "envoy/network/filter.h" #include "envoy/server/factory_context.h" @@ -21,15 +18,19 @@ #include "source/common/stream_info/stream_info_impl.h" #include "source/common/tracing/tracer_config_impl.h" #include "source/common/tracing/tracer_impl.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/proxy_config.h" -#include "source/extensions/filters/network/generic_proxy/rds.h" -#include "source/extensions/filters/network/generic_proxy/rds_impl.h" -#include "source/extensions/filters/network/generic_proxy/route.h" -#include "source/extensions/filters/network/generic_proxy/route_impl.h" -#include "source/extensions/filters/network/generic_proxy/stats.h" -#include "source/extensions/filters/network/generic_proxy/tracing.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" +#include "contrib/generic_proxy/filters/network/source/interface/filter.h" +#include "contrib/generic_proxy/filters/network/source/interface/proxy_config.h" +#include "contrib/generic_proxy/filters/network/source/interface/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" +#include "contrib/generic_proxy/filters/network/source/rds.h" +#include "contrib/generic_proxy/filters/network/source/rds_impl.h" +#include "contrib/generic_proxy/filters/network/source/route.h" +#include "contrib/generic_proxy/filters/network/source/stats.h" +#include "contrib/generic_proxy/filters/network/source/tracing.h" namespace Envoy { namespace Extensions { @@ -145,6 +146,7 @@ class ActiveStream : public FilterChainManager, } return nullptr; } + const StreamInfo::StreamInfo& streamInfo() const override { return parent_.stream_info_; } StreamInfo::StreamInfo& streamInfo() override { return parent_.stream_info_; } Tracing::Span& activeSpan() override { return parent_.activeSpan(); } OptRef tracingConfig() const override { return parent_.tracingConfig(); } @@ -274,7 +276,7 @@ class ActiveStream : public FilterChainManager, } OptRef tracingConfig() const { - if (conn_manager_tracing_config_.has_value()) { + if (connection_manager_tracing_config_.has_value()) { return {*this}; } return {}; @@ -347,7 +349,7 @@ class ActiveStream : public FilterChainManager, StreamInfo::StreamInfoImpl stream_info_; - OptRef conn_manager_tracing_config_; + OptRef connection_manager_tracing_config_; Tracing::SpanPtr active_span_; }; using ActiveStreamPtr = std::unique_ptr; diff --git a/source/extensions/filters/network/generic_proxy/rds.h b/contrib/generic_proxy/filters/network/source/rds.h similarity index 60% rename from source/extensions/filters/network/generic_proxy/rds.h rename to contrib/generic_proxy/filters/network/source/rds.h index e450f4f26626..301239728989 100644 --- a/source/extensions/filters/network/generic_proxy/rds.h +++ b/contrib/generic_proxy/filters/network/source/rds.h @@ -2,13 +2,13 @@ #include -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" - #include "source/common/rds/common/route_config_provider_manager.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" + namespace Envoy { namespace Extensions { namespace NetworkFilters { diff --git a/source/extensions/filters/network/generic_proxy/rds_impl.h b/contrib/generic_proxy/filters/network/source/rds_impl.h similarity index 58% rename from source/extensions/filters/network/generic_proxy/rds_impl.h rename to contrib/generic_proxy/filters/network/source/rds_impl.h index f600a3d7adfd..39248e9c2343 100644 --- a/source/extensions/filters/network/generic_proxy/rds_impl.h +++ b/contrib/generic_proxy/filters/network/source/rds_impl.h @@ -2,13 +2,13 @@ #include -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" - #include "source/common/rds/common/route_config_provider_manager_impl.h" -#include "source/extensions/filters/network/generic_proxy/route_impl.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" +#include "contrib/generic_proxy/filters/network/source/route.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/route_impl.cc b/contrib/generic_proxy/filters/network/source/route.cc similarity index 97% rename from source/extensions/filters/network/generic_proxy/route_impl.cc rename to contrib/generic_proxy/filters/network/source/route.cc index 91eb7635cb41..e7524d0c80cc 100644 --- a/source/extensions/filters/network/generic_proxy/route_impl.cc +++ b/contrib/generic_proxy/filters/network/source/route.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/route_impl.h" +#include "contrib/generic_proxy/filters/network/source/route.h" #include @@ -7,9 +7,9 @@ #include "source/common/common/assert.h" #include "source/common/common/matchers.h" #include "source/common/config/utility.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/config.h" +#include "contrib/generic_proxy/filters/network/source/interface/route.h" #include "interface/stream.h" namespace Envoy { diff --git a/source/extensions/filters/network/generic_proxy/route_impl.h b/contrib/generic_proxy/filters/network/source/route.h similarity index 91% rename from source/extensions/filters/network/generic_proxy/route_impl.h rename to contrib/generic_proxy/filters/network/source/route.h index 62118b8856f6..eee27ef6704c 100644 --- a/source/extensions/filters/network/generic_proxy/route_impl.h +++ b/contrib/generic_proxy/filters/network/source/route.h @@ -6,19 +6,20 @@ #include "envoy/config/core/v3/base.pb.h" #include "envoy/config/route/v3/route_components.pb.h" #include "envoy/config/typed_metadata.h" -#include "envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.validate.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" #include "envoy/server/factory_context.h" #include "source/common/common/matchers.h" #include "source/common/config/metadata.h" #include "source/common/http/header_utility.h" #include "source/common/matcher/matcher.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/match_input.h" -#include "source/extensions/filters/network/generic_proxy/route.h" + +#include "contrib/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/action/v3/action.pb.validate.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" +#include "contrib/generic_proxy/filters/network/source/interface/route.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 { @@ -138,8 +139,6 @@ class RouteMatcherImpl : public RouteMatcher, Logger::Loggable, std::greater<>>; @@ -148,6 +147,8 @@ class RouteMatcherImpl : public RouteMatcher, Logger::Loggable virtual_hosts_; diff --git a/source/extensions/filters/network/generic_proxy/router/BUILD b/contrib/generic_proxy/filters/network/source/router/BUILD similarity index 56% rename from source/extensions/filters/network/generic_proxy/router/BUILD rename to contrib/generic_proxy/filters/network/source/router/BUILD index d3e4d60b729c..e1ea8a338e36 100644 --- a/source/extensions/filters/network/generic_proxy/router/BUILD +++ b/contrib/generic_proxy/filters/network/source/router/BUILD @@ -1,13 +1,13 @@ load( "//bazel:envoy_build_system.bzl", - "envoy_cc_extension", + "envoy_cc_contrib_extension", "envoy_cc_library", - "envoy_extension_package", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_extension_package() +envoy_contrib_package() envoy_cc_library( name = "router_lib", @@ -20,6 +20,10 @@ envoy_cc_library( "upstream.h", ], deps = [ + "//contrib/generic_proxy/filters/network/source:tracing_lib", + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", + "//contrib/generic_proxy/filters/network/source/interface:config_interface", + "//contrib/generic_proxy/filters/network/source/interface:filter_interface", "//source/common/buffer:buffer_lib", "//source/common/common:linked_object", "//source/common/common:minimal_logger_lib", @@ -28,15 +32,12 @@ envoy_cc_library( "//source/common/stream_info:stream_info_lib", "//source/common/tracing:tracer_lib", "//source/common/upstream:load_balancer_context_base_lib", - "//source/extensions/filters/network/generic_proxy:tracing_lib", - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", - "//source/extensions/filters/network/generic_proxy/interface:filter_interface", "@com_github_google_quiche//:quiche_common_lib", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/router/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/router/v3:pkg_cc_proto", ], ) -envoy_cc_extension( +envoy_cc_contrib_extension( name = "config", srcs = [ "config.cc", @@ -46,8 +47,8 @@ envoy_cc_extension( ], deps = [ ":router_lib", + "//contrib/generic_proxy/filters/network/source/interface:config_interface", "//envoy/registry", - "//source/extensions/filters/network/generic_proxy/interface:filter_interface", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/router/v3:pkg_cc_proto", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/router/v3:pkg_cc_proto", ], ) diff --git a/source/extensions/filters/network/generic_proxy/router/config.cc b/contrib/generic_proxy/filters/network/source/router/config.cc similarity index 92% rename from source/extensions/filters/network/generic_proxy/router/config.cc rename to contrib/generic_proxy/filters/network/source/router/config.cc index 4294c8928100..053950c21d1f 100644 --- a/source/extensions/filters/network/generic_proxy/router/config.cc +++ b/contrib/generic_proxy/filters/network/source/router/config.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/router/config.h" +#include "contrib/generic_proxy/filters/network/source/router/config.h" #include "envoy/registry/registry.h" diff --git a/source/extensions/filters/network/generic_proxy/router/config.h b/contrib/generic_proxy/filters/network/source/router/config.h similarity index 78% rename from source/extensions/filters/network/generic_proxy/router/config.h rename to contrib/generic_proxy/filters/network/source/router/config.h index 3e0995023ec9..04de5e949fa8 100644 --- a/source/extensions/filters/network/generic_proxy/router/config.h +++ b/contrib/generic_proxy/filters/network/source/router/config.h @@ -1,10 +1,9 @@ #pragma once -#include "envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.h" - -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/router/router.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.h" +#include "contrib/generic_proxy/filters/network/source/interface/config.h" +#include "contrib/generic_proxy/filters/network/source/router/router.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/router/router.cc b/contrib/generic_proxy/filters/network/source/router/router.cc similarity index 91% rename from source/extensions/filters/network/generic_proxy/router/router.cc rename to contrib/generic_proxy/filters/network/source/router/router.cc index c219aef86db4..8ebf60642c46 100644 --- a/source/extensions/filters/network/generic_proxy/router/router.cc +++ b/contrib/generic_proxy/filters/network/source/router/router.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/router/router.h" +#include "contrib/generic_proxy/filters/network/source/router/router.h" #include @@ -9,8 +9,9 @@ #include "source/common/config/well_known_names.h" #include "source/common/router/metadatamatchcriteria_impl.h" #include "source/common/tracing/tracer_impl.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/tracing.h" + +#include "contrib/generic_proxy/filters/network/source/interface/filter.h" +#include "contrib/generic_proxy/filters/network/source/tracing.h" namespace Envoy { namespace Extensions { @@ -47,7 +48,7 @@ UpstreamRequest::UpstreamRequest(RouterFilter& parent, FrameFlags header_frame_f stream_id_(header_frame_flags.streamId()), expects_response_(!header_frame_flags.oneWayStream()) { - // Host is known at this point and set the upstream host. + // Host is known at this point and set the initial upstream host. onUpstreamHostSelected(generic_upstream_->upstreamHost()); auto filter_callbacks = parent_.callbacks_; @@ -123,10 +124,10 @@ void UpstreamRequest::clearStream(bool close_connection) { } void UpstreamRequest::deferredDelete() { - if (parent_.upstream_request_.get() == this) { - // Remove this stream from the parent and delete it at next event loop iteration. - parent_.callbacks_->dispatcher().deferredDelete(std::move(parent_.upstream_request_)); - parent_.upstream_request_.reset(); + if (inserted()) { + // Remove this stream from the parent's list of upstream requests and delete it at + // next event loop iteration. + parent_.callbacks_->dispatcher().deferredDelete(removeFromList(parent_.upstream_requests_)); } } @@ -231,8 +232,6 @@ void UpstreamRequest::onDecodingSuccess(ResponseHeaderFramePtr response_header_f absl::optional start_time) { if (response_stream_header_received_) { ENVOY_LOG(error, "upstream request: multiple StreamResponse received"); - resetStream(StreamResetReason::ProtocolError, {}); - return; } response_stream_header_received_ = true; @@ -289,14 +288,23 @@ void UpstreamRequest::onConnectionClose(Network::ConnectionEvent event) { return; } - if (event == Network::ConnectionEvent::RemoteClose) { - resetStream(StreamResetReason::ConnectionTermination, {}); - } else if (event == Network::ConnectionEvent::LocalClose) { + switch (event) { + case Network::ConnectionEvent::LocalClose: resetStream(StreamResetReason::LocalReset, {}); + break; + case Network::ConnectionEvent::RemoteClose: + resetStream(StreamResetReason::ConnectionTermination, {}); + break; + default: + break; } } void UpstreamRequest::onUpstreamHostSelected(Upstream::HostDescriptionConstSharedPtr host) { + if (host == nullptr || host == upstream_info_->upstream_host_) { + return; + } + ENVOY_LOG(debug, "upstream request: selected host {}", host->address()->asStringView()); upstream_info_->upstream_host_ = std::move(host); } @@ -334,8 +342,6 @@ void RouterFilter::onUpstreamRequestReset(UpstreamRequest&, StreamResetReason re return; } - ASSERT(upstream_request_ == nullptr); - // Retry is the upstream request is reset because of the connection failure or the // protocol error. if (couldRetry(reason)) { @@ -343,9 +349,7 @@ void RouterFilter::onUpstreamRequestReset(UpstreamRequest&, StreamResetReason re return; } - // Complete the filter/request and send the local reply to the downstream if no retry. - const auto [view, flag] = resetReasonToViewAndFlag(reason); - completeAndSendLocalReply(Status(StatusCode::kUnavailable, view), reason_detail, flag); + resetStream(reason, reason_detail); } void RouterFilter::onFilterComplete() { @@ -356,8 +360,8 @@ void RouterFilter::onFilterComplete() { filter_complete_ = true; // Clean up all pending upstream requests. - if (upstream_request_ != nullptr) { - auto* upstream_request = upstream_request_.get(); + while (!upstream_requests_.empty()) { + auto* upstream_request = upstream_requests_.back().get(); // Remove the upstream request from the upstream request list first. The resetStream() will // also do this. But in some corner cases, the upstream request is already reset and triggers // the router filter to call onFilterComplete(). But note because the upstream request is @@ -395,6 +399,16 @@ void RouterFilter::onTimeout() { void RouterFilter::onDestroy() { onFilterComplete(); } +void RouterFilter::resetStream(StreamResetReason reason, absl::string_view reason_detail) { + // Ensure this method is called only once strictly and never called after + // onFilterComplete(). + if (filter_complete_) { + return; + } + const auto [view, flag] = resetReasonToViewAndFlag(reason); + completeAndSendLocalReply(Status(StatusCode::kUnavailable, view), reason_detail, flag); +} + void RouterFilter::completeAndSendLocalReply(absl::Status status, absl::string_view details, absl::optional flag) { if (flag.has_value()) { @@ -405,8 +419,6 @@ void RouterFilter::completeAndSendLocalReply(absl::Status status, absl::string_v } void RouterFilter::kickOffNewUpstreamRequest() { - ASSERT(upstream_request_ == nullptr); - num_retries_++; const auto& cluster_name = route_entry_->clusterName(); @@ -437,18 +449,23 @@ void RouterFilter::kickOffNewUpstreamRequest() { return; } - upstream_request_ = std::make_unique(*this, request_stream_->frameFlags(), - std::move(generic_upstream)); - upstream_request_->startStream(); + auto upstream_request = std::make_unique(*this, request_stream_->frameFlags(), + std::move(generic_upstream)); + auto raw_upstream_request = upstream_request.get(); + LinkedList::moveIntoList(std::move(upstream_request), upstream_requests_); + raw_upstream_request->startStream(); } void RouterFilter::onRequestCommonFrame(RequestCommonFramePtr frame) { mayRequestStreamEnd(frame->frameFlags().endStream()); request_stream_frames_.emplace_back(std::move(frame)); - if (upstream_request_ != nullptr) { - upstream_request_->sendCommonFrameToUpstream(); + + if (upstream_requests_.empty()) { + return; } + + upstream_requests_.front()->sendCommonFrameToUpstream(); } HeaderFilterStatus RouterFilter::decodeHeaderFrame(StreamRequest& request) { diff --git a/source/extensions/filters/network/generic_proxy/router/router.h b/contrib/generic_proxy/filters/network/source/router/router.h similarity index 91% rename from source/extensions/filters/network/generic_proxy/router/router.h rename to contrib/generic_proxy/filters/network/source/router/router.h index 6907e1600aab..a2effd2c1db6 100644 --- a/source/extensions/filters/network/generic_proxy/router/router.h +++ b/contrib/generic_proxy/filters/network/source/router/router.h @@ -2,8 +2,6 @@ #include -#include "envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.h" #include "envoy/network/connection.h" #include "envoy/server/factory_context.h" @@ -11,11 +9,13 @@ #include "source/common/common/linked_object.h" #include "source/common/stream_info/stream_info_impl.h" #include "source/common/upstream/load_balancer_context_base.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" -#include "source/extensions/filters/network/generic_proxy/router/upstream.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/router/v3/router.pb.validate.h" +#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/stream.h" +#include "contrib/generic_proxy/filters/network/source/router/upstream.h" #include "quiche/common/quiche_linked_hash_map.h" namespace Envoy { @@ -154,7 +154,7 @@ class RouterFilter : public DecoderFilter, max_retries_ = route_entry_ ? route_entry->retryPolicy().numRetries() : 1; } - size_t upstreamRequestsSize() { return upstream_request_ != nullptr ? 1 : 0; } + size_t upstreamRequestsSize() { return upstream_requests_.size(); } // Upstream::LoadBalancerContextBase const Envoy::Router::MetadataMatchCriteria* metadataMatchCriteria() override; @@ -168,6 +168,7 @@ class RouterFilter : public DecoderFilter, friend class UpstreamManagerImpl; void kickOffNewUpstreamRequest(); + void resetStream(StreamResetReason reason, absl::string_view reason_detail); void completeAndSendLocalReply(absl::Status status, absl::string_view details, absl::optional flag = {}); @@ -203,9 +204,7 @@ class RouterFilter : public DecoderFilter, Envoy::Router::MetadataMatchCriteriaConstPtr metadata_match_; - // Only allow one upstream request at a time. This is a simplification of the code that may be - // changed in the future. - UpstreamRequestPtr upstream_request_; + std::list upstream_requests_; Envoy::Event::TimerPtr timeout_timer_; DecoderFilterCallback* callbacks_{}; diff --git a/source/extensions/filters/network/generic_proxy/router/upstream.cc b/contrib/generic_proxy/filters/network/source/router/upstream.cc similarity index 92% rename from source/extensions/filters/network/generic_proxy/router/upstream.cc rename to contrib/generic_proxy/filters/network/source/router/upstream.cc index 0cbef86bddea..d99560f2397f 100644 --- a/source/extensions/filters/network/generic_proxy/router/upstream.cc +++ b/contrib/generic_proxy/filters/network/source/router/upstream.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/router/upstream.h" +#include "contrib/generic_proxy/filters/network/source/router/upstream.h" namespace Envoy { namespace Extensions { @@ -32,13 +32,13 @@ void SharedRequestManager::onDecodingSuccess(ResponseHeaderFramePtr header_frame const bool end_stream = header_frame->frameFlags().endStream(); auto it = pending_requests_.find(stream_id); + auto cb = it->second; + if (it == pending_requests_.end()) { - ENVOY_LOG(error, "generic proxy: id {} not found for header frame", stream_id); + ENVOY_LOG(error, "generic proxy: id {} not found for frame", stream_id); return; } - auto cb = it->second; - // If the response stream is end, remove the callbacks from the map because we // no longer need to track the response. if (end_stream) { @@ -52,13 +52,13 @@ void SharedRequestManager::onDecodingSuccess(ResponseCommonFramePtr common_frame const bool end_stream = common_frame->frameFlags().endStream(); auto it = pending_requests_.find(stream_id); + auto cb = it->second; + if (it == pending_requests_.end()) { - ENVOY_LOG(error, "generic proxy: id {} not found for common frame", stream_id); + ENVOY_LOG(error, "generic proxy: id {} not found for frame", stream_id); return; } - auto cb = it->second; - // If the response stream is end, remove the callbacks from the map because we // no longer need to track the response. if (end_stream) { @@ -87,7 +87,10 @@ void UniqueRequestManager::appendUpstreamRequest(uint64_t, pending_request_ = pending_request; } -void UniqueRequestManager::removeUpstreamRequest(uint64_t) { pending_request_ = nullptr; } +void UniqueRequestManager::removeUpstreamRequest(uint64_t) { + ASSERT(pending_request_ != nullptr); + pending_request_ = nullptr; +} void UniqueRequestManager::onConnectionClose(Network::ConnectionEvent event) { if (pending_request_ != nullptr) { @@ -216,15 +219,17 @@ void BoundGenericUpstream::cleanUp(bool close_connection) { } void BoundGenericUpstream::onEvent(Network::ConnectionEvent event) { - if (event == Network::ConnectionEvent::LocalClose || - event == Network::ConnectionEvent::RemoteClose) { - if (encoder_decoder_ != nullptr) { - encoder_decoder_->onConnectionClose(event); - } + if (event == Network::ConnectionEvent::Connected || + event == Network::ConnectionEvent::ConnectedZeroRtt) { + return; + } - // If the downstream connection is not closed, close it. - downstream_conn_.close(Network::ConnectionCloseType::FlushWrite); + if (encoder_decoder_ != nullptr) { + encoder_decoder_->onConnectionClose(event); } + + // If the downstream connection is not closed, close it. + downstream_conn_.close(Network::ConnectionCloseType::FlushWrite); } void BoundGenericUpstream::onUpstreamSuccess() { @@ -281,25 +286,25 @@ void OwnedGenericUpstream::appendUpstreamRequest(uint64_t, } void OwnedGenericUpstream::removeUpstreamRequest(uint64_t) { + ASSERT(upstream_request_ != nullptr); + upstream_request_ = nullptr; if (encoder_decoder_ != nullptr) { encoder_decoder_->removeUpstreamRequest({}); } - upstream_request_ = nullptr; } void OwnedGenericUpstream::onEvent(Network::ConnectionEvent event) { - if (event == Network::ConnectionEvent::LocalClose || - event == Network::ConnectionEvent::RemoteClose) { - if (encoder_decoder_ != nullptr) { - encoder_decoder_->onConnectionClose(event); - } + if (event == Network::ConnectionEvent::Connected || + event == Network::ConnectionEvent::ConnectedZeroRtt) { + return; + } + if (encoder_decoder_ != nullptr) { + encoder_decoder_->onConnectionClose(event); } } void OwnedGenericUpstream::onUpstreamSuccess() { ASSERT(upstream_request_ != nullptr); - ASSERT(encoder_decoder_ != nullptr); - auto upstream_request = upstream_request_; upstream_request_ = nullptr; diff --git a/source/extensions/filters/network/generic_proxy/router/upstream.h b/contrib/generic_proxy/filters/network/source/router/upstream.h similarity index 98% rename from source/extensions/filters/network/generic_proxy/router/upstream.h rename to contrib/generic_proxy/filters/network/source/router/upstream.h index 2c3cc97038c8..dd65a04613c5 100644 --- a/source/extensions/filters/network/generic_proxy/router/upstream.h +++ b/contrib/generic_proxy/filters/network/source/router/upstream.h @@ -5,8 +5,8 @@ #include "envoy/network/connection.h" #include "source/common/buffer/buffer_impl.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" #include "quiche/common/quiche_linked_hash_map.h" namespace Envoy { @@ -350,13 +350,13 @@ class BoundGenericUpstream : public BoundGenericUpstreamBase, EventWatcher connection_event_watcher_; absl::optional upstream_conn_ok_; - // This ensure the requests that are waiting upstream connection will be list in the order in + // This ensure the requests that are waiting upstream connectin will be list in the order in // which the requests were received. By this way, the protocols that require the requests and // responses be handled in pipeline could works properly. // Note we need not do that for the requests that are waiting responses. Because we assume that // the clients of these protocols will send requests in order. Then when the connection is ready, // generic proxy will send requests to server in order. Finally, the upstream server of these - // protocols will send responses in order. We also assume that the L7 filter chain of these + // protocols will send respnoses in order. We also assume that the L7 filter chain of these // protocols will not change the processing order. using LinkedAbslHashMap = quiche::QuicheLinkedHashMap; LinkedAbslHashMap pending_requests_; diff --git a/source/extensions/filters/network/generic_proxy/stats.cc b/contrib/generic_proxy/filters/network/source/stats.cc similarity index 98% rename from source/extensions/filters/network/generic_proxy/stats.cc rename to contrib/generic_proxy/filters/network/source/stats.cc index 1c008c196331..dd9e61977810 100644 --- a/source/extensions/filters/network/generic_proxy/stats.cc +++ b/contrib/generic_proxy/filters/network/source/stats.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/stats.h" +#include "contrib/generic_proxy/filters/network/source/stats.h" #include "source/common/stream_info/utility.h" diff --git a/source/extensions/filters/network/generic_proxy/stats.h b/contrib/generic_proxy/filters/network/source/stats.h similarity index 100% rename from source/extensions/filters/network/generic_proxy/stats.h rename to contrib/generic_proxy/filters/network/source/stats.h diff --git a/source/extensions/filters/network/generic_proxy/tracing.cc b/contrib/generic_proxy/filters/network/source/tracing.cc similarity index 93% rename from source/extensions/filters/network/generic_proxy/tracing.cc rename to contrib/generic_proxy/filters/network/source/tracing.cc index 2f712ea57c4c..10d0d7bd4af4 100644 --- a/source/extensions/filters/network/generic_proxy/tracing.cc +++ b/contrib/generic_proxy/filters/network/source/tracing.cc @@ -1,4 +1,4 @@ -#include "source/extensions/filters/network/generic_proxy/tracing.h" +#include "contrib/generic_proxy/filters/network/source/tracing.h" namespace Envoy { namespace Extensions { diff --git a/source/extensions/filters/network/generic_proxy/tracing.h b/contrib/generic_proxy/filters/network/source/tracing.h similarity index 92% rename from source/extensions/filters/network/generic_proxy/tracing.h rename to contrib/generic_proxy/filters/network/source/tracing.h index 874d403535d4..43ed9f59dec9 100644 --- a/source/extensions/filters/network/generic_proxy/tracing.h +++ b/contrib/generic_proxy/filters/network/source/tracing.h @@ -2,7 +2,7 @@ #include "envoy/tracing/trace_context.h" -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" +#include "contrib/generic_proxy/filters/network/source/interface/stream.h" namespace Envoy { namespace Extensions { diff --git a/test/extensions/filters/network/generic_proxy/BUILD b/contrib/generic_proxy/filters/network/test/BUILD similarity index 52% rename from test/extensions/filters/network/generic_proxy/BUILD rename to contrib/generic_proxy/filters/network/test/BUILD index 33d7e4e26292..e57a54439024 100644 --- a/test/extensions/filters/network/generic_proxy/BUILD +++ b/contrib/generic_proxy/filters/network/test/BUILD @@ -2,12 +2,12 @@ load( "//bazel:envoy_build_system.bzl", "envoy_cc_test", "envoy_cc_test_library", - "envoy_package", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_package() +envoy_contrib_package() envoy_cc_test_library( name = "fake_codec_lib", @@ -16,9 +16,8 @@ envoy_cc_test_library( ], hdrs = ["fake_codec.h"], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", "//source/common/buffer:buffer_lib", - "//source/extensions/filters/network/generic_proxy:access_log_lib", - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", ], ) @@ -29,10 +28,10 @@ envoy_cc_test( ], deps = [ ":fake_codec_lib", + "//contrib/generic_proxy/filters/network/source:route_lib", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:route_mocks", "//source/common/buffer:buffer_lib", - "//source/extensions/filters/network/generic_proxy:route_lib", - "//test/extensions/filters/network/generic_proxy/mocks:filter_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:route_mocks", "//test/mocks/server:factory_context_mocks", "//test/test_common:registry_lib", "//test/test_common:test_runtime_lib", @@ -47,11 +46,11 @@ envoy_cc_test( ], deps = [ ":fake_codec_lib", + "//contrib/generic_proxy/filters/network/source:proxy_lib", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:route_mocks", "//source/common/buffer:buffer_lib", - "//source/extensions/filters/network/generic_proxy:proxy_lib", - "//test/extensions/filters/network/generic_proxy/mocks:codec_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:filter_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:route_mocks", "//test/mocks/server:factory_context_mocks", "//test/test_common:registry_lib", "//test/test_common:utility_lib", @@ -65,20 +64,19 @@ envoy_cc_test( ], deps = [ ":fake_codec_lib", + "//contrib/generic_proxy/filters/network/source:config", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:route_mocks", "//source/common/buffer:buffer_lib", - "//source/extensions/filters/network/generic_proxy:config", - "//source/extensions/filters/network/generic_proxy/router:config", "//source/extensions/tracers/zipkin:config", - "//test/extensions/filters/network/generic_proxy/mocks:codec_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:filter_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:route_mocks", "//test/mocks/network:network_mocks", "//test/mocks/server:factory_context_mocks", "//test/test_common:registry_lib", "//test/test_common:test_runtime_lib", "//test/test_common:utility_lib", + "@envoy_api//contrib/envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", "@envoy_api//envoy/admin/v3:pkg_cc_proto", - "@envoy_api//envoy/extensions/filters/network/generic_proxy/v3:pkg_cc_proto", ], ) @@ -92,19 +90,18 @@ envoy_cc_test( ], deps = [ ":fake_codec_lib", + "//contrib/generic_proxy/filters/network/source:config", + "//contrib/generic_proxy/filters/network/source:proxy_lib", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:route_mocks", "//envoy/event:timer_interface", "//source/common/buffer:buffer_lib", "//source/common/common:thread_annotations", "//source/common/network:socket_option_lib", "//source/extensions/access_loggers/file:config", - "//source/extensions/filters/network/generic_proxy:config", - "//source/extensions/filters/network/generic_proxy:proxy_lib", - "//source/extensions/filters/network/generic_proxy/router:config", "//source/extensions/transport_sockets/raw_buffer:config", "//test/common/upstream:utility_lib", - "//test/extensions/filters/network/generic_proxy/mocks:codec_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:filter_mocks", - "//test/extensions/filters/network/generic_proxy/mocks:route_mocks", "//test/integration:base_integration_test_lib", "//test/mocks/server:factory_context_mocks", "//test/mocks/upstream:cluster_info_mocks", @@ -120,7 +117,7 @@ envoy_cc_test( ], deps = [ ":fake_codec_lib", - "//source/extensions/filters/network/generic_proxy:match_lib", + "//contrib/generic_proxy/filters/network/source:match_lib", "//test/mocks/server:factory_context_mocks", ], ) @@ -132,39 +129,7 @@ envoy_cc_test( ], deps = [ ":fake_codec_lib", - "//source/extensions/filters/network/generic_proxy:access_log_lib", + "//contrib/generic_proxy/filters/network/source:access_log_lib", "//test/mocks/stream_info:stream_info_mocks", ], ) - -envoy_cc_test( - name = "stream_test", - srcs = [ - "stream_test.cc", - ], - deps = [ - "//source/extensions/filters/network/generic_proxy/interface:stream_interface", - ], -) - -envoy_cc_test( - name = "tracing_test", - srcs = [ - "tracing_test.cc", - ], - deps = [ - ":fake_codec_lib", - "//source/extensions/filters/network/generic_proxy:tracing_lib", - ], -) - -envoy_cc_test( - name = "stats_test", - srcs = [ - "stats_test.cc", - ], - deps = [ - "//source/extensions/filters/network/generic_proxy:stats_lib", - "//test/mocks/server:factory_context_mocks", - ], -) diff --git a/test/extensions/filters/network/generic_proxy/access_log_test.cc b/contrib/generic_proxy/filters/network/test/access_log_test.cc similarity index 64% rename from test/extensions/filters/network/generic_proxy/access_log_test.cc rename to contrib/generic_proxy/filters/network/test/access_log_test.cc index b0041c6d08dd..ab2f9470ada1 100644 --- a/test/extensions/filters/network/generic_proxy/access_log_test.cc +++ b/contrib/generic_proxy/filters/network/test/access_log_test.cc @@ -1,8 +1,7 @@ -#include "source/extensions/filters/network/generic_proxy/access_log.h" - -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" #include "test/mocks/stream_info/mocks.h" +#include "contrib/generic_proxy/filters/network/source/access_log.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" #include "gtest/gtest.h" namespace Envoy { @@ -11,53 +10,6 @@ namespace NetworkFilters { namespace GenericProxy { namespace { -TEST(GenericStatusCodeFormatterProviderTest, GenericStatusCodeFormatterProviderTest) { - FormatterContext context; - GenericStatusCodeFormatterProvider formatter; - StreamInfo::MockStreamInfo stream_info; - - EXPECT_EQ(formatter.formatWithContext(context, stream_info), absl::nullopt); - EXPECT_TRUE(formatter.formatValueWithContext(context, stream_info).has_null_value()); - - FakeStreamCodecFactory::FakeResponse response; - response.status_ = {1234, false}; - context.response_ = &response; - - EXPECT_EQ(formatter.formatWithContext(context, stream_info).value(), "1234"); - EXPECT_EQ(formatter.formatValueWithContext(context, stream_info).number_value(), 1234.0); -} - -TEST(StringValueFormatterProviderTest, StringValueFormatterProviderTest) { - { - - FormatterContext context; - StringValueFormatterProvider formatter( - [](const FormatterContext& context, - const StreamInfo::StreamInfo&) -> absl::optional { - if (context.request_ == nullptr) { - return absl::nullopt; - } - return std::string(context.request_->path()); - }, - 9); - StreamInfo::MockStreamInfo stream_info; - - EXPECT_EQ(formatter.formatWithContext(context, stream_info), absl::nullopt); - EXPECT_TRUE(formatter.formatValueWithContext(context, stream_info).has_null_value()); - - FakeStreamCodecFactory::FakeRequest request; - request.path_ = "ANYTHING"; - context.request_ = &request; - - EXPECT_EQ(formatter.formatWithContext(context, stream_info).value(), "ANYTHING"); - EXPECT_EQ(formatter.formatValueWithContext(context, stream_info).string_value(), "ANYTHING"); - - request.path_ = "ANYTHING_LONGER_THAN_9"; - EXPECT_EQ(formatter.formatWithContext(context, stream_info).value(), "ANYTHING_"); - EXPECT_EQ(formatter.formatValueWithContext(context, stream_info).string_value(), "ANYTHING_"); - } -} - TEST(AccessLogFormatterTest, AccessLogFormatterTest) { { @@ -157,9 +109,11 @@ TEST(AccessLogFormatterTest, AccessLogFormatterTest) { } { - // Test for %GENERIC_RESPONSE_CODE%. + // Test for %RESPONSE_CODE%. + // This command overrides the default one which is defined in the + // source/common/formatter/stream_info_formatter.cc. FormatterContext context; - Envoy::Formatter::FormatterBaseImpl formatter("%GENERIC_RESPONSE_CODE%"); + Envoy::Formatter::FormatterBaseImpl formatter("%RESPONSE_CODE%"); StreamInfo::MockStreamInfo stream_info; EXPECT_EQ(formatter.formatWithContext(context, stream_info), "-"); diff --git a/test/extensions/filters/network/generic_proxy/codecs/dubbo/BUILD b/contrib/generic_proxy/filters/network/test/codecs/dubbo/BUILD similarity index 60% rename from test/extensions/filters/network/generic_proxy/codecs/dubbo/BUILD rename to contrib/generic_proxy/filters/network/test/codecs/dubbo/BUILD index 38b9b8fdb12c..993056a11fae 100644 --- a/test/extensions/filters/network/generic_proxy/codecs/dubbo/BUILD +++ b/contrib/generic_proxy/filters/network/test/codecs/dubbo/BUILD @@ -1,12 +1,12 @@ load( "//bazel:envoy_build_system.bzl", "envoy_cc_test", - "envoy_package", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_package() +envoy_contrib_package() envoy_cc_test( name = "config_test", @@ -14,9 +14,9 @@ envoy_cc_test( "config_test.cc", ], deps = [ - "//source/extensions/filters/network/generic_proxy/codecs/dubbo:config", + "//contrib/generic_proxy/filters/network/source/codecs/dubbo:config", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", "//test/extensions/common/dubbo:mocks_lib", - "//test/extensions/filters/network/generic_proxy/mocks:codec_mocks", "//test/mocks/server:factory_context_mocks", ], ) diff --git a/test/extensions/filters/network/generic_proxy/codecs/dubbo/config_test.cc b/contrib/generic_proxy/filters/network/test/codecs/dubbo/config_test.cc similarity index 83% rename from test/extensions/filters/network/generic_proxy/codecs/dubbo/config_test.cc rename to contrib/generic_proxy/filters/network/test/codecs/dubbo/config_test.cc index e2b1aff1f40d..17792dc903ed 100644 --- a/test/extensions/filters/network/generic_proxy/codecs/dubbo/config_test.cc +++ b/contrib/generic_proxy/filters/network/test/codecs/dubbo/config_test.cc @@ -2,12 +2,12 @@ #include #include "source/extensions/common/dubbo/message.h" -#include "source/extensions/filters/network/generic_proxy/codecs/dubbo/config.h" #include "test/extensions/common/dubbo/mocks.h" -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" #include "test/mocks/server/factory_context.h" +#include "contrib/generic_proxy/filters/network/source/codecs/dubbo/config.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" #include "gtest/gtest.h" namespace Envoy { @@ -49,15 +49,6 @@ MessageMetadataSharedPtr createDubboResponse(DubboRequest& request, ResponseStat TEST(DubboRequestTest, DubboRequestTest) { DubboRequest request(createDubboRequst(false)); - { - auto frame_flags = request.frameFlags(); - EXPECT_EQ(frame_flags.streamId(), 123456); - EXPECT_EQ(frame_flags.endStream(), true); - EXPECT_EQ(frame_flags.heartbeat(), false); - EXPECT_EQ(frame_flags.oneWayStream(), false); - EXPECT_EQ(frame_flags.drainClose(), false); - } - // Static attributes test. { EXPECT_EQ("dubbo", request.protocol()); } @@ -89,54 +80,11 @@ TEST(DubboRequestTest, DubboRequestTest) { // Version is not part of attachments. So there are only 2 attachments. EXPECT_EQ(2, attachment_size); } - // Iterate headers and break; - { - size_t attachment_size = 0; - request.forEach([&attachment_size](absl::string_view, absl::string_view) { - attachment_size++; - return false; - }); - // Version is not part of attachments. So there are only 2 attachments. - EXPECT_EQ(1, attachment_size); - } - - // Erase headers. - { - request.erase("group"); - EXPECT_EQ(false, request.get("group").has_value()); - - request.erase("custom_key"); - EXPECT_EQ(false, request.get("custom_key").has_value()); - } -} - -TEST(DubboRequestTest, OneWayDubboRequestTest) { - DubboRequest request(createDubboRequst(true)); - - { - auto frame_flags = request.frameFlags(); - EXPECT_EQ(frame_flags.streamId(), 123456); - EXPECT_EQ(frame_flags.endStream(), true); - EXPECT_EQ(frame_flags.heartbeat(), false); - EXPECT_EQ(frame_flags.oneWayStream(), true); - EXPECT_EQ(frame_flags.drainClose(), false); - } } TEST(DubboResponseTest, DubboResponseTest) { DubboRequest request(createDubboRequst(false)); - { - DubboResponse response( - createDubboResponse(request, ResponseStatus::Ok, RpcResponseType::ResponseWithValue)); - auto frame_flags = response.frameFlags(); - EXPECT_EQ(frame_flags.streamId(), 123456); - EXPECT_EQ(frame_flags.endStream(), true); - EXPECT_EQ(frame_flags.heartbeat(), false); - EXPECT_EQ(frame_flags.oneWayStream(), false); - EXPECT_EQ(frame_flags.drainClose(), false); - } - // Static attributes test. { DubboResponse response( @@ -292,21 +240,6 @@ TEST(DubboServerCodecTest, DubboServerCodecTest) { server_codec.decode(buffer, false); } - // Decode heartbeat request. - { - server_codec.metadata_.reset(); - - Buffer::OwnedImpl buffer; - buffer.add(std::string({'\xda', '\xbb', '\xe2', 00})); - buffer.writeBEInt(1); - buffer.writeBEInt(1); - buffer.writeByte('N'); - - EXPECT_CALL(*raw_serializer, deserializeRpcRequest(_, _)); - EXPECT_CALL(callbacks, writeToConnection(_)); - server_codec.decode(buffer, false); - } - // Encode response. { @@ -433,21 +366,6 @@ TEST(DubboClientCodecTest, DubboClientCodecTest) { client_codec.decode(buffer, false); } - // Decode heartbeat request. - { - client_codec.metadata_.reset(); - - Buffer::OwnedImpl buffer; - buffer.add(std::string({'\xda', '\xbb', '\xe2', 00})); - buffer.writeBEInt(1); - buffer.writeBEInt(1); - buffer.writeByte('N'); - - EXPECT_CALL(*raw_serializer, deserializeRpcRequest(_, _)); - EXPECT_CALL(callbacks, writeToConnection(_)); - client_codec.decode(buffer, false); - } - // Encode normal request. { MockEncodingContext encoding_context; diff --git a/test/extensions/filters/network/generic_proxy/codecs/http1/BUILD b/contrib/generic_proxy/filters/network/test/codecs/http1/BUILD similarity index 56% rename from test/extensions/filters/network/generic_proxy/codecs/http1/BUILD rename to contrib/generic_proxy/filters/network/test/codecs/http1/BUILD index e0b72f498825..d13a77613895 100644 --- a/test/extensions/filters/network/generic_proxy/codecs/http1/BUILD +++ b/contrib/generic_proxy/filters/network/test/codecs/http1/BUILD @@ -1,12 +1,12 @@ load( "//bazel:envoy_build_system.bzl", "envoy_cc_test", - "envoy_package", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_package() +envoy_contrib_package() envoy_cc_test( name = "config_test", @@ -14,8 +14,8 @@ envoy_cc_test( "config_test.cc", ], deps = [ - "//source/extensions/filters/network/generic_proxy/codecs/http1:config", - "//test/extensions/filters/network/generic_proxy/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/source/codecs/http1:config", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", "//test/mocks/server:factory_context_mocks", ], ) diff --git a/test/extensions/filters/network/generic_proxy/codecs/http1/config_test.cc b/contrib/generic_proxy/filters/network/test/codecs/http1/config_test.cc similarity index 69% rename from test/extensions/filters/network/generic_proxy/codecs/http1/config_test.cc rename to contrib/generic_proxy/filters/network/test/codecs/http1/config_test.cc index ba774324ca36..5441bd19ddfe 100644 --- a/test/extensions/filters/network/generic_proxy/codecs/http1/config_test.cc +++ b/contrib/generic_proxy/filters/network/test/codecs/http1/config_test.cc @@ -1,11 +1,10 @@ #include #include -#include "source/extensions/filters/network/generic_proxy/codecs/http1/config.h" - -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" #include "test/mocks/server/factory_context.h" +#include "contrib/generic_proxy/filters/network/source/codecs/http1/config.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" #include "gtest/gtest.h" namespace Envoy { @@ -49,28 +48,6 @@ TEST(Http1MessageFrameTest, Http1MessageFrameTest) { EXPECT_EQ(count, 4); } - // ForEach but return break; - { - auto headers = Http::RequestHeaderMapImpl::create(); - // Add some headers. - headers->addCopy(Http::Headers::get().HostLegacy, "host"); - headers->addCopy(Http::Headers::get().Path, "/path"); - headers->addCopy(Http::Headers::get().Method, "GET"); - // Add some custom headers. - headers->addCopy(Http::LowerCaseString("custom"), "value"); - - HttpRequestFrame frame(std::move(headers), true); - - // Check that the headers are iterated correctly. - size_t count = 0; - frame.forEach([&count](absl::string_view, absl::string_view) -> bool { - count++; - return false; - }); - - EXPECT_EQ(count, 1); - } - // Get. { auto headers = Http::RequestHeaderMapImpl::create(); @@ -257,14 +234,10 @@ class Http1ServerCodecTest : public testing::Test { std::unique_ptr codec_; }; -TEST_F(Http1ServerCodecTest, DecodeHeaderOnlyRequest) { +TEST_F(Http1ServerCodecTest, HeaderOnlyRequestDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - // Empty methods. Call these methods to increase coverage. - codec_->onStatusImpl("", 0); - codec_->onDecodingSuccess(ResponseHeaderFramePtr{nullptr}, {}); - Buffer::OwnedImpl buffer; buffer.add("GET / HTTP/1.1\r\n" @@ -292,7 +265,7 @@ TEST_F(Http1ServerCodecTest, DecodeHeaderOnlyRequest) { codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestWithBody) { +TEST_F(Http1ServerCodecTest, RequestDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -331,50 +304,7 @@ TEST_F(Http1ServerCodecTest, DecodeRequestWithBody) { codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestAndCloseConnectionAfterHeader) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - Buffer::OwnedImpl buffer; - - buffer.add("GET / HTTP/1.1\r\n" - "Host: host\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)) - .WillOnce(Invoke([this](RequestHeaderFramePtr, absl::optional) { - mock_connection_.close(Network::ConnectionCloseType::NoFlush); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ServerCodecTest, DecodeRequestAndCloseConnectionAfterBody) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - Buffer::OwnedImpl buffer; - - buffer.add("GET / HTTP/1.1\r\n" - "Host: host\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)); - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_)) - .WillOnce(Invoke([this](RequestCommonFramePtr) { - mock_connection_.close(Network::ConnectionCloseType::NoFlush); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBody) { +TEST_F(Http1ServerCodecTest, ChunkedRequestDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -385,12 +315,11 @@ TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBody) { "Transfer-Encoding: chunked\r\n" "custom: value\r\n" "\r\n" - "4\r\n" // Chunk header. - "body" // Chunk body. - "\r\n" // Chunk footer. - "0\r\n" // Last chunk header. - "trailer-key: trailer-value\r\n" // Trailers in the last chunk. Will be ignored. - "\r\n"); // Last chunk footer. + "4\r\n" // Chunk header. + "body" // Chunk body. + "\r\n" // Chunk footer. + "0\r\n" // Last chunk header. + "\r\n"); // Last chunk footer. EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)) .WillOnce(Invoke([](RequestHeaderFramePtr frame, absl::optional) { @@ -422,7 +351,7 @@ TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBody) { codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBodyWithMultipleFrames) { +TEST_F(Http1ServerCodecTest, MultipleBufferChunkedRequestDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -477,7 +406,7 @@ TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBodyWithMultipleFrames) { codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeUnexpectedRequest) { +TEST_F(Http1ServerCodecTest, UnexpectedRequestTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -568,7 +497,7 @@ TEST_F(Http1ServerCodecTest, DecodeUnexpectedRequest) { } } -TEST_F(Http1ServerCodecTest, Respond) { +TEST_F(Http1ServerCodecTest, RespondTest) { // Create a request. auto headers = Http::RequestHeaderMapImpl::create(); headers->addCopy(Http::Headers::get().HostLegacy, "host"); @@ -580,7 +509,7 @@ TEST_F(Http1ServerCodecTest, Respond) { // Respond with a response. { - for (int i = 0; i <= 20; i++) { + for (int i = 0; i <= 16; i++) { auto response = codec_->respond(absl::Status(static_cast(i), ""), "", request); @@ -594,10 +523,9 @@ TEST_F(Http1ServerCodecTest, Respond) { } } -TEST_F(Http1ServerCodecTest, EncodeHeaderOnlyResponse) { +TEST_F(Http1ServerCodecTest, HeaderOnlyResponseEncodingTest) { // Mock request. - codec_->active_request_ = - ActiveRequest{nullptr, /*request_has_body_*/ false, /*request_complete_*/ true}; + codec_->active_request_ = ActiveRequest{nullptr, true}; // Create a response. auto headers = Http::ResponseHeaderMapImpl::create(); @@ -620,10 +548,9 @@ TEST_F(Http1ServerCodecTest, EncodeHeaderOnlyResponse) { } } -TEST_F(Http1ServerCodecTest, EncodeResponseWhichMissRequiredHeaders) { +TEST_F(Http1ServerCodecTest, MissingRequiredHeadersEncodingTest) { // Mock request. - codec_->active_request_ = - ActiveRequest{nullptr, /*request_has_body_*/ false, /*request_complete_*/ true}; + codec_->active_request_ = ActiveRequest{nullptr, true}; // Create a request without method. auto headers = Http::ResponseHeaderMapImpl::create(); @@ -640,29 +567,9 @@ TEST_F(Http1ServerCodecTest, EncodeResponseWhichMissRequiredHeaders) { } } -TEST_F(Http1ServerCodecTest, EncodeResponseButNoActiveRequest) { - // No active request. - codec_->active_request_.reset(); - - NiceMock encoding_context; - - // Create a response. - auto headers = Http::ResponseHeaderMapImpl::create(); - headers->setStatus(200); - HttpResponseFrame response(std::move(headers), true); - - // Encode the response. - { - auto status_or = codec_->encode(response, encoding_context); - EXPECT_FALSE(status_or.ok()); - EXPECT_EQ(status_or.status().message(), "no request for coming response"); - } -} - -TEST_F(Http1ServerCodecTest, EncodeResponseWithBody) { +TEST_F(Http1ServerCodecTest, ResponseEncodingTest) { // Mock request. - codec_->active_request_ = - ActiveRequest{nullptr, /*request_has_body_*/ false, /*request_complete_*/ true}; + codec_->active_request_ = ActiveRequest{nullptr, true}; // Create a response. auto headers = Http::ResponseHeaderMapImpl::create(); @@ -698,10 +605,9 @@ TEST_F(Http1ServerCodecTest, EncodeResponseWithBody) { } } -TEST_F(Http1ServerCodecTest, EncodeResponseWithChunkedBody) { +TEST_F(Http1ServerCodecTest, ChunkedResponseEncodingTest) { // Mock request. - codec_->active_request_ = - ActiveRequest{nullptr, /*request_has_body_*/ false, /*request_complete_*/ true}; + codec_->active_request_ = ActiveRequest{nullptr, true}; // Create a response. auto headers = Http::ResponseHeaderMapImpl::create(); @@ -740,51 +646,8 @@ TEST_F(Http1ServerCodecTest, EncodeResponseWithChunkedBody) { EXPECT_TRUE(codec_->encode(body, encoding_context).ok()); } } -TEST_F(Http1ServerCodecTest, EncodeResponseWithChunkedBodyButNotSetChunkHeader) { - // Mock request. - codec_->active_request_ = - ActiveRequest{nullptr, /*request_has_body_*/ false, /*request_complete_*/ true}; - - // Create a response. - auto headers = Http::ResponseHeaderMapImpl::create(); - headers->setStatus(200); - - HttpResponseFrame response(std::move(headers), false); - - Buffer::OwnedImpl body_buffer("body"); - HttpRawBodyFrame body(body_buffer, true); - - NiceMock encoding_context; - - // Encode the response. - { - EXPECT_CALL(codec_callbacks_, writeToConnection(_)) - .WillOnce(Invoke([](Buffer::Instance& buffer) { - EXPECT_EQ(buffer.toString(), - "HTTP/1.1 200 OK\r\n" - "transfer-encoding: chunked\r\n" // Codec will add this header for chunked - // response by default if it is not set. - "\r\n"); - buffer.drain(buffer.length()); - })); - - EXPECT_TRUE(codec_->encode(response, encoding_context).ok()); - - EXPECT_CALL(codec_callbacks_, writeToConnection(_)) - .WillOnce(Invoke([](Buffer::Instance& buffer) { - EXPECT_EQ(buffer.toString(), "4\r\n" // Chunk header. - "body" // Chunk body. - "\r\n" // Chunk footer. - "0\r\n" // Last chunk header. - "\r\n"); // Last chunk footer. - buffer.drain(buffer.length()); - })); - - EXPECT_TRUE(codec_->encode(body, encoding_context).ok()); - } -} -TEST_F(Http1ServerCodecTest, DecodeRequestAndEncodeResponse) { +TEST_F(Http1ServerCodecTest, RequestAndResponseTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -827,48 +690,7 @@ TEST_F(Http1ServerCodecTest, DecodeRequestAndEncodeResponse) { } } -TEST_F(Http1ServerCodecTest, DecodeExpectRequestAndItWillBeRepliedDirectly) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - Buffer::OwnedImpl buffer; - - buffer.add("GET / HTTP/1.1\r\n" - "Host: host\r\n" - "custom: value\r\n" - "Expect: 100-continue\r\n" - "\r\n"); - - EXPECT_CALL(codec_callbacks_, writeToConnection(_)).WillOnce(Invoke([](Buffer::Instance& buffer) { - EXPECT_EQ(buffer.toString(), "HTTP/1.1 100 Continue\r\n" - "content-length: 0\r\n" - "\r\n"); - buffer.drain(buffer.length()); - })); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)) - .WillOnce(Invoke([](RequestHeaderFramePtr frame, absl::optional) { - EXPECT_EQ(frame->frameFlags().endStream(), true); - - auto* request = dynamic_cast(frame.get()); - - EXPECT_EQ(request->host(), "host"); - EXPECT_EQ(request->path(), "/"); - EXPECT_EQ(request->method(), "GET"); - EXPECT_EQ(request->get("host").value(), "host"); - EXPECT_EQ(request->get(":authority").value(), "host"); - EXPECT_EQ(request->get(":path").value(), "/"); - EXPECT_EQ(request->get(":method").value(), "GET"); - EXPECT_EQ(request->get("custom").value(), "value"); - - // Expect header should be replied directly and then be removed from the request. - EXPECT_FALSE(request->get("expect").has_value()); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ServerCodecTest, ResponseCompleteBeforeRequestComplete) { +TEST_F(Http1ServerCodecTest, ResponseCompleteBeforeRequestCompleteTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -912,7 +734,7 @@ TEST_F(Http1ServerCodecTest, ResponseCompleteBeforeRequestComplete) { EXPECT_EQ(status_or.status().message(), "response complete before request complete"); } -TEST_F(Http1ServerCodecTest, NewRequestBeforeFirstRequestComplete) { +TEST_F(Http1ServerCodecTest, NewRequestBeforeFirstRequestCompleteTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -942,7 +764,7 @@ TEST_F(Http1ServerCodecTest, NewRequestBeforeFirstRequestComplete) { codec_->decode(buffer2, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestInSingleFrameMode) { +TEST_F(Http1ServerCodecTest, SingleFrameModeRequestDecodingTest) { initializeCodec(true, 8 * 1024 * 1024); ON_CALL(codec_callbacks_, connection()) @@ -979,26 +801,7 @@ TEST_F(Http1ServerCodecTest, DecodeRequestInSingleFrameMode) { codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestInSingleFrameModeButBodyTooLarge1) { - initializeCodec(true, 4); - - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - Buffer::OwnedImpl buffer; - - buffer.add("GET / HTTP/1.1\r\n" - "Host: host\r\n" - "Content-Length: 5\r\n" - "custom: value\r\n" - "\r\n" - "body~"); // Request is complete and the body is too large. - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); -} - -TEST_F(Http1ServerCodecTest, DecodeRequestInSingleFrameModeButBodyTooLarge2) { +TEST_F(Http1ServerCodecTest, SingleFrameModeRequestTooLargeTest) { initializeCodec(true, 4); ON_CALL(codec_callbacks_, connection()) @@ -1008,16 +811,16 @@ TEST_F(Http1ServerCodecTest, DecodeRequestInSingleFrameModeButBodyTooLarge2) { buffer.add("GET / HTTP/1.1\r\n" "Host: host\r\n" - "Content-Length: 8\r\n" + "Content-Length: 4\r\n" "custom: value\r\n" "\r\n" - "xxxxx"); // Request is not complete but the body is too large. + "body~"); EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBodyInSingleFrameMode) { +TEST_F(Http1ServerCodecTest, SingleFrameModeChunkedRequestDecodingTest) { initializeCodec(true, 8 * 1024 * 1024); ON_CALL(codec_callbacks_, connection()) @@ -1058,7 +861,7 @@ TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBodyInSingleFrameMode) { codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBodyWithMultipleFramesInSingleFrameMode) { +TEST_F(Http1ServerCodecTest, SingleFrameModeMultipleBufferChunkedRequestDecodingTest) { initializeCodec(true, 8 * 1024 * 1024); ON_CALL(codec_callbacks_, connection()) @@ -1104,10 +907,9 @@ TEST_F(Http1ServerCodecTest, DecodeRequestWithChunkedBodyWithMultipleFramesInSin codec_->decode(buffer, false); } -TEST_F(Http1ServerCodecTest, EncodeResponseInSingleFrameMode) { +TEST_F(Http1ServerCodecTest, SingleFrameModeResponseEncodingTest) { // Mock request. - codec_->active_request_ = - ActiveRequest{nullptr, /*request_has_body_*/ false, /*request_complete_*/ true}; + codec_->active_request_ = ActiveRequest{nullptr, true}; // Create a response. auto headers = Http::ResponseHeaderMapImpl::create(); @@ -1144,7 +946,7 @@ class Http1ClientCodecTest : public testing::Test { codec_->setCodecCallbacks(codec_callbacks_); } - void encodingGetRequest() { + void encodingOneRequest() { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1185,50 +987,16 @@ class Http1ClientCodecTest : public testing::Test { } } - void encodingHeadRequest() { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - // Create a request. - auto headers = Http::RequestHeaderMapImpl::create(); - headers->addCopy(Http::Headers::get().HostLegacy, "host"); - headers->addCopy(Http::Headers::get().Path, "/path"); - headers->addCopy(Http::Headers::get().Method, "HEAD"); - headers->addCopy(Http::Headers::get().ContentLength, "0"); - - HttpRequestFrame request(std::move(headers), true); - - NiceMock encoding_context; - - // Encode the request. - { - EXPECT_CALL(codec_callbacks_, writeToConnection(_)) - .WillOnce(Invoke([](Buffer::Instance& buffer) { - EXPECT_EQ(buffer.toString(), "HEAD /path HTTP/1.1\r\n" - "host: host\r\n" - "content-length: 0\r\n" - "\r\n"); - buffer.drain(buffer.length()); - })); - - EXPECT_TRUE(codec_->encode(request, encoding_context).ok()); - } - } - NiceMock codec_callbacks_; NiceMock mock_connection_; std::unique_ptr codec_; }; -TEST_F(Http1ClientCodecTest, DecodeHeaderOnlyResponse) { +TEST_F(Http1ClientCodecTest, HeaderOnlyResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - // Empty methods. Call these methods to increase coverage. - codec_->onUrlImpl("", 0); - codec_->onDecodingSuccess(RequestHeaderFramePtr{nullptr}, {}); - - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1248,101 +1016,11 @@ TEST_F(Http1ClientCodecTest, DecodeHeaderOnlyResponse) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, ResponseComesBeforeRequest) { +TEST_F(Http1ClientCodecTest, ResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 200 OK\r\n" - "content-length: 0\r\n" - "\r\n"); - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeHTTP10Response) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.0 200 OK\r\n" - "content-length: 0\r\n" - "\r\n"); - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeResponseForHeadRequest) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - encodingHeadRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 200 OK\r\n" - "Content-Length: 0\r\n" - "custom: value\r\n" - "\r\n"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)) - .WillOnce(Invoke([](ResponseHeaderFramePtr frame, absl::optional) { - auto* response = dynamic_cast(frame.get()); - EXPECT_EQ(frame->frameFlags().endStream(), true); - EXPECT_EQ(response->response_->getStatusValue(), "200"); - EXPECT_EQ(response->get("custom").value(), "value"); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeResponseShouldNotHasBody) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 304 OK\r\n" - "Content-Length: 0\r\n" - "custom: value\r\n" - "\r\n"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)) - .WillOnce(Invoke([](ResponseHeaderFramePtr frame, absl::optional) { - auto* response = dynamic_cast(frame.get()); - EXPECT_EQ(frame->frameFlags().endStream(), true); - EXPECT_EQ(response->response_->getStatusValue(), "304"); - EXPECT_EQ(response->get("custom").value(), "value"); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, Decode1xxResponseAndItWillBeIgnored) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - buffer.add("HTTP/1.1 100 Continue\r\n" - "\r\n"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_)).Times(0); - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeResponseWithBody) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1373,56 +1051,11 @@ TEST_F(Http1ClientCodecTest, DecodeResponseWithBody) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, DecodeResponseAndCloseConnectionAfterHeader) { +TEST_F(Http1ClientCodecTest, ChunkedResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 200 OK\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)) - .WillOnce(Invoke([this](ResponseHeaderFramePtr, absl::optional) { - mock_connection_.close(Network::ConnectionCloseType::NoFlush); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeResponseAndCloseConnectionAfterBody) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 200 OK\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_, _)); - EXPECT_CALL(codec_callbacks_, onDecodingSuccess(_)) - .WillOnce(Invoke([this](ResponseCommonFramePtr) { - mock_connection_.close(Network::ConnectionCloseType::NoFlush); - })); - - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBody) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1459,11 +1092,11 @@ TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBody) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBodyWithMultipleFrames) { +TEST_F(Http1ClientCodecTest, MultipleBufferChunkedResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1508,7 +1141,7 @@ TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBodyWithMultipleFrames) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, DecodeUnexpectedResponse) { +TEST_F(Http1ClientCodecTest, UnexpectedResponseTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1516,7 +1149,7 @@ TEST_F(Http1ClientCodecTest, DecodeUnexpectedResponse) { { initializeCodec(); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1539,7 +1172,7 @@ TEST_F(Http1ClientCodecTest, DecodeUnexpectedResponse) { { initializeCodec(); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1556,129 +1189,9 @@ TEST_F(Http1ClientCodecTest, DecodeUnexpectedResponse) { EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); codec_->decode(buffer, false); } - - // Transfer-Encoding header for 204 response. - { - initializeCodec(); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 204 OK\r\n" - "Transfer-Encoding: chunked\r\n" - "custom: value\r\n" - "\r\n" - "4\r\n" // Chunk header. - "body" // Chunk body. - "\r\n" // Chunk footer. - "0\r\n" // Last chunk header. - "\r\n"); // Last chunk footer. - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); - } - - // Transfer-Encoding header for 1xx response. - { - initializeCodec(); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 100 Continue\r\n" - "Transfer-Encoding: chunked\r\n" - "custom: value\r\n" - "\r\n" - "4\r\n" // Chunk header. - "body" // Chunk body. - "\r\n" // Chunk footer. - "0\r\n" // Last chunk header. - "\r\n"); // Last chunk footer. - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); - } - - // Transfer-Encoding header for 304 response. - { - initializeCodec(); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 304 Not Modified\r\n" - "Transfer-Encoding: chunked\r\n" - "custom: value\r\n" - "\r\n" - "4\r\n" // Chunk header. - "body" // Chunk body. - "\r\n" // Chunk footer. - "0\r\n" // Last chunk header. - "\r\n"); // Last chunk footer. - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); - } - - // Non-zero Content-Length for 204 response. - { - initializeCodec(); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 204 OK\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); - } - - // Non-zero Content-Length for 1xx response. - { - initializeCodec(); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 100 Continue\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); - } - - // Non-zero Content-Length for 304 response. - { - initializeCodec(); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 304 Not Modified\r\n" - "Content-Length: 4\r\n" - "custom: value\r\n" - "\r\n" - "body"); - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); - } } -TEST_F(Http1ClientCodecTest, EncodeHeaderOnlyRequest) { +TEST_F(Http1ClientCodecTest, HeaderOnlyRequestEncodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1701,14 +1214,13 @@ TEST_F(Http1ClientCodecTest, EncodeHeaderOnlyRequest) { "host: host\r\n" "custom: value\r\n" "\r\n"); - buffer.drain(buffer.length()); })); EXPECT_TRUE(codec_->encode(request, encoding_context).ok()); } } -TEST_F(Http1ClientCodecTest, EncodeRequestMissRequiredHeaders) { +TEST_F(Http1ClientCodecTest, MissingRequiredHeadersEncodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1730,48 +1242,9 @@ TEST_F(Http1ClientCodecTest, EncodeRequestMissRequiredHeaders) { } } -TEST_F(Http1ClientCodecTest, EncodeRequestWithBody) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); +TEST_F(Http1ClientCodecTest, RequestEncodingTest) { encodingOneRequest(); } - // Create a request. - auto headers = Http::RequestHeaderMapImpl::create(); - headers->addCopy(Http::Headers::get().HostLegacy, "host"); - headers->addCopy(Http::Headers::get().Path, "/path"); - headers->addCopy(Http::Headers::get().Method, "POST"); - headers->addCopy(Http::Headers::get().ContentLength, "4"); - - HttpRequestFrame request(std::move(headers), false); - - Buffer::OwnedImpl body_buffer("body"); - HttpRawBodyFrame body(body_buffer, true); - - NiceMock encoding_context; - - // Encode the request. - { - EXPECT_CALL(codec_callbacks_, writeToConnection(_)) - .WillOnce(Invoke([](Buffer::Instance& buffer) { - EXPECT_EQ(buffer.toString(), "POST /path HTTP/1.1\r\n" - "host: host\r\n" - "content-length: 4\r\n" - "\r\n"); - buffer.drain(buffer.length()); - })); - - EXPECT_TRUE(codec_->encode(request, encoding_context).ok()); - - EXPECT_CALL(codec_callbacks_, writeToConnection(_)) - .WillOnce(Invoke([](Buffer::Instance& buffer) { - EXPECT_EQ(buffer.toString(), "body"); - buffer.drain(buffer.length()); - })); - - EXPECT_TRUE(codec_->encode(body, encoding_context).ok()); - } -} - -TEST_F(Http1ClientCodecTest, EncodeRequestWithChunkdBody) { +TEST_F(Http1ClientCodecTest, ChunkedRequestEncodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1816,7 +1289,7 @@ TEST_F(Http1ClientCodecTest, EncodeRequestWithChunkdBody) { } } -TEST_F(Http1ClientCodecTest, EncodeRequestAndDecodeResponse) { +TEST_F(Http1ClientCodecTest, RequestAndResponseTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1861,7 +1334,7 @@ TEST_F(Http1ClientCodecTest, EncodeRequestAndDecodeResponse) { } } -TEST_F(Http1ClientCodecTest, ResponseCompleteBeforeRequestComplete) { +TEST_F(Http1ClientCodecTest, ResponseCompleteBeforeRequestCompleteTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1902,7 +1375,7 @@ TEST_F(Http1ClientCodecTest, ResponseCompleteBeforeRequestComplete) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, EncodeRequestInSingleFrameMode) { +TEST_F(Http1ClientCodecTest, SingleFrameModeRequestEncodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); @@ -1929,19 +1402,18 @@ TEST_F(Http1ClientCodecTest, EncodeRequestInSingleFrameMode) { "content-length: 4\r\n" "\r\n" "body"); - buffer.drain(buffer.length()); })); EXPECT_TRUE(codec_->encode(request, encoding_context).ok()); } } -TEST_F(Http1ClientCodecTest, DecodeResponseInSingleFrameMode) { +TEST_F(Http1ClientCodecTest, SingleFrameModeResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); initializeCodec(true, 8 * 1024 * 1024); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1967,13 +1439,13 @@ TEST_F(Http1ClientCodecTest, DecodeResponseInSingleFrameMode) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, DecodeResponseInSingleFrameModeButBodyIsTooLarge1) { +TEST_F(Http1ClientCodecTest, SingleFrameModeResponseTooLargeTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); initializeCodec(true, 4); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -1981,39 +1453,19 @@ TEST_F(Http1ClientCodecTest, DecodeResponseInSingleFrameModeButBodyIsTooLarge1) "Content-Length: 5\r\n" "custom: value\r\n" "\r\n" - "body~"); // The response is complete and the body is too large. - - EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); - codec_->decode(buffer, false); -} - -TEST_F(Http1ClientCodecTest, DecodeResponseInSingleFrameModeButBodyIsTooLarge2) { - ON_CALL(codec_callbacks_, connection()) - .WillByDefault(testing::Return(makeOptRef(mock_connection_))); - - initializeCodec(true, 4); - - encodingGetRequest(); - - Buffer::OwnedImpl buffer; - - buffer.add("HTTP/1.1 200 OK\r\n" - "Content-Length: 8\r\n" - "custom: value\r\n" - "\r\n" - "xxxxx"); // The response is not complete but the body is too large. + "body~"); EXPECT_CALL(codec_callbacks_, onDecodingFailure(_)); codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBodyInSingleFrameMode) { +TEST_F(Http1ClientCodecTest, SingleFrameModeChunkedResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); initializeCodec(true, 8 * 1024 * 1024); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -2043,13 +1495,13 @@ TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBodyInSingleFrameMode) { codec_->decode(buffer, false); } -TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBodyWithMultipleFramesInSingleFrameMode) { +TEST_F(Http1ClientCodecTest, SingleFrameModeMultipleBufferChunkedResponseDecodingTest) { ON_CALL(codec_callbacks_, connection()) .WillByDefault(testing::Return(makeOptRef(mock_connection_))); initializeCodec(true, 8 * 1024 * 1024); - encodingGetRequest(); + encodingOneRequest(); Buffer::OwnedImpl buffer; @@ -2084,21 +1536,6 @@ TEST_F(Http1ClientCodecTest, DecodeResponseWithChunkedBodyWithMultipleFramesInSi codec_->decode(buffer, false); } -TEST(Http1CodecFactoryTest, Http1CodecFactoryTest) { - NiceMock context; - ProtoConfig proto_config; - - Http1CodecFactoryConfig config_factory; - - auto codec_factory = config_factory.createCodecFactory(proto_config, context); - - auto client_factory = codec_factory->createClientCodec(); - auto server_factory = codec_factory->createServerCodec(); - - EXPECT_NE(dynamic_cast(client_factory.get()), nullptr); - EXPECT_NE(dynamic_cast(server_factory.get()), nullptr); -} - } // namespace } // namespace Http1 } // namespace Codec diff --git a/contrib/generic_proxy/filters/network/test/codecs/kafka/BUILD b/contrib/generic_proxy/filters/network/test/codecs/kafka/BUILD index 43f68dcdc968..d3c54211c8ea 100644 --- a/contrib/generic_proxy/filters/network/test/codecs/kafka/BUILD +++ b/contrib/generic_proxy/filters/network/test/codecs/kafka/BUILD @@ -15,7 +15,7 @@ envoy_cc_test( ], deps = [ "//contrib/generic_proxy/filters/network/source/codecs/kafka:config", - "//test/extensions/filters/network/generic_proxy/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", "//test/mocks/server:factory_context_mocks", ], ) diff --git a/contrib/generic_proxy/filters/network/test/codecs/kafka/config_test.cc b/contrib/generic_proxy/filters/network/test/codecs/kafka/config_test.cc index d6d4c46819e2..a5e97bc932ff 100644 --- a/contrib/generic_proxy/filters/network/test/codecs/kafka/config_test.cc +++ b/contrib/generic_proxy/filters/network/test/codecs/kafka/config_test.cc @@ -1,10 +1,10 @@ #include #include -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" #include "test/mocks/server/factory_context.h" #include "contrib/generic_proxy/filters/network/source/codecs/kafka/config.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" #include "contrib/kafka/filters/network/source/external/requests.h" #include "contrib/kafka/filters/network/source/external/responses.h" #include "gtest/gtest.h" diff --git a/test/extensions/filters/network/generic_proxy/config_test.cc b/contrib/generic_proxy/filters/network/test/config_test.cc similarity index 78% rename from test/extensions/filters/network/generic_proxy/config_test.cc rename to contrib/generic_proxy/filters/network/test/config_test.cc index 7197e810c354..7faaa94afd50 100644 --- a/test/extensions/filters/network/generic_proxy/config_test.cc +++ b/contrib/generic_proxy/filters/network/test/config_test.cc @@ -1,21 +1,20 @@ #include "envoy/admin/v3/config_dump_shared.pb.h" #include "envoy/admin/v3/config_dump_shared.pb.validate.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" -#include "envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" -#include "source/extensions/filters/network/generic_proxy/config.h" - -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" #include "test/mocks/network/mocks.h" #include "test/mocks/server/factory_context.h" #include "test/test_common/registry.h" #include "test/test_common/utility.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/generic_proxy.pb.validate.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.h" +#include "contrib/envoy/extensions/filters/network/generic_proxy/v3/route.pb.validate.h" +#include "contrib/generic_proxy/filters/network/source/config.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" #include "gtest/gtest.h" namespace Envoy { @@ -26,6 +25,7 @@ namespace { using ::testing::Return; +// Keep empty until merge the latest API from main. TEST(FactoryTest, FactoryTest) { const std::string yaml_config = R"EOF( stat_prefix: config_test @@ -453,114 +453,6 @@ TEST(BasicFilterConfigTest, TestConfigurationWithAccessLog) { cb(filter_manager); } -TEST(BasicFilterConfigTest, TestConfigurationWithAccessLogAndLogFilter1) { - const std::string config_yaml = R"EOF( - stat_prefix: ingress - filters: - - name: envoy.filters.generic.router - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.network.generic_proxy.router.v3.Router - codec_config: - name: mock - typed_config: - "@type": type.googleapis.com/xds.type.v3.TypedStruct - type_url: envoy.generic_proxy.codecs.mock.type - value: {} - generic_rds: - config_source: { ads: {} } - route_config_name: test_route - access_log: - - name: envoy.generic_proxy.access_loggers.file - filter: - not_health_check_filter: {} - typed_config: - "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog - path: "/dev/stdout" - log_format: - text_format_source: - inline_string: "%METHOD% %PATH% %HOST% %PROTOCOL% %REQUEST_PROPERTY(key)% RESPONSE_PROPERTY(key)\n" - )EOF"; - - NiceMock codec_factory_config; - Registry::InjectFactory registration(codec_factory_config); - - NiceMock factory_context; - - Factory factory; - - envoy::extensions::filters::network::generic_proxy::v3::GenericProxy config; - TestUtility::loadFromYaml(config_yaml, config); - - auto mock_codec_factory = std::make_unique>(); - - EXPECT_CALL(codec_factory_config, createCodecFactory(_, _)) - .WillOnce(Return(testing::ByMove(std::move(mock_codec_factory)))); - - EXPECT_THROW_WITH_MESSAGE( - { auto status_or = factory.createFilterFactoryFromProto(config, factory_context); }, - EnvoyException, - "Access log filter: only extension filter is supported by non-HTTP access loggers."); -} - -TEST(BasicFilterConfigTest, TestConfigurationWithAccessLogAndLogFilter2) { - const std::string config_yaml = R"EOF( - stat_prefix: ingress - filters: - - name: envoy.filters.generic.router - typed_config: - "@type": type.googleapis.com/envoy.extensions.filters.network.generic_proxy.router.v3.Router - codec_config: - name: mock - typed_config: - "@type": type.googleapis.com/xds.type.v3.TypedStruct - type_url: envoy.generic_proxy.codecs.mock.type - value: {} - generic_rds: - config_source: { ads: {} } - route_config_name: test_route - access_log: - - name: envoy.generic_proxy.access_loggers.file - filter: - extension_filter: - name: envoy.generic_proxy.access_log.fake - typed_config: - "@type": type.googleapis.com/xds.type.v3.TypedStruct - type_url: envoy.generic_proxy.access_log.fake.type - value: {} - typed_config: - "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog - path: "/dev/stdout" - log_format: - text_format_source: - inline_string: "%METHOD% %PATH% %HOST% %PROTOCOL% %REQUEST_PROPERTY(key)% RESPONSE_PROPERTY(key)\n" - )EOF"; - - NiceMock codec_factory_config; - Registry::InjectFactory registration(codec_factory_config); - - FakeAccessLogExtensionFilterFactory fake_access_log_extension_filter_factory; - Registry::InjectFactory registration_log( - fake_access_log_extension_filter_factory); - - NiceMock factory_context; - - Factory factory; - - envoy::extensions::filters::network::generic_proxy::v3::GenericProxy config; - TestUtility::loadFromYaml(config_yaml, config); - - auto mock_codec_factory = std::make_unique>(); - - EXPECT_CALL(codec_factory_config, createCodecFactory(_, _)) - .WillOnce(Return(testing::ByMove(std::move(mock_codec_factory)))); - - Network::FilterFactoryCb cb = - factory.createFilterFactoryFromProto(config, factory_context).value(); - EXPECT_NE(nullptr, cb); - NiceMock filter_manager; - cb(filter_manager); -} - } // namespace } // namespace GenericProxy } // namespace NetworkFilters diff --git a/test/extensions/filters/network/generic_proxy/fake_codec.cc b/contrib/generic_proxy/filters/network/test/fake_codec.cc similarity index 90% rename from test/extensions/filters/network/generic_proxy/fake_codec.cc rename to contrib/generic_proxy/filters/network/test/fake_codec.cc index 2eba57e0576a..83e42a3118b6 100644 --- a/test/extensions/filters/network/generic_proxy/fake_codec.cc +++ b/contrib/generic_proxy/filters/network/test/fake_codec.cc @@ -1,4 +1,4 @@ -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" #include diff --git a/test/extensions/filters/network/generic_proxy/fake_codec.h b/contrib/generic_proxy/filters/network/test/fake_codec.h similarity index 93% rename from test/extensions/filters/network/generic_proxy/fake_codec.h rename to contrib/generic_proxy/filters/network/test/fake_codec.h index 3c0b25bf9d3b..b03e1a61f476 100644 --- a/test/extensions/filters/network/generic_proxy/fake_codec.h +++ b/contrib/generic_proxy/filters/network/test/fake_codec.h @@ -3,8 +3,8 @@ #include #include "source/common/buffer/buffer_impl.h" -#include "source/extensions/filters/network/generic_proxy/access_log.h" -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" + +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" namespace Envoy { namespace Extensions { @@ -43,7 +43,7 @@ template class FakeStreamBase : public InterfaceType { * Fake request message format: * FAKE-REQ|:;* * Fake response message format: - * FAKE-RSP|:;* + FAKE-RSP|:;* */ class FakeStreamCodecFactory : public CodecFactory { public: @@ -421,30 +421,6 @@ class FakeStreamCodecFactoryConfig : public CodecFactoryConfig { std::string name() const override { return "envoy.generic_proxy.codecs.fake"; } }; -class FakeAccessLogExtensionFilter : public AccessLogFilter { - bool evaluate(const FormatterContext&, const StreamInfo::StreamInfo&) const override { - return true; - } -}; - -class FakeAccessLogExtensionFilterFactory : public AccessLogFilterFactory { -public: - // AccessLogFilterFactory - AccessLogFilterPtr createFilter(const envoy::config::accesslog::v3::ExtensionFilter&, - Server::Configuration::FactoryContext&) override { - return std::make_unique(); - } - - std::set configTypes() override { - return {"envoy.generic_proxy.access_log.fake.type"}; - } - - ProtobufTypes::MessagePtr createEmptyConfigProto() override { - return std::make_unique(); - } - std::string name() const override { return "envoy.generic_proxy.access_log.fake"; } -}; - } // namespace GenericProxy } // namespace NetworkFilters } // namespace Extensions diff --git a/test/extensions/filters/network/generic_proxy/integration_test.cc b/contrib/generic_proxy/filters/network/test/integration_test.cc similarity index 98% rename from test/extensions/filters/network/generic_proxy/integration_test.cc rename to contrib/generic_proxy/filters/network/test/integration_test.cc index 73111aa899e6..f6c441f88f6a 100644 --- a/test/extensions/filters/network/generic_proxy/integration_test.cc +++ b/contrib/generic_proxy/filters/network/test/integration_test.cc @@ -4,17 +4,16 @@ #include #include -#include "source/extensions/filters/network/generic_proxy/proxy.h" - -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" #include "test/integration/base_integration_test.h" #include "test/mocks/server/factory_context.h" #include "test/test_common/registry.h" #include "test/test_common/utility.h" +#include "contrib/generic_proxy/filters/network/source/proxy.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" #include "gtest/gtest.h" namespace Envoy { diff --git a/test/extensions/filters/network/generic_proxy/match_test.cc b/contrib/generic_proxy/filters/network/test/match_test.cc similarity index 78% rename from test/extensions/filters/network/generic_proxy/match_test.cc rename to contrib/generic_proxy/filters/network/test/match_test.cc index f8004e58d893..698d1742e5e3 100644 --- a/test/extensions/filters/network/generic_proxy/match_test.cc +++ b/contrib/generic_proxy/filters/network/test/match_test.cc @@ -1,10 +1,9 @@ #include -#include "source/extensions/filters/network/generic_proxy/match.h" - -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" #include "test/mocks/server/factory_context.h" +#include "contrib/generic_proxy/filters/network/source/match.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" #include "gtest/gtest.h" using testing::NiceMock; @@ -117,24 +116,18 @@ TEST(RequestMatchDataInputTest, RequestMatchDataInputTest) { auto input = factory.createDataInputFactoryCb(*proto_config, factory_context.messageValidationVisitor())(); - EXPECT_EQ(input->dataInputType(), - "Envoy::Extensions::NetworkFilters::GenericProxy::RequestMatchData"); - FakeStreamCodecFactory::FakeRequest request; NiceMock stream_info; MatchInput match_input(request, stream_info, MatchAction::RouteAction); - EXPECT_EQ(&request, &match_input.requestHeader()); - EXPECT_EQ(&stream_info, &match_input.streamInfo()); - EXPECT_EQ(MatchAction::RouteAction, match_input.expectAction()); - - auto custom_match_data = - absl::get>(input->get(match_input).data_); - EXPECT_EQ(&match_input, &dynamic_cast(custom_match_data.get())->data()); + EXPECT_EQ(&request, + &dynamic_cast( + absl::get>(input->get(match_input).data_) + .get()) + ->data() + .requestHeader()); } -class FakeCustomMatchData : public Matcher::CustomMatchData {}; - TEST(RequestMatchInputMatcherTest, RequestMatchInputMatcherTest) { NiceMock factory_context; RequestMatchDataInputMatcherFactory factory; @@ -142,9 +135,6 @@ TEST(RequestMatchInputMatcherTest, RequestMatchInputMatcherTest) { auto matcher = factory.createInputMatcherFactoryCb(*proto_config, factory_context.serverFactoryContext())(); - EXPECT_EQ(*matcher->supportedDataInputTypes().begin(), - "Envoy::Extensions::NetworkFilters::GenericProxy::RequestMatchData"); - { Matcher::MatchingDataType input; EXPECT_FALSE(matcher->match(input)); @@ -155,11 +145,6 @@ TEST(RequestMatchInputMatcherTest, RequestMatchInputMatcherTest) { EXPECT_FALSE(matcher->match(input)); } - { - Matcher::MatchingDataType input = std::make_shared(); - EXPECT_FALSE(matcher->match(input)); - } - { FakeStreamCodecFactory::FakeRequest request; NiceMock stream_info; @@ -181,27 +166,19 @@ TEST(RequestMatchInputMatcherTest, SpecificRequestMatchInputMatcherTest) { EXPECT_TRUE(matcher.match(request)); } - RequestMatcherProto matcher_proto; + // Host match failed. + { + RequestMatcherProto matcher_proto; - const std::string config_yaml = R"EOF( + const std::string config_yaml = R"EOF( host: exact: fake_host - path: - exact: fake_path - method: - exact: fake_method - properties: - - name: key_0 - string_match: - exact: value_0 )EOF"; - TestUtility::loadFromYaml(config_yaml, matcher_proto); + TestUtility::loadFromYaml(config_yaml, matcher_proto); - RequestMatchInputMatcher matcher(matcher_proto, context.serverFactoryContext()); + RequestMatchInputMatcher matcher(matcher_proto, context.serverFactoryContext()); - // Host match failed. - { FakeStreamCodecFactory::FakeRequest request; request.host_ = "another_fake_host"; EXPECT_FALSE(matcher.match(request)); @@ -209,6 +186,19 @@ TEST(RequestMatchInputMatcherTest, SpecificRequestMatchInputMatcherTest) { // Path match failed. { + RequestMatcherProto matcher_proto; + + const std::string config_yaml = R"EOF( + host: + exact: fake_host + path: + exact: fake_path + )EOF"; + + TestUtility::loadFromYaml(config_yaml, matcher_proto); + + RequestMatchInputMatcher matcher(matcher_proto, context.serverFactoryContext()); + FakeStreamCodecFactory::FakeRequest request; request.host_ = "fake_host"; request.path_ = "another_fake_path"; @@ -217,6 +207,21 @@ TEST(RequestMatchInputMatcherTest, SpecificRequestMatchInputMatcherTest) { // Method match failed. { + RequestMatcherProto matcher_proto; + + const std::string config_yaml = R"EOF( + host: + exact: fake_host + path: + exact: fake_path + method: + exact: fake_method + )EOF"; + + TestUtility::loadFromYaml(config_yaml, matcher_proto); + + RequestMatchInputMatcher matcher(matcher_proto, context.serverFactoryContext()); + FakeStreamCodecFactory::FakeRequest request; request.host_ = "fake_host"; request.path_ = "fake_path"; @@ -226,26 +231,54 @@ TEST(RequestMatchInputMatcherTest, SpecificRequestMatchInputMatcherTest) { // Property match failed. { + RequestMatcherProto matcher_proto; - FakeStreamCodecFactory::FakeRequest request; - request.host_ = "fake_host"; - request.path_ = "fake_path"; - request.method_ = "fake_method"; - request.data_["key_0"] = "another_value_0"; - EXPECT_FALSE(matcher.match(request)); - } + const std::string config_yaml = R"EOF( + host: + exact: fake_host + path: + exact: fake_path + method: + exact: fake_method + properties: + - name: key_0 + string_match: + exact: value_0 + )EOF"; + + TestUtility::loadFromYaml(config_yaml, matcher_proto); + + RequestMatchInputMatcher matcher(matcher_proto, context.serverFactoryContext()); - // Property is missing. - { FakeStreamCodecFactory::FakeRequest request; request.host_ = "fake_host"; request.path_ = "fake_path"; request.method_ = "fake_method"; + request.data_["key_0"] = "another_value_0"; EXPECT_FALSE(matcher.match(request)); } // All match. { + RequestMatcherProto matcher_proto; + + const std::string config_yaml = R"EOF( + host: + exact: fake_host + path: + exact: fake_path + method: + exact: fake_method + properties: + - name: key_0 + string_match: + exact: value_0 + )EOF"; + + TestUtility::loadFromYaml(config_yaml, matcher_proto); + + RequestMatchInputMatcher matcher(matcher_proto, context.serverFactoryContext()); + FakeStreamCodecFactory::FakeRequest request; request.host_ = "fake_host"; request.path_ = "fake_path"; diff --git a/test/extensions/filters/network/generic_proxy/mocks/BUILD b/contrib/generic_proxy/filters/network/test/mocks/BUILD similarity index 62% rename from test/extensions/filters/network/generic_proxy/mocks/BUILD rename to contrib/generic_proxy/filters/network/test/mocks/BUILD index bbec71ba2c33..9599804e0706 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/BUILD +++ b/contrib/generic_proxy/filters/network/test/mocks/BUILD @@ -1,20 +1,21 @@ load( "//bazel:envoy_build_system.bzl", "envoy_cc_mock", - "envoy_package", + "envoy_contrib_package", ) licenses(["notice"]) # Apache 2 -envoy_package() +envoy_contrib_package() envoy_cc_mock( name = "filter_mocks", srcs = ["filter.cc"], hdrs = ["filter.h"], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:config_interface", + "//contrib/generic_proxy/filters/network/source/interface:filter_interface", "//source/common/protobuf", - "//source/extensions/filters/network/generic_proxy/interface:filter_interface", "//test/mocks/network:network_mocks", "//test/mocks/tcp:tcp_mocks", "//test/mocks/upstream:host_mocks", @@ -26,8 +27,8 @@ envoy_cc_mock( srcs = ["route.cc"], hdrs = ["route.h"], deps = [ + "//contrib/generic_proxy/filters/network/source/interface:route_interface", "//source/common/config:metadata_lib", - "//source/extensions/filters/network/generic_proxy:route_interface", ], ) @@ -36,6 +37,6 @@ envoy_cc_mock( srcs = ["codec.cc"], hdrs = ["codec.h"], deps = [ - "//source/extensions/filters/network/generic_proxy/interface:codec_interface", + "//contrib/generic_proxy/filters/network/source/interface:codec_interface", ], ) diff --git a/test/extensions/filters/network/generic_proxy/mocks/codec.cc b/contrib/generic_proxy/filters/network/test/mocks/codec.cc similarity index 90% rename from test/extensions/filters/network/generic_proxy/mocks/codec.cc rename to contrib/generic_proxy/filters/network/test/mocks/codec.cc index 67b421606133..049076ef808c 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/codec.cc +++ b/contrib/generic_proxy/filters/network/test/mocks/codec.cc @@ -1,4 +1,4 @@ -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" #include diff --git a/test/extensions/filters/network/generic_proxy/mocks/codec.h b/contrib/generic_proxy/filters/network/test/mocks/codec.h similarity index 97% rename from test/extensions/filters/network/generic_proxy/mocks/codec.h rename to contrib/generic_proxy/filters/network/test/mocks/codec.h index e1c7ff8c167e..baff48a13746 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/codec.h +++ b/contrib/generic_proxy/filters/network/test/mocks/codec.h @@ -1,7 +1,6 @@ #pragma once -#include "source/extensions/filters/network/generic_proxy/interface/codec.h" - +#include "contrib/generic_proxy/filters/network/source/interface/codec.h" #include "gmock/gmock.h" namespace Envoy { diff --git a/test/extensions/filters/network/generic_proxy/mocks/filter.cc b/contrib/generic_proxy/filters/network/test/mocks/filter.cc similarity index 97% rename from test/extensions/filters/network/generic_proxy/mocks/filter.cc rename to contrib/generic_proxy/filters/network/test/mocks/filter.cc index 4e5e3cf48726..4e3a4815a666 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/filter.cc +++ b/contrib/generic_proxy/filters/network/test/mocks/filter.cc @@ -1,4 +1,4 @@ -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" #include diff --git a/test/extensions/filters/network/generic_proxy/mocks/filter.h b/contrib/generic_proxy/filters/network/test/mocks/filter.h similarity index 95% rename from test/extensions/filters/network/generic_proxy/mocks/filter.h rename to contrib/generic_proxy/filters/network/test/mocks/filter.h index 492e431e72c3..1a52ac450f24 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/filter.h +++ b/contrib/generic_proxy/filters/network/test/mocks/filter.h @@ -1,10 +1,10 @@ #pragma once -#include "source/extensions/filters/network/generic_proxy/interface/filter.h" - #include "test/mocks/tcp/mocks.h" #include "test/mocks/upstream/host.h" +#include "contrib/generic_proxy/filters/network/source/interface/config.h" +#include "contrib/generic_proxy/filters/network/source/interface/filter.h" #include "gmock/gmock.h" namespace Envoy { @@ -106,6 +106,7 @@ template class MockStreamFilterCallbacks : public Base { MOCK_METHOD(const CodecFactory&, codecFactory, ()); MOCK_METHOD(const RouteEntry*, routeEntry, (), (const)); MOCK_METHOD(const RouteSpecificFilterConfig*, perFilterConfig, (), (const)); + MOCK_METHOD(const StreamInfo::StreamInfo&, streamInfo, (), (const)); MOCK_METHOD(StreamInfo::StreamInfo&, streamInfo, ()); MOCK_METHOD(Tracing::Span&, activeSpan, ()); MOCK_METHOD(OptRef, tracingConfig, (), (const)); diff --git a/test/extensions/filters/network/generic_proxy/mocks/route.cc b/contrib/generic_proxy/filters/network/test/mocks/route.cc similarity index 91% rename from test/extensions/filters/network/generic_proxy/mocks/route.cc rename to contrib/generic_proxy/filters/network/test/mocks/route.cc index e5f5897d0602..f92069623542 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/route.cc +++ b/contrib/generic_proxy/filters/network/test/mocks/route.cc @@ -1,4 +1,4 @@ -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" using testing::_; using testing::Return; diff --git a/test/extensions/filters/network/generic_proxy/mocks/route.h b/contrib/generic_proxy/filters/network/test/mocks/route.h similarity index 94% rename from test/extensions/filters/network/generic_proxy/mocks/route.h rename to contrib/generic_proxy/filters/network/test/mocks/route.h index 322a28727152..e8efa8cfd336 100644 --- a/test/extensions/filters/network/generic_proxy/mocks/route.h +++ b/contrib/generic_proxy/filters/network/test/mocks/route.h @@ -1,8 +1,8 @@ #pragma once #include "source/common/config/metadata.h" -#include "source/extensions/filters/network/generic_proxy/route.h" +#include "contrib/generic_proxy/filters/network/source/interface/route.h" #include "gmock/gmock.h" namespace Envoy { diff --git a/test/extensions/filters/network/generic_proxy/proxy_test.cc b/contrib/generic_proxy/filters/network/test/proxy_test.cc similarity index 77% rename from test/extensions/filters/network/generic_proxy/proxy_test.cc rename to contrib/generic_proxy/filters/network/test/proxy_test.cc index 6f6121a64d8e..75246e829e3f 100644 --- a/test/extensions/filters/network/generic_proxy/proxy_test.cc +++ b/contrib/generic_proxy/filters/network/test/proxy_test.cc @@ -3,16 +3,16 @@ #include #include "source/common/tracing/tracer_manager_impl.h" -#include "source/extensions/filters/network/generic_proxy/proxy.h" -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" #include "test/mocks/server/factory_context.h" #include "test/test_common/registry.h" #include "test/test_common/utility.h" +#include "contrib/generic_proxy/filters/network/source/proxy.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -29,7 +29,7 @@ namespace { static const std::string DEFAULT_LOG_FORMAT = "%HOST% %PATH% %METHOD% %PROTOCOL% %REQUEST_PROPERTY(request-key)% " "%RESPONSE_PROPERTY(response-key)% " - "%REQUEST_PROPERTY(non-exist-key)% %GENERIC_RESPONSE_CODE% %RESPONSE_CODE_DETAILS%"; + "%REQUEST_PROPERTY(non-exist-key)% %RESPONSE_CODE% %RESPONSE_CODE_DETAILS%"; class MockRouteConfigProvider : public Rds::RouteConfigProvider { public: @@ -45,14 +45,12 @@ class MockRouteConfigProvider : public Rds::RouteConfigProvider { class FilterConfigTest : public testing::Test { public: - void initializeFilterConfig(bool with_tracing = false, AccessLogInstanceSharedPtr logger = {}, - bool allow_no_decoder_filter = false) { + void initializeFilterConfig(bool with_tracing = false, AccessLogInstanceSharedPtr logger = {}) { if (with_tracing) { tracer_ = std::make_shared>(); const std::string tracing_config_yaml = R"EOF( - max_path_tag_length: 256 - spawn_upstream_span: true + max_path_tag_length: 128 )EOF"; Tracing::ConnectionManagerTracingConfigProto tracing_config; @@ -65,7 +63,7 @@ class FilterConfigTest : public testing::Test { std::vector factories; - if (mock_decoder_filters_.empty() && mock_stream_filters_.empty() && !allow_no_decoder_filter) { + if (mock_decoder_filters_.empty() && mock_stream_filters_.empty()) { // At least one decoder filter for generic proxy. mock_decoder_filters_.push_back( {"mock_default_decoder_filter", std::make_shared>()}); @@ -189,9 +187,8 @@ TEST_F(FilterConfigTest, CodecFactory) { class FilterTest : public FilterConfigTest { public: - void initializeFilter(bool with_tracing = false, AccessLogInstanceSharedPtr logger = {}, - bool allow_no_decoder_filter = false) { - FilterConfigTest::initializeFilterConfig(with_tracing, logger, allow_no_decoder_filter); + void initializeFilter(bool with_tracing = false, AccessLogInstanceSharedPtr logger = {}) { + FilterConfigTest::initializeFilterConfig(with_tracing, logger); auto server_codec = std::make_unique>(); server_codec_ = server_codec.get(); @@ -295,7 +292,7 @@ TEST_F(FilterTest, OnConnectionClosedEvent) { Buffer::OwnedImpl fake_empty_buffer; - // Return directly if connection is closed. + // Return directly. EXPECT_EQ(Network::FilterStatus::StopIteration, filter_->onData(fake_empty_buffer, false)); } @@ -303,70 +300,42 @@ TEST_F(FilterTest, GetConnection) { initializeFilter(); EXPECT_EQ(&(filter_callbacks_.connection_), &filter_->downstreamConnection()); - // Return valid connection if connection is not closed. - EXPECT_EQ(&(filter_callbacks_.connection_), filter_->connection().ptr()); - - // Mock connection close. - filter_callbacks_.connection_.close(Network::ConnectionCloseType::NoFlush); - - EXPECT_EQ(&(filter_callbacks_.connection_), &filter_->downstreamConnection()); - // Return nullopt if connection is closed. - EXPECT_EQ(nullptr, filter_->connection().ptr()); } -TEST_F(FilterTest, BufferWaterMarkTest) { +TEST_F(FilterTest, NewStreamAndResetStream) { initializeFilter(); - filter_->onAboveWriteBufferHighWatermark(); - filter_->onBelowWriteBufferLowWatermark(); -} -TEST_F(FilterTest, NullHeaderFrame) { - initializeFilter(); - - EXPECT_CALL(filter_callbacks_.connection_, close(_)); - filter_->onDecodingSuccess(nullptr, {}); - - // Calling again will not cause any issue. - filter_->onDecodingSuccess(nullptr, {}); -} - -TEST_F(FilterTest, NullCommonFrame) { - initializeFilter(); - - EXPECT_CALL(filter_callbacks_.connection_, close(_)); - filter_->onDecodingSuccess(RequestCommonFramePtr(nullptr)); - - // Calling again will not cause any issue. - filter_->onDecodingSuccess(RequestCommonFramePtr(nullptr)); -} + auto request = std::make_unique(); -TEST_F(FilterTest, RepeatedStreamIdForTwoStreams) { - initializeFilter(); + filter_->onDecodingSuccess(std::move(request)); + EXPECT_EQ(1, filter_->activeStreamsForTest().size()); - auto request_0 = std::make_unique(); - request_0->stream_frame_flags_ = {0, FrameFlags::FLAG_EMPTY}; - auto request_1 = std::make_unique(); - request_1->stream_frame_flags_ = {0, FrameFlags::FLAG_EMPTY}; + EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); + EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 1); - filter_->onDecodingSuccess(std::move(request_0)); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); + active_stream->resetStream(DownstreamStreamResetReason::ConnectionTermination); - EXPECT_EQ(1, filter_->activeStreamsForTest().size()); + EXPECT_EQ(0, filter_->activeStreamsForTest().size()); - EXPECT_CALL(filter_callbacks_.connection_, close(_)); - filter_->onDecodingSuccess(std::move(request_1)); + EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); + EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 0); + EXPECT_EQ(filter_config_->stats().downstream_rq_reset_.value(), 1); - EXPECT_EQ(0, filter_->activeStreamsForTest().size()); + EXPECT_EQ( + factory_context_.store_.counter("generic_proxy.test_prefix.downstream_rq_flag.DC").value(), + 1); } -TEST_F(FilterTest, CommonFrameBeforeHeaderFrame) { +TEST_F(FilterTest, SimpleBufferWaterMarkTest) { initializeFilter(); - - auto request_frame = std::make_unique(); - EXPECT_CALL(filter_callbacks_.connection_, close(_)); - filter_->onDecodingSuccess(std::move(request_frame)); + filter_->onAboveWriteBufferHighWatermark(); + filter_->onBelowWriteBufferLowWatermark(); } TEST_F(FilterTest, NewStreamAndDispatcher) { + mock_stream_filters_.push_back({"mock_0", std::make_shared>()}); + initializeFilter(); auto request = std::make_unique(); @@ -377,14 +346,13 @@ TEST_F(FilterTest, NewStreamAndDispatcher) { EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 1); - EXPECT_EQ("mock_default_decoder_filter", - mock_decoder_filters_[0].second->decoder_callbacks_->filterConfigName()); - mock_decoder_filters_[0].second->decoder_callbacks_->dispatcher(); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); + + EXPECT_EQ(&active_stream->decoderFiltersForTest()[0]->dispatcher(), &active_stream->dispatcher()); } TEST_F(FilterTest, NewStreamWithStartTime) { - auto mock_stream_filter_0 = std::make_shared>(); - mock_stream_filters_.push_back({"mock_0", mock_stream_filter_0}); + mock_stream_filters_.push_back({"mock_0", std::make_shared>()}); initializeFilter(); @@ -397,15 +365,12 @@ TEST_F(FilterTest, NewStreamWithStartTime) { std::chrono::time_point(std::chrono::milliseconds(222222222)); filter_->onDecodingSuccess(std::move(request), std::move(start_time)); - EXPECT_EQ( - 111111111LL, - std::chrono::duration_cast( - mock_stream_filter_0->decoder_callbacks_->streamInfo().startTime().time_since_epoch()) - .count()); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); + EXPECT_EQ(111111111LL, std::chrono::duration_cast( + active_stream->streamInfo().startTime().time_since_epoch()) + .count()); EXPECT_EQ(222222222LL, std::chrono::duration_cast( - mock_stream_filter_0->decoder_callbacks_->streamInfo() - .startTimeMonotonic() - .time_since_epoch()) + active_stream->streamInfo().startTimeMonotonic().time_since_epoch()) .count()); } @@ -461,7 +426,7 @@ TEST_F(FilterTest, OnEncodingFailureWithActiveStreams) { EXPECT_CALL(*server_codec_, encode(_, _)) .WillOnce(Return(EncodingResult{absl::InvalidArgumentError("encoding-error")})); auto response_0 = std::make_unique(); - mock_decoder_filters_[0].second->decoder_callbacks_->onResponseHeaderFrame(std::move(response_0)); + filter_->activeStreamsForTest().begin()->get()->onResponseHeaderFrame(std::move(response_0)); EXPECT_EQ(1, filter_->activeStreamsForTest().size()); @@ -500,9 +465,18 @@ TEST_F(FilterTest, ActiveStreamPerFilterConfig) { filter_->onDecodingSuccess(std::move(request)); EXPECT_EQ(1, filter_->activeStreamsForTest().size()); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); + + EXPECT_EQ(1, active_stream->decoderFiltersForTest().size()); + EXPECT_EQ(1, active_stream->encoderFiltersForTest().size()); + EXPECT_EQ(active_stream->decoderFiltersForTest().end(), + active_stream->nextDecoderHeaderFilterForTest()); + EXPECT_EQ(active_stream->encoderFiltersForTest().begin(), + active_stream->nextEncoderHeaderFilterForTest()); + EXPECT_CALL(*mock_route_entry_, perFilterConfig("fake_test_filter_name_0")) .WillOnce(Return(nullptr)); - EXPECT_EQ(nullptr, mock_stream_filters_[0].second->decoder_callbacks_->perFilterConfig()); + EXPECT_EQ(nullptr, active_stream->decoderFiltersForTest()[0]->perFilterConfig()); } TEST_F(FilterTest, ActiveStreamPerFilterConfigNoRouteEntry) { @@ -517,7 +491,16 @@ TEST_F(FilterTest, ActiveStreamPerFilterConfigNoRouteEntry) { filter_->onDecodingSuccess(std::move(request)); EXPECT_EQ(1, filter_->activeStreamsForTest().size()); - EXPECT_EQ(nullptr, mock_stream_filters_[0].second->decoder_callbacks_->perFilterConfig()); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); + + EXPECT_EQ(1, active_stream->decoderFiltersForTest().size()); + EXPECT_EQ(1, active_stream->encoderFiltersForTest().size()); + EXPECT_EQ(active_stream->decoderFiltersForTest().end(), + active_stream->nextDecoderHeaderFilterForTest()); + EXPECT_EQ(active_stream->encoderFiltersForTest().begin(), + active_stream->nextEncoderHeaderFilterForTest()); + + EXPECT_EQ(nullptr, active_stream->decoderFiltersForTest()[0]->perFilterConfig()); } TEST_F(FilterTest, ActiveStreamConnection) { @@ -530,20 +513,17 @@ TEST_F(FilterTest, ActiveStreamConnection) { filter_->onDecodingSuccess(std::move(request)); EXPECT_EQ(1, filter_->activeStreamsForTest().size()); - EXPECT_EQ(&filter_callbacks_.connection_, - mock_stream_filters_[0].second->decoder_callbacks_->connection()); -} - -TEST_F(FilterTest, ActiveStreamNoDecoderFilter) { - initializeFilter(false, loggerFormFormat(), true); - - auto request = std::make_unique(); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); - filter_->onDecodingSuccess(std::move(request)); - EXPECT_EQ(0, filter_->activeStreamsForTest().size()); + EXPECT_EQ(1, active_stream->decoderFiltersForTest().size()); + EXPECT_EQ(1, active_stream->encoderFiltersForTest().size()); + EXPECT_EQ(active_stream->decoderFiltersForTest().end(), + active_stream->nextDecoderHeaderFilterForTest()); + EXPECT_EQ(active_stream->encoderFiltersForTest().begin(), + active_stream->nextEncoderHeaderFilterForTest()); - // The stream will be reset directly. - EXPECT_EQ(filter_config_->stats().downstream_rq_reset_.value(), 1); + EXPECT_EQ(&filter_callbacks_.connection_, + active_stream->decoderFiltersForTest()[0]->connection()); } TEST_F(FilterTest, ActiveStreamAddFilters) { @@ -667,7 +647,7 @@ TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueDecodingAfterSendLocalR EXPECT_CALL(*mock_stream_filter_1, decodeHeaderFrame(_)) .WillOnce(Invoke([&](const RequestHeaderFrame&) { - EXPECT_CALL(*server_codec_, encode(_, _)); // Local reply will be encoded and sent. + EXPECT_CALL(*server_codec_, encode(_, _)); active_stream->sendLocalReply(Status(StatusCode::kUnknown, "test_detail"), {}, nullptr); // Make no sense because the filter chain will be always stopped if // the stream is reset or completed. @@ -675,20 +655,17 @@ TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueDecodingAfterSendLocalR })); mock_stream_filter_0->decoder_callbacks_->continueDecoding(); - // Stream is reset or complete when `decodeHeaderFrame` of `mock_stream_filter_1` is called. - // Next filter is still `mock_1` because the iterator is not increased. + // Decoding is stopped when `decodeHeaderFrame` of `mock_stream_filter_1` is called. + // Next filter is still `mock_1` because the iter is not increased. EXPECT_EQ("mock_1", (*active_stream->nextDecoderHeaderFilterForTest())->filterConfigName()); mock_stream_filter_1->decoder_callbacks_->continueDecoding(); // The stream is reset after `sendLocalReply` is called and continue decoding will be ignored. EXPECT_EQ("mock_1", (*active_stream->nextDecoderHeaderFilterForTest())->filterConfigName()); - - EXPECT_EQ(filter_config_->stats().downstream_rq_reset_.value(), 0); - EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 1); } -TEST_F(FilterTest, FilterSendLocalReplyButRespondReturnNull) { +TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueEncoding) { auto mock_stream_filter_0 = std::make_shared>(); auto mock_stream_filter_1 = std::make_shared>(); auto mock_stream_filter_2 = std::make_shared>(); @@ -699,45 +676,12 @@ TEST_F(FilterTest, FilterSendLocalReplyButRespondReturnNull) { initializeFilter(); - EXPECT_CALL(*mock_stream_filter_0, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::StopIteration)); - - auto request = std::make_unique(); - filter_->onDecodingSuccess(std::move(request)); - auto active_stream = filter_->activeStreamsForTest().begin()->get(); - - EXPECT_CALL(*server_codec_, respond(_, _, _)).WillOnce(Return(ByMove(nullptr))); - EXPECT_CALL(*mock_stream_filter_1, decodeHeaderFrame(_)) - .WillOnce(Invoke([&](const RequestHeaderFrame&) { - // No response will be sent and stream will be reset directly. - active_stream->sendLocalReply(Status(StatusCode::kUnknown, "test_detail"), {}, nullptr); - // Make no sense because the filter chain will be always stopped if - // the stream is reset or completed. - return HeaderFilterStatus::StopIteration; - })); - mock_stream_filter_0->decoder_callbacks_->continueDecoding(); - - EXPECT_EQ(filter_config_->stats().downstream_rq_reset_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 0); -} - -TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueEncoding) { - auto mock_encoder_filter_0 = std::make_shared>(); - auto mock_encoder_filter_1 = std::make_shared>(); - auto mock_encoder_filter_2 = std::make_shared>(); - - mock_encoder_filters_ = {{"mock_0", mock_encoder_filter_0}, - {"mock_1", mock_encoder_filter_1}, - {"mock_2", mock_encoder_filter_2}}; - - initializeFilter(); - auto request = std::make_unique(); filter_->onDecodingSuccess(std::move(request)); auto active_stream = filter_->activeStreamsForTest().begin()->get(); - EXPECT_CALL(*mock_encoder_filter_2, encodeHeaderFrame(_)) + EXPECT_CALL(*mock_stream_filter_2, encodeHeaderFrame(_)) .WillOnce(Return(HeaderFilterStatus::StopIteration)); auto response = std::make_unique(); @@ -748,10 +692,10 @@ TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueEncoding) { // Next filter is `mock_1`. EXPECT_EQ("mock_1", (*active_stream->nextEncoderHeaderFilterForTest())->filterConfigName()); - EXPECT_CALL(*mock_encoder_filter_1, encodeHeaderFrame(_)) + EXPECT_CALL(*mock_stream_filter_1, encodeHeaderFrame(_)) .WillOnce(Return(HeaderFilterStatus::StopIteration)); - mock_encoder_filter_2->encoder_callbacks_->continueEncoding(); + mock_stream_filter_2->encoder_callbacks_->continueEncoding(); // Encoding is stopped when `encodeHeaderFrame` of `mock_stream_filter_1` is called. // Next filter is `mock_0`. @@ -769,7 +713,7 @@ TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueEncoding) { return EncodingResult{4}; })); - mock_encoder_filter_1->encoder_callbacks_->continueEncoding(); + mock_stream_filter_1->encoder_callbacks_->continueEncoding(); } TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueEncodingButResponseEncodingFailure) { @@ -855,7 +799,7 @@ TEST_F(FilterTest, ActiveStreamSingleFrameFiltersContinueEncodingAfterSendLocalR mock_stream_filter_2->encoder_callbacks_->continueEncoding(); // Encoding will be stopped when `encodeHeaderFrame` of `mock_stream_filter_1` is called. - // Next filter is still `mock_1` because the iterator is not increased. + // Next filter is still `mock_1` because the iter is not increased. EXPECT_EQ("mock_1", (*active_stream->nextEncoderHeaderFilterForTest())->filterConfigName()); mock_stream_filter_1->encoder_callbacks_->continueEncoding(); @@ -937,7 +881,7 @@ TEST_F(FilterTest, ActiveStreamMultipleFrameFiltersContinueDecoding) { EXPECT_EQ("mock_0", (*active_stream->nextDecoderCommonFilterForTest())->filterConfigName()); EXPECT_CALL(mock_request_frames_handler, onRequestCommonFrame(_)); - // The last common frame will be handled directly because all the previous common frames are + // The last common frame will be handled dircetly because all the previous common frames are // completed and the filter chain will not be stopped by the last common frame. filter_->onDecodingSuccess(std::move(request_frame_2)); } @@ -1033,7 +977,7 @@ TEST_F(FilterTest, ActiveStreamMultipleFrameFiltersContinueEncoding) { EXPECT_CALL(*server_codec_, encode(_, _)) .WillOnce(Invoke([](const StreamFrame&, EncodingContext&) { return EncodingResult{0}; })); - // The last common frame will be handled directly because all the previous common frames are + // The last common frame will be handled dircetly because all the previous common frames are // completed. active_stream->onResponseCommonFrame(std::move(response_frame_2)); } @@ -1261,115 +1205,24 @@ TEST_F(FilterTest, ActiveStreamSendLocalReply) { request->protocol_ = "protocol-value"; request->data_["request-key"] = "request-value"; - testing::InSequence s; - - // Decoder filter chain processing. - EXPECT_CALL(*mock_stream_filter_0, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_2, decodeHeaderFrame(_)).WillOnce(Invoke([&](auto&) { - mock_stream_filter_2->decoder_callbacks_->sendLocalReply( - Status(StatusCode::kUnknown, "test_detail"), {}, - [](StreamResponse& response) { response.set("response-key", "response-value"); }); - return HeaderFilterStatus::StopIteration; - })); - - // Encoder filter chain processing. - EXPECT_CALL(*mock_stream_filter_2, encodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, encodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_0, encodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - - // Send reply to the downstream. - EXPECT_CALL(*server_codec_, encode(_, _)) - .WillOnce(Invoke([&](const StreamFrame& response, EncodingContext&) { - Buffer::OwnedImpl buffer; - EXPECT_EQ(dynamic_cast(&response)->status().code(), - static_cast(StatusCode::kUnknown)); - buffer.add("test"); + filter_->onDecodingSuccess(std::move(request)); + EXPECT_EQ(1, filter_->activeStreamsForTest().size()); - server_codec_callbacks_->writeToConnection(buffer); - buffer.drain(buffer.length()); + EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); + EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 1); + EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 0); - return EncodingResult{4}; - })); - EXPECT_CALL(filter_callbacks_.connection_, write(BufferStringEqual("test"), false)); + auto active_stream = filter_->activeStreamsForTest().begin()->get(); - // Clean up the stream and log the access log. - EXPECT_CALL(filter_callbacks_.connection_.dispatcher_, deferredDelete_(_)); EXPECT_CALL(*factory_context_.server_factory_context_.access_log_manager_.file_, write("host-value /path-value method-value protocol-value request-value " "response-value - 2 test_detail")); - // Check the drain manager. EXPECT_CALL(factory_context_.drain_manager_, drainClose()).WillOnce(Return(false)); + EXPECT_CALL(filter_callbacks_.connection_.dispatcher_, deferredDelete_(_)); - filter_->onDecodingSuccess(std::move(request)); - - EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 0); - EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 1); -} - -TEST_F(FilterTest, ActiveStreamSendLocalReplyWhenProcessingBody) { - auto mock_stream_filter_0 = std::make_shared>(); - auto mock_stream_filter_1 = std::make_shared>(); - auto mock_stream_filter_2 = std::make_shared>(); - - mock_stream_filters_ = {{"mock_0", mock_stream_filter_0}, - {"mock_1", mock_stream_filter_1}, - {"mock_2", mock_stream_filter_2}}; - - initializeFilter(false, loggerFormFormat()); - - auto request = std::make_unique(); - request->host_ = "host-value"; - request->path_ = "/path-value"; - request->method_ = "method-value"; - request->protocol_ = "protocol-value"; - request->data_["request-key"] = "request-value"; - request->stream_frame_flags_ = FrameFlags(0, FrameFlags::FLAG_EMPTY); - - testing::InSequence s1; - // Decoder filter chain processing for header frame. - EXPECT_CALL(*mock_stream_filter_0, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_2, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - - filter_->onDecodingSuccess(std::move(request)); - - EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 0); - - testing::InSequence s2; - // Decoder filter chain processing for common frame. - EXPECT_CALL(*mock_stream_filter_0, decodeCommonFrame(_)) - .WillOnce(Return(CommonFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, decodeCommonFrame(_)) - .WillOnce(Return(CommonFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_2, decodeCommonFrame(_)).WillOnce(Invoke([&](auto&) { - mock_stream_filter_2->decoder_callbacks_->sendLocalReply( - Status(StatusCode::kUnknown, "test_detail"), {}, - [](StreamResponse& response) { response.set("response-key", "response-value"); }); - return CommonFilterStatus::StopIteration; - })); - - // Encoder filter chain processing. - EXPECT_CALL(*mock_stream_filter_2, encodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, encodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_0, encodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); + EXPECT_CALL(filter_callbacks_.connection_, write(BufferStringEqual("test"), false)); - // Send reply to the downstream. EXPECT_CALL(*server_codec_, encode(_, _)) .WillOnce(Invoke([&](const StreamFrame& response, EncodingContext&) { Buffer::OwnedImpl buffer; @@ -1382,83 +1235,8 @@ TEST_F(FilterTest, ActiveStreamSendLocalReplyWhenProcessingBody) { return EncodingResult{4}; })); - EXPECT_CALL(filter_callbacks_.connection_, write(BufferStringEqual("test"), false)); - - // Clean up the stream and log the access log. - EXPECT_CALL(filter_callbacks_.connection_.dispatcher_, deferredDelete_(_)); - EXPECT_CALL(*factory_context_.server_factory_context_.access_log_manager_.file_, - write("host-value /path-value method-value protocol-value request-value " - "response-value - 2 test_detail")); - - // Check the drain manager. - EXPECT_CALL(factory_context_.drain_manager_, drainClose()).WillOnce(Return(false)); - - auto request_frame = std::make_unique(); - filter_->onDecodingSuccess(std::move(request_frame)); - - EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 0); - EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 1); -} - -TEST_F(FilterTest, ActiveStreamSendLocalReplyWhenTransferringBody) { - NiceMock mock_request_frames_handler; - - auto mock_stream_filter_0 = std::make_shared>(); - auto mock_stream_filter_1 = std::make_shared>(); - auto mock_stream_filter_2 = std::make_shared>(); - - mock_stream_filters_ = {{"mock_0", mock_stream_filter_0}, - {"mock_1", mock_stream_filter_1}, - {"mock_2", mock_stream_filter_2}}; - - // Set the request handler. - ON_CALL(*mock_stream_filter_2, setDecoderFilterCallbacks(_)).WillByDefault(Invoke([&](auto& cb) { - mock_stream_filter_2->decoder_callbacks_ = &cb; - cb.setRequestFramesHandler(&mock_request_frames_handler); - })); - - initializeFilter(false, loggerFormFormat()); - - auto request = std::make_unique(); - request->host_ = "host-value"; - request->path_ = "/path-value"; - request->method_ = "method-value"; - request->protocol_ = "protocol-value"; - request->data_["request-key"] = "request-value"; - request->stream_frame_flags_ = FrameFlags(0, FrameFlags::FLAG_EMPTY); - - testing::InSequence s1; - // Decoder filter chain processing for header frame. - EXPECT_CALL(*mock_stream_filter_0, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_2, decodeHeaderFrame(_)) - .WillOnce(Return(HeaderFilterStatus::Continue)); - - filter_->onDecodingSuccess(std::move(request)); - - EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 1); - EXPECT_EQ(filter_config_->stats().downstream_rq_local_.value(), 0); - testing::InSequence s2; - // Decoder filter chain processing for common frame. - EXPECT_CALL(*mock_stream_filter_0, decodeCommonFrame(_)) - .WillOnce(Return(CommonFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_1, decodeCommonFrame(_)) - .WillOnce(Return(CommonFilterStatus::Continue)); - EXPECT_CALL(*mock_stream_filter_2, decodeCommonFrame(_)) - .WillOnce(Return(CommonFilterStatus::StopIteration)); - - EXPECT_CALL(mock_request_frames_handler, onRequestCommonFrame(_)).WillOnce(Invoke([&](auto&&) { - mock_stream_filter_2->decoder_callbacks_->sendLocalReply( - Status(StatusCode::kUnknown, "test_detail"), {}, - [](StreamResponse& response) { response.set("response-key", "response-value"); }); - })); - - // Encoder filter chain processing. + testing::InSequence s; EXPECT_CALL(*mock_stream_filter_2, encodeHeaderFrame(_)) .WillOnce(Return(HeaderFilterStatus::Continue)); EXPECT_CALL(*mock_stream_filter_1, encodeHeaderFrame(_)) @@ -1466,32 +1244,9 @@ TEST_F(FilterTest, ActiveStreamSendLocalReplyWhenTransferringBody) { EXPECT_CALL(*mock_stream_filter_0, encodeHeaderFrame(_)) .WillOnce(Return(HeaderFilterStatus::Continue)); - // Send reply to the downstream. - EXPECT_CALL(*server_codec_, encode(_, _)) - .WillOnce(Invoke([&](const StreamFrame& response, EncodingContext&) { - Buffer::OwnedImpl buffer; - EXPECT_EQ(dynamic_cast(&response)->status().code(), - static_cast(StatusCode::kUnknown)); - buffer.add("test"); - - server_codec_callbacks_->writeToConnection(buffer); - buffer.drain(buffer.length()); - - return EncodingResult{4}; - })); - EXPECT_CALL(filter_callbacks_.connection_, write(BufferStringEqual("test"), false)); - - // Clean up the stream and log the access log. - EXPECT_CALL(filter_callbacks_.connection_.dispatcher_, deferredDelete_(_)); - EXPECT_CALL(*factory_context_.server_factory_context_.access_log_manager_.file_, - write("host-value /path-value method-value protocol-value request-value " - "response-value - 2 test_detail")); - - // Check the drain manager. - EXPECT_CALL(factory_context_.drain_manager_, drainClose()).WillOnce(Return(false)); - - auto request_frame = std::make_unique(); - filter_->onDecodingSuccess(std::move(request_frame)); + active_stream->sendLocalReply( + Status(StatusCode::kUnknown, "test_detail"), {}, + [](StreamResponse& response) { response.set("response-key", "response-value"); }); EXPECT_EQ(filter_config_->stats().downstream_rq_total_.value(), 1); EXPECT_EQ(filter_config_->stats().downstream_rq_active_.value(), 0); @@ -1556,13 +1311,6 @@ TEST_F(FilterTest, NewStreamAndReplyNormally) { request->protocol_ = "protocol-value"; request->data_["request-key"] = "request-value"; - EXPECT_CALL(*mock_decoder_filter_0, decodeHeaderFrame(_)).WillOnce(Invoke([&](auto&) { - auto cb = mock_decoder_filter_0->decoder_callbacks_; - EXPECT_EQ(&cb->activeSpan(), &Tracing::NullSpan::instance()); - EXPECT_FALSE(cb->tracingConfig().has_value()); - return HeaderFilterStatus::Continue; - })); - filter_->onDecodingSuccess(std::move(request)); EXPECT_EQ(1, filter_->activeStreamsForTest().size()); @@ -1802,78 +1550,6 @@ TEST_F(FilterTest, NewStreamAndReplyNormallyWithTracing) { return span; })); - EXPECT_CALL(*mock_decoder_filter_0, decodeHeaderFrame(_)) - .WillOnce(Invoke([&](const RequestHeaderFrame&) { - EXPECT_NE(&mock_decoder_filter_0->decoder_callbacks_->activeSpan(), - &Tracing::NullSpan::instance()); - EXPECT_TRUE(mock_decoder_filter_0->decoder_callbacks_->tracingConfig().has_value()); - EXPECT_EQ(mock_decoder_filter_0->decoder_callbacks_->tracingConfig()->maxPathTagLength(), - 256); - EXPECT_EQ(mock_decoder_filter_0->decoder_callbacks_->tracingConfig()->spawnUpstreamSpan(), - true); - return HeaderFilterStatus::Continue; - })); - - filter_->onDecodingSuccess(std::move(request)); - EXPECT_EQ(1, filter_->activeStreamsForTest().size()); - - auto active_stream = filter_->activeStreamsForTest().begin()->get(); - - EXPECT_CALL(*span, setTag(_, _)).Times(testing::AnyNumber()); - EXPECT_CALL(*span, finishSpan()); - - EXPECT_CALL(filter_callbacks_.connection_, write(BufferStringEqual("test"), false)); - - EXPECT_CALL(*server_codec_, encode(_, _)) - .WillOnce(Invoke([&](const StreamFrame&, EncodingContext&) { - Buffer::OwnedImpl buffer; - buffer.add("test"); - - server_codec_callbacks_->writeToConnection(buffer); - buffer.drain(buffer.length()); - - return EncodingResult{4}; - })); - - EXPECT_CALL(factory_context_.drain_manager_, drainClose()).WillOnce(Return(false)); - EXPECT_CALL(filter_callbacks_.connection_.dispatcher_, deferredDelete_(_)); - - auto response = std::make_unique(); - active_stream->onResponseHeaderFrame(std::move(response)); -} - -TEST_F(FilterTest, NewStreamAndReplyNormallyWithTracingAndSamplingToTrue) { - auto mock_decoder_filter_0 = std::make_shared>(); - mock_decoder_filters_ = {{"mock_0", mock_decoder_filter_0}}; - - initializeFilter(true); - - auto request = std::make_unique(); - - auto* span = new NiceMock(); - EXPECT_CALL(*tracer_, startSpan_(_, _, _, _)) - .WillOnce( - Invoke([&](const Tracing::Config& config, Tracing::TraceContext&, - const StreamInfo::StreamInfo&, const Tracing::Decision) -> Tracing::Span* { - EXPECT_EQ(Tracing::OperationName::Egress, config.operationName()); - return span; - })); - - EXPECT_CALL(*mock_decoder_filter_0, decodeHeaderFrame(_)).WillOnce(Invoke([&](auto&) { - auto cb = mock_decoder_filter_0->decoder_callbacks_; - - EXPECT_NE(&cb->activeSpan(), &Tracing::NullSpan::instance()); - EXPECT_TRUE(cb->tracingConfig().has_value()); - EXPECT_EQ(cb->tracingConfig()->maxPathTagLength(), 256); - EXPECT_EQ(cb->tracingConfig()->spawnUpstreamSpan(), true); - return HeaderFilterStatus::Continue; - })); - - EXPECT_CALL(factory_context_.server_factory_context_.runtime_loader_.snapshot_, - featureEnabled("tracing.random_sampling", - testing::An())) - .WillOnce(Return(true)); - filter_->onDecodingSuccess(std::move(request)); EXPECT_EQ(1, filter_->activeStreamsForTest().size()); diff --git a/test/extensions/filters/network/generic_proxy/route_test.cc b/contrib/generic_proxy/filters/network/test/route_test.cc similarity index 94% rename from test/extensions/filters/network/generic_proxy/route_test.cc rename to contrib/generic_proxy/filters/network/test/route_test.cc index 56aa14d4e114..3084016f3cc0 100644 --- a/test/extensions/filters/network/generic_proxy/route_test.cc +++ b/contrib/generic_proxy/filters/network/test/route_test.cc @@ -1,17 +1,17 @@ #include #include "source/common/config/metadata.h" -#include "source/extensions/filters/network/generic_proxy/match.h" -#include "source/extensions/filters/network/generic_proxy/route_impl.h" -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" #include "test/mocks/server/factory_context.h" #include "test/test_common/registry.h" #include "test/test_common/test_runtime.h" #include "test/test_common/utility.h" +#include "contrib/generic_proxy/filters/network/source/match.h" +#include "contrib/generic_proxy/filters/network/source/route.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" #include "gtest/gtest.h" using testing::Invoke; @@ -44,16 +44,14 @@ class RouteEntryImplTest : public testing::Test { }; /** - * Test the method that get route name and cluster name from route entry. + * Test the method that get cluster name from route entry. */ -TEST_F(RouteEntryImplTest, SimpleRouteNameAndClusterName) { +TEST_F(RouteEntryImplTest, SimpleClusterName) { const std::string yaml_config = R"EOF( - name: route_0 cluster: cluster_0 )EOF"; initialize(yaml_config); - EXPECT_EQ(route_->name(), "route_0"); EXPECT_EQ(route_->clusterName(), "cluster_0"); }; @@ -344,20 +342,6 @@ class RouteMatcherImplTest : public testing::Test { std::unique_ptr route_matcher_; }; -TEST(NullRouteMatcherTest, NullRouteMatcherTest) { - NullRouteMatcherImpl matcher; - - NiceMock stream_info; - - FakeStreamCodecFactory::FakeRequest fake_request_0; - fake_request_0.host_ = "service_0"; - fake_request_0.method_ = "method_0"; - fake_request_0.data_.insert({"key_0", "value_0"}); - const MatchInput match_input_0(fake_request_0, stream_info, MatchAction::RouteAction); - - EXPECT_EQ(nullptr, matcher.routeEntry(match_input_0)); -} - static const std::string RouteConfigurationYaml = R"EOF( name: test_matcher_tree virtual_hosts: @@ -605,19 +589,6 @@ TEST_F(RouteMatcherImplTest, RouteMatch) { EXPECT_EQ(route_entry_0->clusterName(), "cluster_1"); } - // Suffix host searching but not match. - { - NiceMock stream_info; - - FakeStreamCodecFactory::FakeRequest fake_request_0; - fake_request_0.host_ = "suffix"; - fake_request_0.method_ = "method_0"; - const MatchInput match_input_0(fake_request_0, stream_info, MatchAction::RouteAction); - - EXPECT_EQ("catch_all", route_matcher_->findVirtualHost(match_input_0)->name()); - EXPECT_EQ(nullptr, route_matcher_->routeEntry(match_input_0)); - } - // Suffix host searching. { NiceMock stream_info; @@ -684,7 +655,6 @@ TEST_F(RouteMatcherImplTest, RouteNotMatch) { fake_request.data_.insert({"key_0", "value_0"}); const MatchInput match_input(fake_request, stream_info, MatchAction::RouteAction); - EXPECT_EQ("prefix", route_matcher_->findVirtualHost(match_input)->name()); EXPECT_EQ(nullptr, route_matcher_->routeEntry(match_input)); } @@ -696,7 +666,6 @@ TEST_F(RouteMatcherImplTest, RouteNotMatch) { fake_request.data_.insert({"key_0", "value_0"}); const MatchInput match_input(fake_request, stream_info, MatchAction::RouteAction); - EXPECT_EQ("service", route_matcher_->findVirtualHost(match_input)->name()); EXPECT_EQ(nullptr, route_matcher_->routeEntry(match_input)); } @@ -707,7 +676,6 @@ TEST_F(RouteMatcherImplTest, RouteNotMatch) { fake_request.method_ = "method_0"; const MatchInput match_input(fake_request, stream_info, MatchAction::RouteAction); - EXPECT_EQ("service", route_matcher_->findVirtualHost(match_input)->name()); EXPECT_EQ(nullptr, route_matcher_->routeEntry(match_input)); } } diff --git a/contrib/generic_proxy/filters/network/test/router/BUILD b/contrib/generic_proxy/filters/network/test/router/BUILD new file mode 100644 index 000000000000..1b3de5d4d0ea --- /dev/null +++ b/contrib/generic_proxy/filters/network/test/router/BUILD @@ -0,0 +1,57 @@ +load( + "//bazel:envoy_build_system.bzl", + "envoy_cc_test", + "envoy_contrib_package", +) + +licenses(["notice"]) # Apache 2 + +envoy_contrib_package() + +envoy_cc_test( + name = "router_test", + srcs = [ + "router_test.cc", + ], + deps = [ + "//contrib/generic_proxy/filters/network/source/router:router_lib", + "//contrib/generic_proxy/filters/network/test:fake_codec_lib", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:route_mocks", + "//source/common/buffer:buffer_lib", + "//test/mocks/server:factory_context_mocks", + "//test/test_common:registry_lib", + "//test/test_common:utility_lib", + ], +) + +envoy_cc_test( + name = "upstream_test", + srcs = [ + "upstream_test.cc", + ], + deps = [ + "//contrib/generic_proxy/filters/network/source/router:router_lib", + "//contrib/generic_proxy/filters/network/test:fake_codec_lib", + "//contrib/generic_proxy/filters/network/test/mocks:codec_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//contrib/generic_proxy/filters/network/test/mocks:route_mocks", + "//source/common/buffer:buffer_lib", + "//test/mocks/server:factory_context_mocks", + "//test/test_common:registry_lib", + "//test/test_common:utility_lib", + ], +) + +envoy_cc_test( + name = "config_test", + srcs = [ + "config_test.cc", + ], + deps = [ + "//contrib/generic_proxy/filters/network/source/router:config", + "//contrib/generic_proxy/filters/network/test/mocks:filter_mocks", + "//test/mocks/server:factory_context_mocks", + ], +) diff --git a/test/extensions/filters/network/generic_proxy/router/config_test.cc b/contrib/generic_proxy/filters/network/test/router/config_test.cc similarity index 90% rename from test/extensions/filters/network/generic_proxy/router/config_test.cc rename to contrib/generic_proxy/filters/network/test/router/config_test.cc index 6b9edb67a418..d9384a5d8a8d 100644 --- a/test/extensions/filters/network/generic_proxy/router/config_test.cc +++ b/contrib/generic_proxy/filters/network/test/router/config_test.cc @@ -1,8 +1,7 @@ -#include "source/extensions/filters/network/generic_proxy/router/config.h" - -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" #include "test/mocks/server/factory_context.h" +#include "contrib/generic_proxy/filters/network/source/router/config.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" #include "gtest/gtest.h" namespace Envoy { diff --git a/test/extensions/filters/network/generic_proxy/router/router_test.cc b/contrib/generic_proxy/filters/network/test/router/router_test.cc similarity index 82% rename from test/extensions/filters/network/generic_proxy/router/router_test.cc rename to contrib/generic_proxy/filters/network/test/router/router_test.cc index 8c2fd694efbc..c1cbdebefefe 100644 --- a/test/extensions/filters/network/generic_proxy/router/router_test.cc +++ b/contrib/generic_proxy/filters/network/test/router/router_test.cc @@ -1,16 +1,16 @@ #include #include "source/common/tracing/common_values.h" -#include "source/extensions/filters/network/generic_proxy/router/router.h" -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" #include "test/mocks/server/factory_context.h" #include "test/test_common/registry.h" #include "test/test_common/utility.h" +#include "contrib/generic_proxy/filters/network/source/router/router.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -119,33 +119,26 @@ class RouterFilterTest : public testing::Test { mock_generic_upstream_->requests_.begin()->second->onUpstreamSuccess(); } - UpstreamRequestCallbacks* notifyDecodingSuccess(ResponseHeaderFramePtr&& response, - absl::optional start_time = {}) { + void notifyDecodingSuccess(ResponseHeaderFramePtr&& response, + absl::optional start_time = {}) { ASSERT(filter_->upstreamRequestsSize() != 0); - auto upstream_request = mock_generic_upstream_->requests_.begin()->second; - upstream_request->onDecodingSuccess(std::move(response), start_time); - return upstream_request; + mock_generic_upstream_->requests_.begin()->second->onDecodingSuccess(std::move(response), + start_time); } - UpstreamRequestCallbacks* notifyDecodingSuccess(ResponseCommonFramePtr&& response) { + void notifyDecodingSuccess(ResponseCommonFramePtr&& response) { ASSERT(filter_->upstreamRequestsSize() != 0); - auto upstream_request = mock_generic_upstream_->requests_.begin()->second; - upstream_request->onDecodingSuccess(std::move(response)); - return upstream_request; + mock_generic_upstream_->requests_.begin()->second->onDecodingSuccess(std::move(response)); } - UpstreamRequestCallbacks* notifyDecodingFailure(absl::string_view reason) { + void notifyDecodingFailure(absl::string_view reason) { ASSERT(filter_->upstreamRequestsSize() != 0); - auto upstream_request = mock_generic_upstream_->requests_.begin()->second; - upstream_request->onDecodingFailure(reason); - return upstream_request; + mock_generic_upstream_->requests_.begin()->second->onDecodingFailure(reason); } - UpstreamRequestCallbacks* notifyConnectionClose(Network::ConnectionEvent event) { + void notifyConnectionClose(Network::ConnectionEvent event) { ASSERT(filter_->upstreamRequestsSize() != 0); - auto upstream_request = mock_generic_upstream_->requests_.begin()->second; - upstream_request->onConnectionClose(event); - return upstream_request; + mock_generic_upstream_->requests_.begin()->second->onConnectionClose(event); } void expectNewUpstreamRequest(bool with_tracing = false) { @@ -211,8 +204,7 @@ class RouterFilterTest : public testing::Test { .mutable_filter_metadata())[Envoy::Config::MetadataFilters::get().ENVOY_LB] = request_struct; - auto match_criteria = filter_->metadataMatchCriteria(); - auto match = match_criteria->metadataMatchCriteria(); + auto match = filter_->metadataMatchCriteria()->metadataMatchCriteria(); EXPECT_EQ(match.size(), 3); auto it = match.begin(); @@ -230,8 +222,6 @@ class RouterFilterTest : public testing::Test { EXPECT_EQ((*it)->name(), "xkey_in_request"); EXPECT_EQ((*it)->value().value().string_value(), "1"); - - EXPECT_EQ(match_criteria, filter_->metadataMatchCriteria()); } void expectResponseTimerCreate() { @@ -417,12 +407,9 @@ TEST_F(RouterFilterTest, UpstreamRequestResetBeforePoolCallback) { EXPECT_CALL(*mock_generic_upstream_, removeUpstreamRequest(_)); EXPECT_CALL(*mock_generic_upstream_, cleanUp(true)); - auto* upstream_request = notifyConnectionClose(Network::ConnectionEvent::LocalClose); + notifyConnectionClose(Network::ConnectionEvent::LocalClose); EXPECT_EQ(0, filter_->upstreamRequestsSize()); - // Calling resetStream() again should do nothing. - dynamic_cast(upstream_request)->resetStream(StreamResetReason::LocalReset, {}); - // Mock downstream closing. mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); } @@ -570,9 +557,7 @@ TEST_F(RouterFilterTest, UpstreamRequestPoolReadyButConnectionErrorBeforeRespons EXPECT_CALL(*mock_generic_upstream_, cleanUp(true)); // Mock connection close event. - auto upstream_request = notifyConnectionClose(Network::ConnectionEvent::LocalClose); - // Calling onConnectionClose() again should do nothing. - upstream_request->onConnectionClose(Network::ConnectionEvent::LocalClose); + notifyConnectionClose(Network::ConnectionEvent::LocalClose); // Mock downstream closing. mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); @@ -625,50 +610,23 @@ TEST_F(RouterFilterTest, UpstreamRequestPoolReadyAndResponse) { setup(); kickOffNewUpstreamRequest(true); - EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)) - .WillOnce(Invoke([this](const StreamFrame&, EncodingContext& ctx) -> EncodingResult { - EXPECT_EQ(ctx.routeEntry().ptr(), &mock_route_entry_); - return 0; - })); + EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)); expectInjectContextToUpstreamRequest(); notifyUpstreamSuccess(); - EXPECT_CALL(mock_filter_callback_, onResponseHeaderFrame(_)).WillOnce(Invoke([this](ResponsePtr) { - // When the response is sent to callback, the upstream request should be removed. - EXPECT_EQ(0, filter_->upstreamRequestsSize()); - })); + expectFinalizeUpstreamSpanAny(); EXPECT_CALL(*mock_generic_upstream_, removeUpstreamRequest(_)); EXPECT_CALL(*mock_generic_upstream_, cleanUp(false)); - expectFinalizeUpstreamSpanAny(); - - auto response = std::make_unique(); - notifyDecodingSuccess(std::move(response), {}); - - // Mock downstream closing. - mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); -} - -TEST_F(RouterFilterTest, UpstreamRequestPoolReadyButDecodeFailureAfterResponse) { - setup(); - kickOffNewUpstreamRequest(false); - - EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)); - notifyUpstreamSuccess(); EXPECT_CALL(mock_filter_callback_, onResponseHeaderFrame(_)).WillOnce(Invoke([this](ResponsePtr) { // When the response is sent to callback, the upstream request should be removed. EXPECT_EQ(0, filter_->upstreamRequestsSize()); })); - EXPECT_CALL(*mock_generic_upstream_, removeUpstreamRequest(_)); - EXPECT_CALL(*mock_generic_upstream_, cleanUp(false)); auto response = std::make_unique(); - auto upstream_request = notifyDecodingSuccess(std::move(response), {}); - - EXPECT_CALL(*mock_generic_upstream_, cleanUp(true)); - upstream_request->onDecodingFailure("decode-failure"); + notifyDecodingSuccess(std::move(response), {}); // Mock downstream closing. mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); @@ -740,43 +698,6 @@ TEST_F(RouterFilterTest, UpstreamRequestPoolReadyAndResponseAndTimeout) { mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); } -TEST_F(RouterFilterTest, UpstreamRequestPoolReadyButEncodingFailure) { - // There are multiple frames in the request. - setup(FrameFlags(0, FrameFlags::FLAG_EMPTY)); - kickOffNewUpstreamRequest(true); - - auto frame_1 = std::make_unique(); - frame_1->stream_frame_flags_ = FrameFlags(0, FrameFlags::FLAG_EMPTY); - EXPECT_EQ(CommonFilterStatus::StopIteration, filter_->decodeCommonFrame(*frame_1)); - // This only store the frame and does nothing else because the pool is not ready yet. - filter_->onRequestCommonFrame(std::move(frame_1)); - - // End stream is set to true by default. - auto frame_2 = std::make_unique(); - EXPECT_EQ(CommonFilterStatus::StopIteration, filter_->decodeCommonFrame(*frame_2)); - // This only store the frame and does nothing else because the pool is not ready yet. - filter_->onRequestCommonFrame(std::move(frame_2)); - - testing::InSequence s; - expectInjectContextToUpstreamRequest(); - // Encode header frame success. - EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)) - .WillOnce(Return(EncodingResult(0))); - // Encode common frame failure. - EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)) - .WillOnce(Return(absl::UnknownError("encode-failure"))); - - EXPECT_CALL(*mock_generic_upstream_, removeUpstreamRequest(_)); - EXPECT_CALL(*mock_generic_upstream_, cleanUp(true)); - expectFinalizeUpstreamSpanAny(); - - // This will trigger frames to be encoded. - notifyUpstreamSuccess(); - - // Mock downstream closing. - mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); -} - TEST_F(RouterFilterTest, UpstreamRequestPoolReadyAndResponseWithMultipleFrames) { // There are multiple frames in the request. setup(FrameFlags(0, FrameFlags::FLAG_EMPTY)); @@ -800,7 +721,7 @@ TEST_F(RouterFilterTest, UpstreamRequestPoolReadyAndResponseWithMultipleFrames) // End stream is set to true by default. auto frame_2 = std::make_unique(); - EXPECT_EQ(CommonFilterStatus::StopIteration, filter_->decodeCommonFrame(*frame_2)); + EXPECT_EQ(CommonFilterStatus::StopIteration, filter_->decodeCommonFrame(*frame_1)); // This will trigger the last frame to be sent directly because connection is ready and other // frames are already sent. @@ -839,56 +760,6 @@ TEST_F(RouterFilterTest, UpstreamRequestPoolReadyAndResponseWithMultipleFrames) mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); } -TEST_F(RouterFilterTest, - UpstreamRequestPoolReadyAndResponseWithMultipleFramesButWithRepeatedHeaders) { - setup(); - kickOffNewUpstreamRequest(false); - - EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)); - notifyUpstreamSuccess(); - - // Request complete and response starts. - - EXPECT_CALL(mock_filter_callback_, onResponseHeaderFrame(_)); - - auto response = std::make_unique(); - response->stream_frame_flags_ = FrameFlags(0, FrameFlags::FLAG_EMPTY); - notifyDecodingSuccess(std::move(response)); - - EXPECT_CALL(*mock_generic_upstream_, removeUpstreamRequest(_)); - EXPECT_CALL(*mock_generic_upstream_, cleanUp(true)); - - auto response_2 = std::make_unique(); - response_2->stream_frame_flags_ = FrameFlags(0, FrameFlags::FLAG_EMPTY); - - notifyDecodingSuccess(std::move(response_2)); - - // Mock downstream closing. - mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); -} - -TEST_F(RouterFilterTest, - UpstreamRequestPoolReadyAndResponseWithMultipleFramesButCommonFrameBeforeHeader) { - setup(); - kickOffNewUpstreamRequest(false); - - EXPECT_CALL(mock_generic_upstream_->mock_client_codec_, encode(_, _)); - notifyUpstreamSuccess(); - - // Request complete and response starts. - - auto response = std::make_unique(); - response->stream_frame_flags_ = FrameFlags(0, FrameFlags::FLAG_EMPTY); - - EXPECT_CALL(*mock_generic_upstream_, removeUpstreamRequest(_)); - EXPECT_CALL(*mock_generic_upstream_, cleanUp(true)); - - notifyDecodingSuccess(std::move(response)); - - // Mock downstream closing. - mock_downstream_connection_.raiseEvent(Network::ConnectionEvent::RemoteClose); -} - TEST_F(RouterFilterTest, UpstreamRequestPoolReadyAndResponseWithDrainCloseSetInResponse) { setup(); kickOffNewUpstreamRequest(); diff --git a/test/extensions/filters/network/generic_proxy/router/upstream_test.cc b/contrib/generic_proxy/filters/network/test/router/upstream_test.cc similarity index 86% rename from test/extensions/filters/network/generic_proxy/router/upstream_test.cc rename to contrib/generic_proxy/filters/network/test/router/upstream_test.cc index 889312d0adce..856b3afb3fde 100644 --- a/test/extensions/filters/network/generic_proxy/router/upstream_test.cc +++ b/contrib/generic_proxy/filters/network/test/router/upstream_test.cc @@ -1,16 +1,16 @@ #include #include "source/common/tracing/common_values.h" -#include "source/extensions/filters/network/generic_proxy/router/router.h" -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/codec.h" -#include "test/extensions/filters/network/generic_proxy/mocks/filter.h" -#include "test/extensions/filters/network/generic_proxy/mocks/route.h" #include "test/mocks/server/factory_context.h" #include "test/test_common/registry.h" #include "test/test_common/utility.h" +#include "contrib/generic_proxy/filters/network/source/router/router.h" +#include "contrib/generic_proxy/filters/network/test/fake_codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/codec.h" +#include "contrib/generic_proxy/filters/network/test/mocks/filter.h" +#include "contrib/generic_proxy/filters/network/test/mocks/route.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -79,19 +79,6 @@ class MockUpstreamRequestCallbacks : public UpstreamRequestCallbacks { GenericUpstream* upstream_{}; }; -TEST(SenseLessTest, SenseLessTest) { - UniqueRequestManager request_manager; - MockUpstreamRequestCallbacks mock_upstream_request_callbacks; - - EXPECT_FALSE(request_manager.contains(0)); - request_manager.appendUpstreamRequest(0, &mock_upstream_request_callbacks); - EXPECT_TRUE(request_manager.contains(0)); - - EventWatcher watcher(nullptr); - watcher.onAboveWriteBufferHighWatermark(); - watcher.onBelowWriteBufferLowWatermark(); -} - class UpstreamTest : public testing::Test { public: UpstreamTest() { @@ -355,11 +342,6 @@ TEST_F(UpstreamTest, BoundGenericUpstreamOnPoolFailure) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(0, generic_upstream->waitingResponseRequestsSize()); - - // Try append again but make no sense. - generic_upstream->appendUpstreamRequest(1, &mock_upstream_request_callbacks_1); - EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); - EXPECT_EQ(0, generic_upstream->waitingResponseRequestsSize()); } TEST_F(UpstreamTest, BoundGenericUpstreamDecodingSuccess) { @@ -394,25 +376,19 @@ TEST_F(UpstreamTest, BoundGenericUpstreamDecodingSuccess) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(2, generic_upstream->waitingResponseRequestsSize()); - auto response_1 = std::make_unique(); - response_1->stream_frame_flags_ = FrameFlags(1); - - auto response_2 = std::make_unique(); - response_2->stream_frame_flags_ = FrameFlags(2); + auto request_1 = std::make_unique(); + request_1->stream_frame_flags_ = FrameFlags(1); - auto unknown_response = std::make_unique(); - unknown_response->stream_frame_flags_ = FrameFlags(3); + auto request_2 = std::make_unique(); + request_2->stream_frame_flags_ = FrameFlags(2); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { - // Will be ignored. - cocec_callbacks_->onDecodingSuccess(std::move(unknown_response), {}); - EXPECT_CALL(mock_upstream_request_callbacks_2, onDecodingSuccess(_, _)); - cocec_callbacks_->onDecodingSuccess(std::move(response_2), {}); + cocec_callbacks_->onDecodingSuccess(std::move(request_2), {}); EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingSuccess(_, _)); - cocec_callbacks_->onDecodingSuccess(std::move(response_1), {}); + cocec_callbacks_->onDecodingSuccess(std::move(request_1), {}); })); Buffer::OwnedImpl fake_buffer; @@ -454,25 +430,19 @@ TEST_F(UpstreamTest, BoundGenericUpstreamDecodingSuccessWithMultipleFrames) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(2, generic_upstream->waitingResponseRequestsSize()); - auto response_1 = std::make_unique(); - response_1->stream_frame_flags_ = FrameFlags(1, FrameFlags::FLAG_EMPTY); - - auto response_2 = std::make_unique(); - response_2->stream_frame_flags_ = FrameFlags(2, FrameFlags::FLAG_EMPTY); + auto request_1 = std::make_unique(); + request_1->stream_frame_flags_ = FrameFlags(1, FrameFlags::FLAG_EMPTY); - auto unknown_response = std::make_unique(); - unknown_response->stream_frame_flags_ = FrameFlags(3); + auto request_2 = std::make_unique(); + request_2->stream_frame_flags_ = FrameFlags(2, FrameFlags::FLAG_EMPTY); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { - // Will be ignored. - cocec_callbacks_->onDecodingSuccess(std::move(unknown_response), {}); - EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingSuccess(_, _)); - cocec_callbacks_->onDecodingSuccess(std::move(response_1), {}); + cocec_callbacks_->onDecodingSuccess(std::move(request_1), {}); EXPECT_CALL(mock_upstream_request_callbacks_2, onDecodingSuccess(_, _)); - cocec_callbacks_->onDecodingSuccess(std::move(response_2), {}); + cocec_callbacks_->onDecodingSuccess(std::move(request_2), {}); })); Buffer::OwnedImpl fake_buffer; @@ -482,27 +452,21 @@ TEST_F(UpstreamTest, BoundGenericUpstreamDecodingSuccessWithMultipleFrames) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(2, generic_upstream->waitingResponseRequestsSize()); - auto response_1_frame = std::make_unique(); - response_1_frame->stream_frame_flags_ = FrameFlags(1); + auto request_1_frame = std::make_unique(); + request_1_frame->stream_frame_flags_ = FrameFlags(1); - auto response_2_frame = std::make_unique(); - response_2_frame->stream_frame_flags_ = FrameFlags(2); - - auto unknown_response_frame = std::make_unique(); - unknown_response_frame->stream_frame_flags_ = FrameFlags(3); + auto request_2_frame = std::make_unique(); + request_2_frame->stream_frame_flags_ = FrameFlags(2); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { - // Will be ignored. - cocec_callbacks_->onDecodingSuccess(std::move(unknown_response_frame)); - EXPECT_CALL(mock_upstream_connection_, close(_)).Times(0); EXPECT_CALL(mock_upstream_request_callbacks_2, onDecodingSuccess(_)); - cocec_callbacks_->onDecodingSuccess(std::move(response_2_frame)); + cocec_callbacks_->onDecodingSuccess(std::move(request_2_frame)); EXPECT_CALL(mock_upstream_connection_, close(_)).Times(0); EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingSuccess(_)); - cocec_callbacks_->onDecodingSuccess(std::move(response_1_frame)); + cocec_callbacks_->onDecodingSuccess(std::move(request_1_frame)); })); generic_upstream->onUpstreamData(fake_buffer, false); @@ -539,17 +503,17 @@ TEST_F(UpstreamTest, BoundGenericUpstreamDecodingFailureAndNoUpstreamConnectionC EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(2, generic_upstream->waitingResponseRequestsSize()); - auto response_1 = std::make_unique(); - response_1->stream_frame_flags_ = FrameFlags(1); + auto request_1 = std::make_unique(); + request_1->stream_frame_flags_ = FrameFlags(1); - auto response_2 = std::make_unique(); - response_2->stream_frame_flags_ = FrameFlags(2); + auto request_2 = std::make_unique(); + request_2->stream_frame_flags_ = FrameFlags(2); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { // Upstream is not set into the mock upstream request callbacks. So the // onDecodingFailure() will not clean up the upstream and will not result - // in the upstream connection close. + // in the upstream connection clos. EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingFailure(_)); EXPECT_CALL(mock_upstream_request_callbacks_2, onDecodingFailure(_)); @@ -592,18 +556,14 @@ TEST_F(UpstreamTest, BoundGenericUpstreamDecodingFailure) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(2, generic_upstream->waitingResponseRequestsSize()); - auto response_1 = std::make_unique(); - response_1->stream_frame_flags_ = FrameFlags(1); + auto request_1 = std::make_unique(); + request_1->stream_frame_flags_ = FrameFlags(1); - auto response_2 = std::make_unique(); - response_2->stream_frame_flags_ = FrameFlags(2); + auto request_2 = std::make_unique(); + request_2->stream_frame_flags_ = FrameFlags(2); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { - EXPECT_EQ(cocec_callbacks_->connection().ptr(), &mock_upstream_connection_); - EXPECT_EQ(cocec_callbacks_->upstreamCluster().ptr(), - &thread_local_cluster_.tcp_conn_pool_.host_->cluster_); - std::vector called_decoding_failure; std::vector called_connection_close; @@ -701,23 +661,6 @@ TEST_F(UpstreamTest, BoundGenericUpstreamUpstreamConnectionClose) { EXPECT_EQ(0, generic_upstream->waitingResponseRequestsSize()); } -TEST_F(UpstreamTest, OwnedGenericUpstreamInitializeAndDestroyUpstreamBeforePoolReady) { - EXPECT_CALL(thread_local_cluster_, tcpConnPool(_, _)); - auto generic_upstream = createOwnedGenericUpstream(); - - NiceMock mock_upstream_request_callbacks_1; - mock_upstream_request_callbacks_1.upstream_ = generic_upstream.get(); - - EXPECT_CALL(thread_local_cluster_.tcp_conn_pool_, newConnection(_)); - - generic_upstream->appendUpstreamRequest(1, &mock_upstream_request_callbacks_1); - - EXPECT_FALSE(generic_upstream->upstreamConnection().has_value()); - - // Destroy the upstream before the pool ready and no clean up. - generic_upstream.reset(); -} - TEST_F(UpstreamTest, OwnedGenericUpstreamInitializeAndPoolReady) { EXPECT_CALL(thread_local_cluster_, tcpConnPool(_, _)); auto generic_upstream = createOwnedGenericUpstream(); @@ -789,18 +732,16 @@ TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingSuccess) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(1, generic_upstream->waitingResponseRequestsSize()); - auto response_1 = std::make_unique(); - response_1->stream_frame_flags_ = FrameFlags(1); + auto request_1 = std::make_unique(); + request_1->stream_frame_flags_ = FrameFlags(1); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingSuccess(_, _)); - cocec_callbacks_->onDecodingSuccess(std::move(response_1), {}); + cocec_callbacks_->onDecodingSuccess(std::move(request_1), {}); })); Buffer::OwnedImpl fake_buffer; - // Empty buffer will be ignored. - generic_upstream->onUpstreamData(fake_buffer, false); fake_buffer.add("fake data"); generic_upstream->onUpstreamData(fake_buffer, false); @@ -810,7 +751,7 @@ TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingSuccess) { TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingSuccessWithMultipleFrames) { EXPECT_CALL(thread_local_cluster_, tcpConnPool(_, _)); - auto generic_upstream = createOwnedGenericUpstream(); + auto generic_upstream = createBoundGenericUpstream(); NiceMock mock_upstream_request_callbacks_1; mock_upstream_request_callbacks_1.upstream_ = generic_upstream.get(); @@ -831,32 +772,30 @@ TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingSuccessWithMultipleFrames) { EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(1, generic_upstream->waitingResponseRequestsSize()); - auto response_1 = std::make_unique(); - response_1->stream_frame_flags_ = FrameFlags(1, FrameFlags::FLAG_EMPTY); + auto request_1 = std::make_unique(); + request_1->stream_frame_flags_ = FrameFlags(1, FrameFlags::FLAG_EMPTY); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingSuccess(_, _)); - cocec_callbacks_->onDecodingSuccess(std::move(response_1), {}); + cocec_callbacks_->onDecodingSuccess(std::move(request_1), {}); })); Buffer::OwnedImpl fake_buffer; - // Empty buffer will be ignored. - generic_upstream->onUpstreamData(fake_buffer, false); fake_buffer.add("fake data"); generic_upstream->onUpstreamData(fake_buffer, false); EXPECT_EQ(0, generic_upstream->waitingUpstreamRequestsSize()); EXPECT_EQ(1, generic_upstream->waitingResponseRequestsSize()); - auto response_1_frame = std::make_unique(); - response_1_frame->stream_frame_flags_ = FrameFlags(1); + auto request_1_frame = std::make_unique(); + request_1_frame->stream_frame_flags_ = FrameFlags(1); EXPECT_CALL(*mock_client_codec_raw_, decode(_, _)) .WillOnce(testing::Invoke([&](Buffer::Instance&, bool) { EXPECT_CALL(mock_upstream_connection_, close(_)).Times(0); EXPECT_CALL(mock_upstream_request_callbacks_1, onDecodingSuccess(_)); - cocec_callbacks_->onDecodingSuccess(std::move(response_1_frame)); + cocec_callbacks_->onDecodingSuccess(std::move(request_1_frame)); })); generic_upstream->onUpstreamData(fake_buffer, false); @@ -867,7 +806,7 @@ TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingSuccessWithMultipleFrames) { TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingFailure) { EXPECT_CALL(thread_local_cluster_, tcpConnPool(_, _)); - auto generic_upstream = createOwnedGenericUpstream(); + auto generic_upstream = createBoundGenericUpstream(); NiceMock mock_upstream_request_callbacks_1; mock_upstream_request_callbacks_1.upstream_ = generic_upstream.get(); @@ -906,7 +845,7 @@ TEST_F(UpstreamTest, OwnedGenericUpstreamDecodingFailure) { TEST_F(UpstreamTest, OwnedGenericUpstreamUpstreamConnectionClose) { EXPECT_CALL(thread_local_cluster_, tcpConnPool(_, _)); - auto generic_upstream = createOwnedGenericUpstream(); + auto generic_upstream = createBoundGenericUpstream(); NiceMock mock_upstream_request_callbacks_1; mock_upstream_request_callbacks_1.upstream_ = generic_upstream.get(); diff --git a/docs/root/configuration/listeners/network_filters/generic_proxy_filter.rst b/docs/root/configuration/listeners/network_filters/generic_proxy_filter.rst index 0c42b97eae14..3923dc48970b 100644 --- a/docs/root/configuration/listeners/network_filters/generic_proxy_filter.rst +++ b/docs/root/configuration/listeners/network_filters/generic_proxy_filter.rst @@ -118,7 +118,7 @@ The community has implemented a :ref:`dubbo codec factory_context; - CodeOrFlags code_or_flags(factory_context); - - // Max code is 999 for now. - { - EXPECT_EQ("-", - factory_context.store_.symbolTable().toString(code_or_flags.statNameFromCode(1000))); - } -} - -} // namespace -} // namespace GenericProxy -} // namespace NetworkFilters -} // namespace Extensions -} // namespace Envoy diff --git a/test/extensions/filters/network/generic_proxy/stream_test.cc b/test/extensions/filters/network/generic_proxy/stream_test.cc deleted file mode 100644 index 4fc0e5a62e06..000000000000 --- a/test/extensions/filters/network/generic_proxy/stream_test.cc +++ /dev/null @@ -1,93 +0,0 @@ -#include - -#include "source/extensions/filters/network/generic_proxy/interface/stream.h" - -#include "gmock/gmock.h" -#include "gtest/gtest.h" - -namespace Envoy { -namespace Extensions { -namespace NetworkFilters { -namespace GenericProxy { -namespace { - -bool operator==(const FrameFlags& lhs, const FrameFlags& rhs) { - return lhs.streamId() == rhs.streamId() && lhs.frameTags() == rhs.frameTags() && - lhs.rawFlags() == rhs.rawFlags(); -} - -class TestResponseHeaderFrame : public ResponseHeaderFrame { -public: - absl::string_view protocol() const override { return "test"; } -}; - -class TestRequestHeaderFrame : public RequestHeaderFrame { -public: - absl::string_view protocol() const override { return "test"; } -}; - -TEST(StreamInterfaceTest, StreamInterfaceTest) { - { - // FrameFlags Test. - FrameFlags flags; // All flags are default values. - EXPECT_EQ(flags.streamId(), 0); - EXPECT_EQ(flags.frameTags(), 0); - EXPECT_EQ(flags.endStream(), true); - EXPECT_EQ(flags.oneWayStream(), false); - EXPECT_EQ(flags.drainClose(), false); - EXPECT_EQ(flags.heartbeat(), false); - - FrameFlags flags1(1, FrameFlags::FLAG_EMPTY, 0); - EXPECT_EQ(flags1.streamId(), 1); - EXPECT_EQ(flags1.frameTags(), 0); - EXPECT_EQ(flags1.endStream(), false); - EXPECT_EQ(flags1.oneWayStream(), false); - EXPECT_EQ(flags1.drainClose(), false); - EXPECT_EQ(flags1.heartbeat(), false); - - FrameFlags flags2(2, - FrameFlags::FLAG_ONE_WAY | FrameFlags::FLAG_HEARTBEAT | - FrameFlags::FLAG_END_STREAM | FrameFlags::FLAG_DRAIN_CLOSE, - 3); - EXPECT_EQ(flags2.streamId(), 2); - EXPECT_EQ(flags2.frameTags(), 3); - EXPECT_EQ(flags2.endStream(), true); - EXPECT_EQ(flags2.oneWayStream(), true); - EXPECT_EQ(flags2.drainClose(), true); - EXPECT_EQ(flags2.heartbeat(), true); - } - - TestRequestHeaderFrame request_frame; - - EXPECT_EQ(request_frame.protocol(), "test"); - - // Default implementation does nothing. - EXPECT_TRUE(request_frame.frameFlags() == FrameFlags()); - EXPECT_EQ(request_frame.path(), ""); - EXPECT_EQ(request_frame.method(), ""); - EXPECT_EQ(request_frame.host(), ""); - request_frame.set("key", "val"); - EXPECT_EQ(absl::nullopt, request_frame.get("key")); - request_frame.erase("key"); - request_frame.forEach(nullptr); - - TestResponseHeaderFrame response_frame; - - EXPECT_EQ(response_frame.protocol(), "test"); - response_frame.frameFlags(); - - // Default implementation does nothing. - EXPECT_TRUE(response_frame.frameFlags() == FrameFlags()); - EXPECT_EQ(response_frame.status().code(), 0); - EXPECT_EQ(response_frame.status().ok(), true); - response_frame.set("key", "val"); - EXPECT_EQ(absl::nullopt, response_frame.get("key")); - response_frame.erase("key"); - response_frame.forEach(nullptr); -} - -} // namespace -} // namespace GenericProxy -} // namespace NetworkFilters -} // namespace Extensions -} // namespace Envoy diff --git a/test/extensions/filters/network/generic_proxy/tracing_test.cc b/test/extensions/filters/network/generic_proxy/tracing_test.cc deleted file mode 100644 index dd456810f56c..000000000000 --- a/test/extensions/filters/network/generic_proxy/tracing_test.cc +++ /dev/null @@ -1,55 +0,0 @@ -#include "source/extensions/filters/network/generic_proxy/tracing.h" - -#include "test/extensions/filters/network/generic_proxy/fake_codec.h" - -#include "gmock/gmock.h" -#include "gtest/gtest.h" - -namespace Envoy { -namespace Extensions { -namespace NetworkFilters { -namespace GenericProxy { -namespace { - -TEST(TraceContextBridgeTest, TraceContextBridgeTest) { - - FakeStreamCodecFactory::FakeRequest request; - request.protocol_ = "test_protocol"; - request.host_ = "test_host"; - request.method_ = "test_method"; - request.path_ = "test_path"; - - request.data_ = {{"key1", "value1"}, {"key2", "value2"}}; - - TraceContextBridge bridge(request); - - EXPECT_EQ(bridge.protocol(), "test_protocol"); - EXPECT_EQ(bridge.host(), "test_host"); - EXPECT_EQ(bridge.method(), "test_method"); - EXPECT_EQ(bridge.path(), "test_path"); - - EXPECT_EQ(bridge.get("key1"), "value1"); - EXPECT_EQ(bridge.get("key2"), "value2"); - EXPECT_FALSE(bridge.get("key3").has_value()); - - bridge.set("key3", "value3"); - EXPECT_EQ(bridge.get("key3"), "value3"); - EXPECT_EQ(request.data_.at("key3"), "value3"); - - bridge.remove("key3"); - EXPECT_FALSE(bridge.get("key3").has_value()); - - size_t count = 0; - bridge.forEach([&count](absl::string_view, absl::string_view) { - count++; - return true; - }); - - EXPECT_EQ(count, 2); -} - -} // namespace -} // namespace GenericProxy -} // namespace NetworkFilters -} // namespace Extensions -} // namespace Envoy diff --git a/tools/code_format/config.yaml b/tools/code_format/config.yaml index e544d531f28a..4f3846c233be 100644 --- a/tools/code_format/config.yaml +++ b/tools/code_format/config.yaml @@ -413,7 +413,6 @@ visibility_excludes: - source/extensions/early_data/BUILD - source/extensions/filters/http/buffer/BUILD - source/extensions/filters/network/common/BUILD -- source/extensions/filters/network/generic_proxy/interface/BUILD - source/extensions/http/header_validators/envoy_default/BUILD - source/extensions/transport_sockets/common/BUILD - source/extensions/transport_sockets/tap/BUILD diff --git a/tools/spelling/spelling_dictionary.txt b/tools/spelling/spelling_dictionary.txt index 17a167943023..f254b197a090 100644 --- a/tools/spelling/spelling_dictionary.txt +++ b/tools/spelling/spelling_dictionary.txt @@ -1520,4 +1520,3 @@ CNAME NAT NXDOMAIN DNAT -RSP