func IsSchemeHeaderOverrideRequiredForOPConfig()

in src/go/configgenerator/filtergen/http_connection_manager.go [209:256]


func IsSchemeHeaderOverrideRequiredForOPConfig(serviceConfig *servicepb.Service, opts options.ConfigGeneratorOptions) (bool, error) {
	if opts.ComputePlatformOverride != util.ServerlessPlatform {
		glog.Infof("Skip HTTP Conn Manager scheme override because platform is NOT Cloud Run.")
		return false, nil
	}
	isGRPCSupportRequired, err := IsGRPCSupportRequiredForOPConfig(serviceConfig, opts)
	if err != nil {
		return false, err
	}
	if !isGRPCSupportRequired {
		glog.Infof("Skip HTTP Conn Manager scheme override because there is no gRPC backend.")
		return false, nil
	}
	if opts.EnableBackendAddressOverride {
		glog.Warningf("Skip HTTP Conn Manager scheme override because backend address override is enabled.")
		return false, nil
	}

	for _, rule := range serviceConfig.GetBackend().GetRules() {
		if util.ShouldSkipOPDiscoveryAPI(rule.GetSelector(), opts.AllowDiscoveryAPIs) {
			glog.Warningf("Skip backend rule %q because discovery API is not supported.", rule.GetSelector())
			continue
		}

		if rule.GetAddress() == "" {
			glog.Infof("Skip backend rule %q because it does not have dynamic routing address.", rule.GetSelector())
			return false, nil
		}

		scheme, _, _, _, err := util.ParseURI(rule.GetAddress())
		if err != nil {
			return false, fmt.Errorf("error parsing remote backend rule's address for operation %q, %v", rule.GetSelector(), err)
		}

		// Create a cluster for the remote backend.
		_, useTLS, err := util.ParseBackendProtocol(scheme, rule.GetProtocol())
		if err != nil {
			return false, fmt.Errorf("error parsing remote backend rule's protocol for operation %q, %v", rule.GetSelector(), err)
		}

		if useTLS {
			glog.Infof("add config to override scheme header as https.")
			return true, nil
		}
	}

	return false, nil
}