From 87125748274a7a0734702d8ddd56b02ffee44d98 Mon Sep 17 00:00:00 2001 From: Arko Dasgupta Date: Wed, 11 Jan 2023 14:48:09 -0800 Subject: [PATCH] Enable envoy grpc-web filter for HTTP2 listener Fixes: https://github.com/envoyproxy/gateway/issues/879 Signed-off-by: Arko Dasgupta --- internal/xds/translator/listener.go | 24 +++++++++++++++---- .../out/xds-ir/http2-route.listeners.yaml | 4 ++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/internal/xds/translator/listener.go b/internal/xds/translator/listener.go index 812a5e6429..7f29065a6f 100644 --- a/internal/xds/translator/listener.go +++ b/internal/xds/translator/listener.go @@ -13,6 +13,7 @@ import ( accesslog "github.com/envoyproxy/go-control-plane/envoy/config/accesslog/v3" core "github.com/envoyproxy/go-control-plane/envoy/config/core/v3" listener "github.com/envoyproxy/go-control-plane/envoy/config/listener/v3" + grpc_web "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/grpc_web/v3" router "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/http/router/v3" tls_inspector "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/listener/tls_inspector/v3" hcm "github.com/envoyproxy/go-control-plane/envoy/extensions/filters/network/http_connection_manager/v3" @@ -92,15 +93,30 @@ func addXdsHTTPFilterChain(xdsListener *listener.Listener, irListener *ir.HTTPLi }}, } - // Allow websocket upgrades for HTTP 1.1 - // Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism - if !irListener.IsHTTP2 { + if irListener.IsHTTP2 { + // Set codec to HTTP2 + mgr.CodecType = hcm.HttpConnectionManager_HTTP2 + + // Enable grpc-web filter for HTTP2 + grpcWebAny, err := anypb.New(&grpc_web.GrpcWeb{}) + if err != nil { + return err + } + + grpcWebFilter := &hcm.HttpFilter{ + Name: wellknown.GRPCWeb, + ConfigType: &hcm.HttpFilter_TypedConfig{TypedConfig: grpcWebAny}, + } + // Ensure router is the last filter + mgr.HttpFilters = append([]*hcm.HttpFilter{grpcWebFilter}, mgr.HttpFilters...) + } else { + // Allow websocket upgrades for HTTP 1.1 + // Reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Protocol_upgrade_mechanism mgr.UpgradeConfigs = []*hcm.HttpConnectionManager_UpgradeConfig{ { UpgradeType: "websocket", }, } - } // TODO: Make this a generic interface for all API Gateway features. diff --git a/internal/xds/translator/testdata/out/xds-ir/http2-route.listeners.yaml b/internal/xds/translator/testdata/out/xds-ir/http2-route.listeners.yaml index 6c55557397..b22578e138 100644 --- a/internal/xds/translator/testdata/out/xds-ir/http2-route.listeners.yaml +++ b/internal/xds/translator/testdata/out/xds-ir/http2-route.listeners.yaml @@ -21,7 +21,11 @@ typedConfig: '@type': type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /dev/stdout + codecType: HTTP2 httpFilters: + - name: envoy.filters.http.grpc_web + typedConfig: + '@type': type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb - name: envoy.filters.http.router typedConfig: '@type': type.googleapis.com/envoy.extensions.filters.http.router.v3.Router