github.com/cilium/cilium@v1.16.2/operator/pkg/model/translation/envoy_http_connection_manager.go (about)

     1  // SPDX-License-Identifier: Apache-2.0
     2  // Copyright Authors of Cilium
     3  
     4  package translation
     5  
     6  import (
     7  	envoy_config_core "github.com/cilium/proxy/go/envoy/config/core/v3"
     8  	grpcStatsv3 "github.com/cilium/proxy/go/envoy/extensions/filters/http/grpc_stats/v3"
     9  	grpcWebv3 "github.com/cilium/proxy/go/envoy/extensions/filters/http/grpc_web/v3"
    10  	httpRouterv3 "github.com/cilium/proxy/go/envoy/extensions/filters/http/router/v3"
    11  	httpConnectionManagerv3 "github.com/cilium/proxy/go/envoy/extensions/filters/network/http_connection_manager/v3"
    12  	"google.golang.org/protobuf/proto"
    13  	"google.golang.org/protobuf/types/known/anypb"
    14  	"google.golang.org/protobuf/types/known/durationpb"
    15  	"google.golang.org/protobuf/types/known/wrapperspb"
    16  
    17  	"github.com/cilium/cilium/pkg/envoy"
    18  	ciliumv2 "github.com/cilium/cilium/pkg/k8s/apis/cilium.io/v2"
    19  )
    20  
    21  type HttpConnectionManagerMutator func(*httpConnectionManagerv3.HttpConnectionManager) *httpConnectionManagerv3.HttpConnectionManager
    22  
    23  // NewHTTPConnectionManager returns a new HTTP connection manager filter with the given name and route.
    24  // Mutation functions can be passed to modify the filter based on the caller's needs.
    25  func NewHTTPConnectionManager(name, routeName string, mutationFunc ...HttpConnectionManagerMutator) (ciliumv2.XDSResource, error) {
    26  	connectionManager := &httpConnectionManagerv3.HttpConnectionManager{
    27  		StatPrefix: name,
    28  		RouteSpecifier: &httpConnectionManagerv3.HttpConnectionManager_Rds{
    29  			Rds: &httpConnectionManagerv3.Rds{RouteConfigName: routeName},
    30  		},
    31  		UseRemoteAddress: &wrapperspb.BoolValue{Value: true},
    32  		SkipXffAppend:    false,
    33  		HttpFilters: []*httpConnectionManagerv3.HttpFilter{
    34  			{
    35  				Name: "envoy.filters.http.grpc_web",
    36  				ConfigType: &httpConnectionManagerv3.HttpFilter_TypedConfig{
    37  					TypedConfig: toAny(&grpcWebv3.GrpcWeb{}),
    38  				},
    39  			},
    40  			{
    41  				Name: "envoy.filters.http.grpc_stats",
    42  				ConfigType: &httpConnectionManagerv3.HttpFilter_TypedConfig{
    43  					TypedConfig: toAny(&grpcStatsv3.FilterConfig{
    44  						EmitFilterState:     true,
    45  						EnableUpstreamStats: true,
    46  					}),
    47  				},
    48  			},
    49  			{
    50  				Name: "envoy.filters.http.router",
    51  				ConfigType: &httpConnectionManagerv3.HttpFilter_TypedConfig{
    52  					TypedConfig: toAny(&httpRouterv3.Router{}),
    53  				},
    54  			},
    55  		},
    56  		UpgradeConfigs: []*httpConnectionManagerv3.HttpConnectionManager_UpgradeConfig{
    57  			{UpgradeType: "websocket"},
    58  		},
    59  		CommonHttpProtocolOptions: &envoy_config_core.HttpProtocolOptions{
    60  			MaxStreamDuration: &durationpb.Duration{
    61  				Seconds: 0,
    62  			},
    63  		},
    64  	}
    65  
    66  	// Apply mutation functions for customizing the connection manager.
    67  	for _, fn := range mutationFunc {
    68  		connectionManager = fn(connectionManager)
    69  	}
    70  
    71  	connectionManagerBytes, err := proto.Marshal(connectionManager)
    72  	if err != nil {
    73  		return ciliumv2.XDSResource{}, err
    74  	}
    75  
    76  	return ciliumv2.XDSResource{
    77  		Any: &anypb.Any{
    78  			TypeUrl: envoy.HttpConnectionManagerTypeURL,
    79  			Value:   connectionManagerBytes,
    80  		},
    81  	}, nil
    82  }