in src/go/configgenerator/routegen/proxy_backend.go [61:119]
func (g *ProxyBackendGenerator) GenRouteConfig(filterGens []filtergen.FilterGenerator) ([]*routepb.Route, error) {
var routes []*routepb.Route
for _, httpPattern := range g.HTTPPatterns {
selector := httpPattern.Operation
method, ok := g.MethodBySelector[selector]
if !ok {
return nil, fmt.Errorf("could not find any API method for selector %q", selector)
}
backendCluster, ok := g.BackendClusterBySelector[selector]
if !ok {
return nil, fmt.Errorf("could not find any backend cluster for selector %q", selector)
}
deadlineSpecifier, ok := g.DeadlineBySelector[selector]
if !ok {
deadlineSpecifier = &DeadlineSpecifier{
Deadline: 0,
}
}
methodCfg := &helpers.MethodCfg{
OperationName: selector,
BackendClusterName: backendCluster.Name,
HostRewrite: backendCluster.HostName,
Deadline: deadlineSpecifier.Deadline,
IsStreaming: method.GetRequestStreaming() || method.GetResponseStreaming(),
HTTPPattern: httpPattern.Pattern,
}
if backendCluster.HTTPBackend != nil {
// Special support for HTTP backend.
isGrpc, err := httpPattern.IsGRPCPathForOperation(selector)
if err != nil {
return nil, err
}
if !isGrpc {
methodCfg.BackendClusterName = backendCluster.HTTPBackend.Name
// No need to configure host rewrite for http backend.
// This solution is designed in go/cloud-esf-http-backends and is used to serve
// traffic with dual backends (http, grpc). The cluster config though is not owned by Cloud
// ESF so the below configuration is test only.
methodCfg.HostRewrite = ""
methodCfg.Deadline = deadlineSpecifier.HTTPBackendDeadline
methodCfg.IsStreaming = false
}
}
methodRoutes, err := g.BackendRouteGen.GenRoutesForMethod(methodCfg, filterGens)
if err != nil {
return nil, fmt.Errorf("fail to generate routes for operation %q with HTTP pattern %q: %v", selector, httpPattern.String(), err)
}
routes = append(routes, methodRoutes...)
}
return routes, nil
}