From 4ac59269cb07a4c66de1539d5781db464881c56a Mon Sep 17 00:00:00 2001 From: David Jumani Date: Tue, 11 Jun 2024 17:41:09 -0400 Subject: [PATCH 01/16] add it to the proto --- .../projects/gloo/api/v1/options.proto.sk.md | 8 +- .../crds/gateway.solo.io_v1_RouteOption.yaml | 3 + .../crds/gateway.solo.io_v1_RouteTable.yaml | 3 + .../gateway.solo.io_v1_VirtualService.yaml | 3 + projects/gloo/api/v1/options.proto | 9 +- projects/gloo/pkg/api/v1/options.pb.clone.go | 12 + projects/gloo/pkg/api/v1/options.pb.equal.go | 15 + projects/gloo/pkg/api/v1/options.pb.go | 564 +++++++++--------- projects/gloo/pkg/api/v1/options.pb.hash.go | 22 + 9 files changed, 364 insertions(+), 275 deletions(-) diff --git a/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/v1/options.proto.sk.md b/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/v1/options.proto.sk.md index 28987dc6da4..983028fb67e 100644 --- a/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/v1/options.proto.sk.md +++ b/docs/content/reference/api/github.com/solo-io/gloo/projects/gloo/api/v1/options.proto.sk.md @@ -302,6 +302,7 @@ to be usable by Gloo. (plugins currently need to be compiled into Gloo) "hostRewrite": string "autoHostRewrite": .google.protobuf.BoolValue "hostRewritePathRegex": .solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute +"hostRewriteHeader": .google.protobuf.StringValue "appendXForwardedHost": .google.protobuf.BoolValue "cors": .cors.options.gloo.solo.io.CorsPolicy "lbHash": .lbhash.options.gloo.solo.io.RouteActionHashConfig @@ -341,9 +342,10 @@ to be usable by Gloo. (plugins currently need to be compiled into Gloo) | `tracing` | [.tracing.options.gloo.solo.io.RouteTracingSettings](../options/tracing/tracing.proto.sk/#routetracingsettings) | Defines route-specific tracing configuration. See here for additional information on Envoy's tracing capabilities: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/observability/tracing.html See [here](https://docs.solo.io/gloo-edge/latest/guides/observability/tracing/) for additional information about configuring tracing with Gloo Edge. | | `shadowing` | [.shadowing.options.gloo.solo.io.RouteShadowing](../options/shadowing/shadowing.proto.sk/#routeshadowing) | Specifies traffic shadowing configuration for the route. See here for additional information on Envoy's shadowing capabilities: https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/route/v3/route.proto#envoy-api-msg-route-routeaction-requestmirrorpolicy. | | `headerManipulation` | [.headers.options.gloo.solo.io.HeaderManipulation](../options/headers/headers.proto.sk/#headermanipulation) | Append/Remove headers on Requests or Responses on this Route. | -| `hostRewrite` | `string` | Indicates that during forwarding, the host header will be swapped with this value. Only one of `hostRewrite`, `autoHostRewrite`, or `hostRewritePathRegex` can be set. | -| `autoHostRewrite` | [.google.protobuf.BoolValue](https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/well-known-types/bool-value) | Enable/Disable auto host re-write. Indicates that the host header will be swapped with the hostname of the upstream host. This setting is only honored for upstreams that use DNS resolution (i.e., their generated Envoy cluster is of type STRICT_DNS or LOGICAL_DNS -- think aws, azure, or static upstreams with hostnames). Only one of `autoHostRewrite`, `hostRewrite`, or `hostRewritePathRegex` can be set. | -| `hostRewritePathRegex` | [.solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute](../../external/envoy/type/matcher/v3/regex.proto.sk/#regexmatchandsubstitute) | Indicates that during forwarding, the host header will be swapped with the result of the regex substitution executed on path value with query and fragment removed. Only one of `hostRewritePathRegex`, `hostRewrite`, or `autoHostRewrite` can be set. | +| `hostRewrite` | `string` | Indicates that during forwarding, the host header will be swapped with this value. Only one of `hostRewrite`, `autoHostRewrite`, `hostRewritePathRegex`, or `hostRewriteHeader` can be set. | +| `autoHostRewrite` | [.google.protobuf.BoolValue](https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/well-known-types/bool-value) | Enable/Disable auto host re-write. Indicates that the host header will be swapped with the hostname of the upstream host. This setting is only honored for upstreams that use DNS resolution (i.e., their generated Envoy cluster is of type STRICT_DNS or LOGICAL_DNS -- think aws, azure, or static upstreams with hostnames). Only one of `autoHostRewrite`, `hostRewrite`, `hostRewritePathRegex`, or `hostRewriteHeader` can be set. | +| `hostRewritePathRegex` | [.solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute](../../external/envoy/type/matcher/v3/regex.proto.sk/#regexmatchandsubstitute) | Indicates that during forwarding, the host header will be swapped with the result of the regex substitution executed on path value with query and fragment removed. Only one of `hostRewritePathRegex`, `hostRewrite`, `autoHostRewrite`, or `hostRewriteHeader` can be set. | +| `hostRewriteHeader` | [.google.protobuf.StringValue](https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/well-known-types/string-value) | Indicates that during forwarding, the host header will be swapped with the content of given downstream or custom header. If header value is empty, host header is left intact. Using this option will append the x-forwarded-host header if append_x_forwarded_host is set. Only one of `hostRewriteHeader`, `hostRewrite`, `autoHostRewrite`, or `hostRewritePathRegex` can be set. | | `appendXForwardedHost` | [.google.protobuf.BoolValue](https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/well-known-types/bool-value) | If true and there is a host rewrite, appends the x-forwarded-host header to requests. | | `cors` | [.cors.options.gloo.solo.io.CorsPolicy](../options/cors/cors.proto.sk/#corspolicy) | Defines a CORS policy for the route If a CORS policy is also defined on the route's virtual host, the policies are merged. | | `lbHash` | [.lbhash.options.gloo.solo.io.RouteActionHashConfig](../options/lbhash/lbhash.proto.sk/#routeactionhashconfig) | For routes served by a hashing load balancer, this defines the input to the hash key Gloo configures Envoy with the first available RouteActionHashConfig among the following ordered list of providers: - route, upstream, virtual service. | diff --git a/install/helm/gloo/crds/gateway.solo.io_v1_RouteOption.yaml b/install/helm/gloo/crds/gateway.solo.io_v1_RouteOption.yaml index 829764b88c0..cd76489da7c 100644 --- a/install/helm/gloo/crds/gateway.solo.io_v1_RouteOption.yaml +++ b/install/helm/gloo/crds/gateway.solo.io_v1_RouteOption.yaml @@ -388,6 +388,9 @@ spec: type: object hostRewrite: type: string + hostRewriteHeader: + nullable: true + type: string hostRewritePathRegex: properties: pattern: diff --git a/install/helm/gloo/crds/gateway.solo.io_v1_RouteTable.yaml b/install/helm/gloo/crds/gateway.solo.io_v1_RouteTable.yaml index e41f540862b..907910a8e39 100644 --- a/install/helm/gloo/crds/gateway.solo.io_v1_RouteTable.yaml +++ b/install/helm/gloo/crds/gateway.solo.io_v1_RouteTable.yaml @@ -498,6 +498,9 @@ spec: type: object hostRewrite: type: string + hostRewriteHeader: + nullable: true + type: string hostRewritePathRegex: properties: pattern: diff --git a/install/helm/gloo/crds/gateway.solo.io_v1_VirtualService.yaml b/install/helm/gloo/crds/gateway.solo.io_v1_VirtualService.yaml index 44800dc7c62..689acc40812 100644 --- a/install/helm/gloo/crds/gateway.solo.io_v1_VirtualService.yaml +++ b/install/helm/gloo/crds/gateway.solo.io_v1_VirtualService.yaml @@ -3331,6 +3331,9 @@ spec: type: object hostRewrite: type: string + hostRewriteHeader: + nullable: true + type: string hostRewritePathRegex: properties: pattern: diff --git a/projects/gloo/api/v1/options.proto b/projects/gloo/api/v1/options.proto index 015a9c9e482..0c7b3d8f5f5 100644 --- a/projects/gloo/api/v1/options.proto +++ b/projects/gloo/api/v1/options.proto @@ -91,10 +91,10 @@ message ListenerOptions { ConnectionBalanceConfig connection_balance_config = 6; // If enabled this sets up an early access logging service for the listener. - // Added initially to support listener level logging for HTTP listeners. + // Added initially to support listener level logging for HTTP listeners. // For more info see https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/listener/v3/listener.proto#envoy-v3-api-field-config-listener-v3-listener-access-log als.options.gloo.solo.io.AccessLoggingService listener_access_logging_service = 7; - + } // Configuration for listener connection balancing. @@ -417,6 +417,11 @@ message RouteOptions { // Indicates that during forwarding, the host header will be swapped with the result of the regex // substitution executed on path value with query and fragment removed. .solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute host_rewrite_path_regex = 101; + + // Indicates that during forwarding, the host header will be swapped with the content of given downstream or custom header. + // If header value is empty, host header is left intact. + // Using this option will append the x-forwarded-host header if append_x_forwarded_host is set. + google.protobuf.StringValue host_rewrite_header = 147; }; // If true and there is a host rewrite, appends the x-forwarded-host header to requests. google.protobuf.BoolValue append_x_forwarded_host = 146; diff --git a/projects/gloo/pkg/api/v1/options.pb.clone.go b/projects/gloo/pkg/api/v1/options.pb.clone.go index 7e79967893c..8614b06372b 100644 --- a/projects/gloo/pkg/api/v1/options.pb.clone.go +++ b/projects/gloo/pkg/api/v1/options.pb.clone.go @@ -854,6 +854,18 @@ func (m *RouteOptions) Clone() proto.Message { } } + case *RouteOptions_HostRewriteHeader: + + if h, ok := interface{}(m.GetHostRewriteHeader()).(clone.Cloner); ok { + target.HostRewriteType = &RouteOptions_HostRewriteHeader{ + HostRewriteHeader: h.Clone().(*github_com_golang_protobuf_ptypes_wrappers.StringValue), + } + } else { + target.HostRewriteType = &RouteOptions_HostRewriteHeader{ + HostRewriteHeader: proto.Clone(m.GetHostRewriteHeader()).(*github_com_golang_protobuf_ptypes_wrappers.StringValue), + } + } + } switch m.RateLimitEarlyConfigType.(type) { diff --git a/projects/gloo/pkg/api/v1/options.pb.equal.go b/projects/gloo/pkg/api/v1/options.pb.equal.go index cc2bc7ea43b..fc3f22e9f65 100644 --- a/projects/gloo/pkg/api/v1/options.pb.equal.go +++ b/projects/gloo/pkg/api/v1/options.pb.equal.go @@ -1237,6 +1237,21 @@ func (m *RouteOptions) Equal(that interface{}) bool { } } + case *RouteOptions_HostRewriteHeader: + if _, ok := target.HostRewriteType.(*RouteOptions_HostRewriteHeader); !ok { + return false + } + + if h, ok := interface{}(m.GetHostRewriteHeader()).(equality.Equalizer); ok { + if !h.Equal(target.GetHostRewriteHeader()) { + return false + } + } else { + if !proto.Equal(m.GetHostRewriteHeader(), target.GetHostRewriteHeader()) { + return false + } + } + default: // m is nil but target is not nil if m.HostRewriteType != target.HostRewriteType { diff --git a/projects/gloo/pkg/api/v1/options.pb.go b/projects/gloo/pkg/api/v1/options.pb.go index c981995e01a..e7d5b103c1a 100644 --- a/projects/gloo/pkg/api/v1/options.pb.go +++ b/projects/gloo/pkg/api/v1/options.pb.go @@ -1162,6 +1162,7 @@ type RouteOptions struct { // *RouteOptions_HostRewrite // *RouteOptions_AutoHostRewrite // *RouteOptions_HostRewritePathRegex + // *RouteOptions_HostRewriteHeader HostRewriteType isRouteOptions_HostRewriteType `protobuf_oneof:"host_rewrite_type"` // If true and there is a host rewrite, appends the x-forwarded-host header to requests. AppendXForwardedHost *wrappers.BoolValue `protobuf:"bytes,146,opt,name=append_x_forwarded_host,json=appendXForwardedHost,proto3" json:"append_x_forwarded_host,omitempty"` @@ -1368,6 +1369,13 @@ func (x *RouteOptions) GetHostRewritePathRegex() *v32.RegexMatchAndSubstitute { return nil } +func (x *RouteOptions) GetHostRewriteHeader() *wrappers.StringValue { + if x, ok := x.GetHostRewriteType().(*RouteOptions_HostRewriteHeader); ok { + return x.HostRewriteHeader + } + return nil +} + func (x *RouteOptions) GetAppendXForwardedHost() *wrappers.BoolValue { if x != nil { return x.AppendXForwardedHost @@ -1595,12 +1603,21 @@ type RouteOptions_HostRewritePathRegex struct { HostRewritePathRegex *v32.RegexMatchAndSubstitute `protobuf:"bytes,101,opt,name=host_rewrite_path_regex,json=hostRewritePathRegex,proto3,oneof"` } +type RouteOptions_HostRewriteHeader struct { + // Indicates that during forwarding, the host header will be swapped with the content of given downstream or custom header. + // If header value is empty, host header is left intact. + // Using this option will append the x-forwarded-host header if append_x_forwarded_host is set. + HostRewriteHeader *wrappers.StringValue `protobuf:"bytes,147,opt,name=host_rewrite_header,json=hostRewriteHeader,proto3,oneof"` +} + func (*RouteOptions_HostRewrite) isRouteOptions_HostRewriteType() {} func (*RouteOptions_AutoHostRewrite) isRouteOptions_HostRewriteType() {} func (*RouteOptions_HostRewritePathRegex) isRouteOptions_HostRewriteType() {} +func (*RouteOptions_HostRewriteHeader) isRouteOptions_HostRewriteType() {} + type isRouteOptions_RateLimitEarlyConfigType interface { isRouteOptions_RateLimitEarlyConfigType() } @@ -2639,8 +2656,8 @@ var file_github_com_solo_io_gloo_projects_gloo_api_v1_options_proto_rawDesc = [] 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x20, 0x0a, 0x1e, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x42, 0x0c, 0x0a, 0x0a, 0x6a, 0x77, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xbf, - 0x1b, 0x0a, 0x0c, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x42, 0x0c, 0x0a, 0x0a, 0x6a, 0x77, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x90, + 0x1c, 0x0a, 0x0c, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x62, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, @@ -2696,235 +2713,240 @@ var file_github_com_solo_io_gloo_projects_gloo_api_v1_options_proto_rawDesc = [] 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x48, 0x00, 0x52, 0x14, 0x68, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x52, 0x0a, 0x17, - 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x78, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x61, 0x70, 0x70, 0x65, - 0x6e, 0x64, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x39, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, - 0x2e, 0x63, 0x6f, 0x72, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, - 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x43, 0x6f, 0x72, 0x73, 0x50, - 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x07, 0x6c, - 0x62, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6c, - 0x62, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, - 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x6c, 0x62, 0x48, 0x61, 0x73, 0x68, 0x12, 0x58, 0x0a, 0x08, 0x75, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x73, 0x12, 0x59, 0x0a, 0x0f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x62, 0x61, 0x73, 0x69, 0x63, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, 0x61, - 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x49, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0e, 0x72, - 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x61, 0x73, 0x69, 0x63, 0x12, 0x63, 0x0a, - 0x0f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x61, 0x72, 0x6c, 0x79, - 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, - 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x48, 0x01, 0x52, 0x0e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x61, 0x72, - 0x6c, 0x79, 0x12, 0x6f, 0x0a, 0x18, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x8f, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, - 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x73, 0x48, 0x01, 0x52, 0x15, 0x72, 0x61, - 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x61, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, - 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x48, 0x02, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x64, 0x0a, - 0x12, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x74, - 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x73, 0x48, - 0x02, 0x52, 0x10, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x12, 0x67, 0x0a, 0x11, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x37, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, - 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x10, 0x72, 0x61, 0x74, 0x65, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x12, 0x73, 0x0a, 0x1a, - 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x75, 0x6c, - 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x91, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x66, 0x73, 0x48, 0x03, 0x52, 0x17, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x12, 0x34, 0x0a, 0x03, 0x77, 0x61, 0x66, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x77, 0x61, 0x66, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, - 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x03, 0x77, 0x61, 0x66, 0x12, 0x40, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6a, 0x77, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x02, - 0x18, 0x01, 0x48, 0x04, 0x52, 0x03, 0x6a, 0x77, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x6a, 0x77, 0x74, - 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, - 0x6a, 0x77, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, - 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x4a, 0x77, 0x74, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x48, 0x04, 0x52, 0x09, 0x6a, 0x77, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x12, 0x40, 0x0a, - 0x04, 0x72, 0x62, 0x61, 0x63, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, 0x62, - 0x61, 0x63, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, - 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x04, 0x72, 0x62, 0x61, 0x63, 0x12, - 0x43, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x61, 0x75, 0x74, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e, 0x67, 0x6c, - 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x41, 0x75, - 0x74, 0x68, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x78, 0x74, - 0x61, 0x75, 0x74, 0x68, 0x12, 0x32, 0x0a, 0x03, 0x64, 0x6c, 0x70, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x6c, 0x70, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x03, 0x64, 0x6c, 0x70, 0x12, 0x69, 0x0a, 0x10, 0x62, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x52, 0x0e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, 0x6f, - 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x63, 0x73, 0x72, 0x66, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x63, 0x73, 0x72, 0x66, 0x2e, 0x76, - 0x33, 0x2e, 0x43, 0x73, 0x72, 0x66, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x63, 0x73, - 0x72, 0x66, 0x12, 0x70, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, - 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x15, 0x73, - 0x74, 0x61, 0x67, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, + 0x69, 0x74, 0x65, 0x50, 0x61, 0x74, 0x68, 0x52, 0x65, 0x67, 0x65, 0x78, 0x12, 0x4f, 0x0a, 0x13, + 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x18, 0x93, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x11, 0x68, 0x6f, 0x73, 0x74, + 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x52, 0x0a, + 0x17, 0x61, 0x70, 0x70, 0x65, 0x6e, 0x64, 0x5f, 0x78, 0x5f, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x92, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x61, 0x70, 0x70, + 0x65, 0x6e, 0x64, 0x58, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x39, 0x0a, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x63, 0x6f, 0x72, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, + 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x43, 0x6f, 0x72, 0x73, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x63, 0x6f, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x07, + 0x6c, 0x62, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x6c, 0x62, 0x68, 0x61, 0x73, 0x68, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x65, 0x6e, 0x76, - 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5b, 0x0a, 0x0d, 0x72, 0x65, - 0x67, 0x65, 0x78, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, - 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, 0x76, - 0x33, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, 0x53, - 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x65, 0x78, - 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x5c, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x1c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, - 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0c, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x46, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x18, - 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x63, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, - 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x07, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x1a, 0x59, 0x0a, 0x12, 0x45, - 0x6e, 0x76, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x02, 0x0a, 0x11, 0x4d, 0x61, 0x78, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x13, - 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x17, 0x67, 0x72, 0x70, 0x63, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, - 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x67, 0x72, 0x70, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x12, 0x56, 0x0a, 0x1a, 0x67, 0x72, 0x70, - 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x67, 0x72, 0x70, 0x63, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x42, 0x13, 0x0a, 0x11, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, - 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x1e, 0x0a, 0x1c, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x42, 0x20, 0x0a, 0x1e, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, - 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x6a, 0x77, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x22, 0xad, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x77, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x03, - 0x61, 0x77, 0x73, 0x12, 0x43, 0x0a, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x48, - 0x00, 0x52, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, - 0x69, 0x6f, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, - 0x65, 0x63, 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x67, 0x72, - 0x70, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, - 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x42, 0x12, 0x0a, 0x10, - 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x8e, 0x05, 0x0a, 0x1a, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, 0x73, - 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x61, 0x0a, 0x13, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x70, 0x75, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x68, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, - 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6f, 0x70, 0x74, + 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x73, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x06, 0x6c, 0x62, 0x48, 0x61, 0x73, 0x68, 0x12, 0x58, 0x0a, 0x08, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, + 0x2e, 0x69, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x75, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x73, 0x12, 0x59, 0x0a, 0x0f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x72, + 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x49, 0x6e, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x0e, + 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x61, 0x73, 0x69, 0x63, 0x12, 0x63, + 0x0a, 0x0f, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x61, 0x72, 0x6c, + 0x79, 0x18, 0x8e, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x48, 0x01, 0x52, 0x0e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x61, + 0x72, 0x6c, 0x79, 0x12, 0x6f, 0x0a, 0x18, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5f, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, + 0x8f, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, + 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x73, 0x48, 0x01, 0x52, 0x15, 0x72, + 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x45, 0x61, 0x72, 0x6c, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0x58, 0x0a, 0x09, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x8c, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x48, 0x02, 0x52, 0x09, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x64, + 0x0a, 0x12, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x18, 0x8d, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, + 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, + 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x73, + 0x48, 0x02, 0x52, 0x10, 0x72, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x73, 0x12, 0x67, 0x0a, 0x11, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x5f, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x90, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x37, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, - 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6c, 0x6f, - 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x43, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x61, 0x75, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x03, 0x52, 0x10, 0x72, 0x61, 0x74, + 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x12, 0x73, 0x0a, + 0x1a, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x75, + 0x6c, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x91, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x72, 0x61, 0x74, 0x65, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, + 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x66, 0x73, 0x48, 0x03, 0x52, 0x17, 0x72, 0x61, 0x74, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x12, 0x34, 0x0a, 0x03, 0x77, 0x61, 0x66, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x77, 0x61, 0x66, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, + 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x03, 0x77, 0x61, 0x66, 0x12, 0x40, 0x0a, 0x03, 0x6a, 0x77, 0x74, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6a, 0x77, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x42, + 0x02, 0x18, 0x01, 0x48, 0x04, 0x52, 0x03, 0x6a, 0x77, 0x74, 0x12, 0x52, 0x0a, 0x0a, 0x6a, 0x77, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, + 0x2e, 0x6a, 0x77, 0x74, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x4a, 0x77, 0x74, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x48, 0x04, 0x52, 0x09, 0x6a, 0x77, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x12, 0x40, + 0x0a, 0x04, 0x72, 0x62, 0x61, 0x63, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x72, + 0x62, 0x61, 0x63, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, + 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x04, 0x72, 0x62, 0x61, 0x63, + 0x12, 0x43, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x61, 0x75, 0x74, 0x68, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x41, 0x75, 0x74, 0x68, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, 0x78, - 0x74, 0x61, 0x75, 0x74, 0x68, 0x12, 0x69, 0x0a, 0x10, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, - 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, 0x76, - 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x52, 0x0e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x12, 0x4d, 0x0a, 0x04, 0x63, 0x73, 0x72, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, - 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, 0x65, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x63, 0x73, 0x72, 0x66, 0x2e, 0x76, 0x33, 0x2e, 0x43, - 0x73, 0x72, 0x66, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x63, 0x73, 0x72, 0x66, 0x12, - 0x70, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x39, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x74, 0x61, 0x75, 0x74, 0x68, 0x12, 0x32, 0x0a, 0x03, 0x64, 0x6c, 0x70, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x6c, 0x70, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x03, 0x64, 0x6c, 0x70, 0x12, 0x69, 0x0a, 0x10, 0x62, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x62, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x52, 0x0e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x63, 0x73, 0x72, 0x66, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x63, 0x73, 0x72, 0x66, 0x2e, + 0x76, 0x33, 0x2e, 0x43, 0x73, 0x72, 0x66, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x63, + 0x73, 0x72, 0x66, 0x12, 0x70, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, + 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x15, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x54, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x5f, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, + 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x65, 0x6e, + 0x76, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5b, 0x0a, 0x0d, 0x72, + 0x65, 0x67, 0x65, 0x78, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x1b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, + 0x6f, 0x79, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x78, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x41, 0x6e, 0x64, + 0x53, 0x75, 0x62, 0x73, 0x74, 0x69, 0x74, 0x75, 0x74, 0x65, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x65, + 0x78, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x5c, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, + 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x4d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0c, 0x69, 0x64, 0x6c, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x69, 0x64, 0x6c, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x12, 0x46, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x65, 0x78, 0x74, 0x70, 0x72, 0x6f, 0x63, + 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x07, 0x65, 0x78, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x1a, 0x59, 0x0a, 0x12, + 0x45, 0x6e, 0x76, 0x6f, 0x79, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x88, 0x02, 0x0a, 0x11, 0x4d, 0x61, 0x78, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, + 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x50, 0x0a, 0x17, 0x67, 0x72, 0x70, 0x63, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x14, 0x67, 0x72, 0x70, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x12, 0x56, 0x0a, 0x1a, 0x67, 0x72, + 0x70, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x17, 0x67, 0x72, 0x70, 0x63, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x42, 0x13, 0x0a, 0x11, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x77, 0x72, 0x69, + 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x1e, 0x0a, 0x1c, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x65, 0x61, 0x72, 0x6c, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x72, 0x61, 0x74, 0x65, 0x5f, + 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x42, 0x20, 0x0a, 0x1e, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, + 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x6a, 0x77, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0xad, 0x02, 0x0a, 0x0f, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x3d, 0x0a, 0x03, 0x61, 0x77, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x77, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, + 0x03, 0x61, 0x77, 0x73, 0x12, 0x43, 0x0a, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x2e, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, + 0x48, 0x00, 0x52, 0x05, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x12, 0x40, 0x0a, 0x04, 0x72, 0x65, 0x73, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x72, 0x65, 0x73, 0x74, 0x2e, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, + 0x2e, 0x69, 0x6f, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x04, 0x72, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x04, 0x67, + 0x72, 0x70, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, - 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x15, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x3e, 0xb8, 0xf5, 0x04, 0x01, 0xc0, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, 0x01, 0x5a, - 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x6c, 0x6f, - 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, - 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x70, 0x65, 0x63, 0x48, 0x00, 0x52, 0x04, 0x67, 0x72, 0x70, 0x63, 0x42, 0x12, 0x0a, + 0x10, 0x64, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x22, 0x8e, 0x05, 0x0a, 0x1a, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x44, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x61, 0x0a, 0x13, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x70, + 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x12, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x6e, 0x69, 0x70, 0x75, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, + 0x69, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x6c, + 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x43, 0x0a, 0x07, 0x65, 0x78, 0x74, 0x61, 0x75, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e, + 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x45, 0x78, 0x74, + 0x41, 0x75, 0x74, 0x68, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x65, + 0x78, 0x74, 0x61, 0x75, 0x74, 0x68, 0x12, 0x69, 0x0a, 0x10, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x3f, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, + 0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x2e, + 0x76, 0x33, 0x2e, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x52, 0x0e, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x50, 0x65, 0x72, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x12, 0x4d, 0x0a, 0x04, 0x63, 0x73, 0x72, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x73, 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x65, 0x6e, 0x76, 0x6f, 0x79, 0x2e, + 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x66, 0x69, 0x6c, 0x74, 0x65, + 0x72, 0x73, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x2e, 0x63, 0x73, 0x72, 0x66, 0x2e, 0x76, 0x33, 0x2e, + 0x43, 0x73, 0x72, 0x66, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x04, 0x63, 0x73, 0x72, 0x66, + 0x12, 0x70, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x39, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x67, 0x6c, 0x6f, 0x6f, 0x2e, 0x73, + 0x6f, 0x6c, 0x6f, 0x2e, 0x69, 0x6f, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x73, 0x52, 0x15, 0x73, 0x74, 0x61, + 0x67, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x42, 0x3e, 0xb8, 0xf5, 0x04, 0x01, 0xc0, 0xf5, 0x04, 0x01, 0xd0, 0xf5, 0x04, 0x01, + 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6f, 0x6c, + 0x6f, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x2f, 0x67, 0x6c, 0x6f, 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3089,51 +3111,52 @@ var file_github_com_solo_io_gloo_projects_gloo_api_v1_options_proto_depIdxs = [] 42, // 71: gloo.solo.io.RouteOptions.header_manipulation:type_name -> headers.options.gloo.solo.io.HeaderManipulation 17, // 72: gloo.solo.io.RouteOptions.auto_host_rewrite:type_name -> google.protobuf.BoolValue 61, // 73: gloo.solo.io.RouteOptions.host_rewrite_path_regex:type_name -> solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute - 17, // 74: gloo.solo.io.RouteOptions.append_x_forwarded_host:type_name -> google.protobuf.BoolValue - 43, // 75: gloo.solo.io.RouteOptions.cors:type_name -> cors.options.gloo.solo.io.CorsPolicy - 62, // 76: gloo.solo.io.RouteOptions.lb_hash:type_name -> lbhash.options.gloo.solo.io.RouteActionHashConfig - 63, // 77: gloo.solo.io.RouteOptions.upgrades:type_name -> protocol_upgrade.options.gloo.solo.io.ProtocolUpgradeConfig - 45, // 78: gloo.solo.io.RouteOptions.ratelimit_basic:type_name -> ratelimit.options.gloo.solo.io.IngressRateLimit - 64, // 79: gloo.solo.io.RouteOptions.ratelimit_early:type_name -> ratelimit.options.gloo.solo.io.RateLimitRouteExtension - 47, // 80: gloo.solo.io.RouteOptions.rate_limit_early_configs:type_name -> ratelimit.options.gloo.solo.io.RateLimitConfigRefs - 64, // 81: gloo.solo.io.RouteOptions.ratelimit:type_name -> ratelimit.options.gloo.solo.io.RateLimitRouteExtension - 47, // 82: gloo.solo.io.RouteOptions.rate_limit_configs:type_name -> ratelimit.options.gloo.solo.io.RateLimitConfigRefs - 64, // 83: gloo.solo.io.RouteOptions.ratelimit_regular:type_name -> ratelimit.options.gloo.solo.io.RateLimitRouteExtension - 47, // 84: gloo.solo.io.RouteOptions.rate_limit_regular_configs:type_name -> ratelimit.options.gloo.solo.io.RateLimitConfigRefs - 21, // 85: gloo.solo.io.RouteOptions.waf:type_name -> waf.options.gloo.solo.io.Settings - 65, // 86: gloo.solo.io.RouteOptions.jwt:type_name -> jwt.options.gloo.solo.io.RouteExtension - 66, // 87: gloo.solo.io.RouteOptions.jwt_staged:type_name -> jwt.options.gloo.solo.io.JwtStagedRouteExtension - 50, // 88: gloo.solo.io.RouteOptions.rbac:type_name -> rbac.options.gloo.solo.io.ExtensionSettings - 51, // 89: gloo.solo.io.RouteOptions.extauth:type_name -> enterprise.gloo.solo.io.ExtAuthExtension - 52, // 90: gloo.solo.io.RouteOptions.dlp:type_name -> dlp.options.gloo.solo.io.Config - 53, // 91: gloo.solo.io.RouteOptions.buffer_per_route:type_name -> solo.io.envoy.extensions.filters.http.buffer.v3.BufferPerRoute - 31, // 92: gloo.solo.io.RouteOptions.csrf:type_name -> solo.io.envoy.extensions.filters.http.csrf.v3.CsrfPolicy - 54, // 93: gloo.solo.io.RouteOptions.staged_transformations:type_name -> transformation.options.gloo.solo.io.TransformationStages - 10, // 94: gloo.solo.io.RouteOptions.envoy_metadata:type_name -> gloo.solo.io.RouteOptions.EnvoyMetadataEntry - 61, // 95: gloo.solo.io.RouteOptions.regex_rewrite:type_name -> solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute - 11, // 96: gloo.solo.io.RouteOptions.max_stream_duration:type_name -> gloo.solo.io.RouteOptions.MaxStreamDuration - 58, // 97: gloo.solo.io.RouteOptions.idle_timeout:type_name -> google.protobuf.Duration - 55, // 98: gloo.solo.io.RouteOptions.ext_proc:type_name -> extproc.options.gloo.solo.io.RouteSettings - 67, // 99: gloo.solo.io.DestinationSpec.aws:type_name -> aws.options.gloo.solo.io.DestinationSpec - 68, // 100: gloo.solo.io.DestinationSpec.azure:type_name -> azure.options.gloo.solo.io.DestinationSpec - 69, // 101: gloo.solo.io.DestinationSpec.rest:type_name -> rest.options.gloo.solo.io.DestinationSpec - 70, // 102: gloo.solo.io.DestinationSpec.grpc:type_name -> grpc.options.gloo.solo.io.DestinationSpec - 42, // 103: gloo.solo.io.WeightedDestinationOptions.header_manipulation:type_name -> headers.options.gloo.solo.io.HeaderManipulation - 44, // 104: gloo.solo.io.WeightedDestinationOptions.transformations:type_name -> transformation.options.gloo.solo.io.Transformations - 13, // 105: gloo.solo.io.WeightedDestinationOptions.extensions:type_name -> gloo.solo.io.Extensions - 51, // 106: gloo.solo.io.WeightedDestinationOptions.extauth:type_name -> enterprise.gloo.solo.io.ExtAuthExtension - 53, // 107: gloo.solo.io.WeightedDestinationOptions.buffer_per_route:type_name -> solo.io.envoy.extensions.filters.http.buffer.v3.BufferPerRoute - 31, // 108: gloo.solo.io.WeightedDestinationOptions.csrf:type_name -> solo.io.envoy.extensions.filters.http.csrf.v3.CsrfPolicy - 54, // 109: gloo.solo.io.WeightedDestinationOptions.staged_transformations:type_name -> transformation.options.gloo.solo.io.TransformationStages - 71, // 110: gloo.solo.io.RouteOptions.EnvoyMetadataEntry.value:type_name -> google.protobuf.Struct - 58, // 111: gloo.solo.io.RouteOptions.MaxStreamDuration.max_stream_duration:type_name -> google.protobuf.Duration - 58, // 112: gloo.solo.io.RouteOptions.MaxStreamDuration.grpc_timeout_header_max:type_name -> google.protobuf.Duration - 58, // 113: gloo.solo.io.RouteOptions.MaxStreamDuration.grpc_timeout_header_offset:type_name -> google.protobuf.Duration - 114, // [114:114] is the sub-list for method output_type - 114, // [114:114] is the sub-list for method input_type - 114, // [114:114] is the sub-list for extension type_name - 114, // [114:114] is the sub-list for extension extendee - 0, // [0:114] is the sub-list for field type_name + 57, // 74: gloo.solo.io.RouteOptions.host_rewrite_header:type_name -> google.protobuf.StringValue + 17, // 75: gloo.solo.io.RouteOptions.append_x_forwarded_host:type_name -> google.protobuf.BoolValue + 43, // 76: gloo.solo.io.RouteOptions.cors:type_name -> cors.options.gloo.solo.io.CorsPolicy + 62, // 77: gloo.solo.io.RouteOptions.lb_hash:type_name -> lbhash.options.gloo.solo.io.RouteActionHashConfig + 63, // 78: gloo.solo.io.RouteOptions.upgrades:type_name -> protocol_upgrade.options.gloo.solo.io.ProtocolUpgradeConfig + 45, // 79: gloo.solo.io.RouteOptions.ratelimit_basic:type_name -> ratelimit.options.gloo.solo.io.IngressRateLimit + 64, // 80: gloo.solo.io.RouteOptions.ratelimit_early:type_name -> ratelimit.options.gloo.solo.io.RateLimitRouteExtension + 47, // 81: gloo.solo.io.RouteOptions.rate_limit_early_configs:type_name -> ratelimit.options.gloo.solo.io.RateLimitConfigRefs + 64, // 82: gloo.solo.io.RouteOptions.ratelimit:type_name -> ratelimit.options.gloo.solo.io.RateLimitRouteExtension + 47, // 83: gloo.solo.io.RouteOptions.rate_limit_configs:type_name -> ratelimit.options.gloo.solo.io.RateLimitConfigRefs + 64, // 84: gloo.solo.io.RouteOptions.ratelimit_regular:type_name -> ratelimit.options.gloo.solo.io.RateLimitRouteExtension + 47, // 85: gloo.solo.io.RouteOptions.rate_limit_regular_configs:type_name -> ratelimit.options.gloo.solo.io.RateLimitConfigRefs + 21, // 86: gloo.solo.io.RouteOptions.waf:type_name -> waf.options.gloo.solo.io.Settings + 65, // 87: gloo.solo.io.RouteOptions.jwt:type_name -> jwt.options.gloo.solo.io.RouteExtension + 66, // 88: gloo.solo.io.RouteOptions.jwt_staged:type_name -> jwt.options.gloo.solo.io.JwtStagedRouteExtension + 50, // 89: gloo.solo.io.RouteOptions.rbac:type_name -> rbac.options.gloo.solo.io.ExtensionSettings + 51, // 90: gloo.solo.io.RouteOptions.extauth:type_name -> enterprise.gloo.solo.io.ExtAuthExtension + 52, // 91: gloo.solo.io.RouteOptions.dlp:type_name -> dlp.options.gloo.solo.io.Config + 53, // 92: gloo.solo.io.RouteOptions.buffer_per_route:type_name -> solo.io.envoy.extensions.filters.http.buffer.v3.BufferPerRoute + 31, // 93: gloo.solo.io.RouteOptions.csrf:type_name -> solo.io.envoy.extensions.filters.http.csrf.v3.CsrfPolicy + 54, // 94: gloo.solo.io.RouteOptions.staged_transformations:type_name -> transformation.options.gloo.solo.io.TransformationStages + 10, // 95: gloo.solo.io.RouteOptions.envoy_metadata:type_name -> gloo.solo.io.RouteOptions.EnvoyMetadataEntry + 61, // 96: gloo.solo.io.RouteOptions.regex_rewrite:type_name -> solo.io.envoy.type.matcher.v3.RegexMatchAndSubstitute + 11, // 97: gloo.solo.io.RouteOptions.max_stream_duration:type_name -> gloo.solo.io.RouteOptions.MaxStreamDuration + 58, // 98: gloo.solo.io.RouteOptions.idle_timeout:type_name -> google.protobuf.Duration + 55, // 99: gloo.solo.io.RouteOptions.ext_proc:type_name -> extproc.options.gloo.solo.io.RouteSettings + 67, // 100: gloo.solo.io.DestinationSpec.aws:type_name -> aws.options.gloo.solo.io.DestinationSpec + 68, // 101: gloo.solo.io.DestinationSpec.azure:type_name -> azure.options.gloo.solo.io.DestinationSpec + 69, // 102: gloo.solo.io.DestinationSpec.rest:type_name -> rest.options.gloo.solo.io.DestinationSpec + 70, // 103: gloo.solo.io.DestinationSpec.grpc:type_name -> grpc.options.gloo.solo.io.DestinationSpec + 42, // 104: gloo.solo.io.WeightedDestinationOptions.header_manipulation:type_name -> headers.options.gloo.solo.io.HeaderManipulation + 44, // 105: gloo.solo.io.WeightedDestinationOptions.transformations:type_name -> transformation.options.gloo.solo.io.Transformations + 13, // 106: gloo.solo.io.WeightedDestinationOptions.extensions:type_name -> gloo.solo.io.Extensions + 51, // 107: gloo.solo.io.WeightedDestinationOptions.extauth:type_name -> enterprise.gloo.solo.io.ExtAuthExtension + 53, // 108: gloo.solo.io.WeightedDestinationOptions.buffer_per_route:type_name -> solo.io.envoy.extensions.filters.http.buffer.v3.BufferPerRoute + 31, // 109: gloo.solo.io.WeightedDestinationOptions.csrf:type_name -> solo.io.envoy.extensions.filters.http.csrf.v3.CsrfPolicy + 54, // 110: gloo.solo.io.WeightedDestinationOptions.staged_transformations:type_name -> transformation.options.gloo.solo.io.TransformationStages + 71, // 111: gloo.solo.io.RouteOptions.EnvoyMetadataEntry.value:type_name -> google.protobuf.Struct + 58, // 112: gloo.solo.io.RouteOptions.MaxStreamDuration.max_stream_duration:type_name -> google.protobuf.Duration + 58, // 113: gloo.solo.io.RouteOptions.MaxStreamDuration.grpc_timeout_header_max:type_name -> google.protobuf.Duration + 58, // 114: gloo.solo.io.RouteOptions.MaxStreamDuration.grpc_timeout_header_offset:type_name -> google.protobuf.Duration + 115, // [115:115] is the sub-list for method output_type + 115, // [115:115] is the sub-list for method input_type + 115, // [115:115] is the sub-list for extension type_name + 115, // [115:115] is the sub-list for extension extendee + 0, // [0:115] is the sub-list for field type_name } func init() { file_github_com_solo_io_gloo_projects_gloo_api_v1_options_proto_init() } @@ -3294,6 +3317,7 @@ func file_github_com_solo_io_gloo_projects_gloo_api_v1_options_proto_init() { (*RouteOptions_HostRewrite)(nil), (*RouteOptions_AutoHostRewrite)(nil), (*RouteOptions_HostRewritePathRegex)(nil), + (*RouteOptions_HostRewriteHeader)(nil), (*RouteOptions_RatelimitEarly)(nil), (*RouteOptions_RateLimitEarlyConfigs)(nil), (*RouteOptions_Ratelimit)(nil), diff --git a/projects/gloo/pkg/api/v1/options.pb.hash.go b/projects/gloo/pkg/api/v1/options.pb.hash.go index d9ecae6d06a..8d105aa712d 100644 --- a/projects/gloo/pkg/api/v1/options.pb.hash.go +++ b/projects/gloo/pkg/api/v1/options.pb.hash.go @@ -2033,6 +2033,28 @@ func (m *RouteOptions) Hash(hasher hash.Hash64) (uint64, error) { } } + case *RouteOptions_HostRewriteHeader: + + if h, ok := interface{}(m.GetHostRewriteHeader()).(safe_hasher.SafeHasher); ok { + if _, err = hasher.Write([]byte("HostRewriteHeader")); err != nil { + return 0, err + } + if _, err = h.Hash(hasher); err != nil { + return 0, err + } + } else { + if fieldValue, err := hashstructure.Hash(m.GetHostRewriteHeader(), nil); err != nil { + return 0, err + } else { + if _, err = hasher.Write([]byte("HostRewriteHeader")); err != nil { + return 0, err + } + if err := binary.Write(hasher, binary.LittleEndian, fieldValue); err != nil { + return 0, err + } + } + } + } switch m.RateLimitEarlyConfigType.(type) { From 679a8e5bb4397b7a256c11644cf3fb027a697d02 Mon Sep 17 00:00:00 2001 From: David Jumani Date: Tue, 11 Jun 2024 20:29:30 -0400 Subject: [PATCH 02/16] add plugin --- .../gloo/pkg/plugins/basicroute/plugin.go | 5 ++++- .../pkg/plugins/basicroute/plugin_test.go | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/projects/gloo/pkg/plugins/basicroute/plugin.go b/projects/gloo/pkg/plugins/basicroute/plugin.go index 54c533413f9..a9022983eae 100644 --- a/projects/gloo/pkg/plugins/basicroute/plugin.go +++ b/projects/gloo/pkg/plugins/basicroute/plugin.go @@ -230,7 +230,10 @@ func applyHostRewrite(ctx context.Context, in *v1.Route, out *envoy_config_route routeAction.Route.HostRewriteSpecifier = &envoy_config_route_v3.RouteAction_AutoHostRewrite{ AutoHostRewrite: rewriteType.AutoHostRewrite, } - + case *v1.RouteOptions_HostRewriteHeader: + routeAction.Route.HostRewriteSpecifier = &envoy_config_route_v3.RouteAction_HostRewriteHeader{ + HostRewriteHeader: rewriteType.HostRewriteHeader.GetValue(), + } case *v1.RouteOptions_HostRewritePathRegex: regex, err := ConvertRegexMatchAndSubstitute(ctx, rewriteType.HostRewritePathRegex) if err != nil { diff --git a/projects/gloo/pkg/plugins/basicroute/plugin_test.go b/projects/gloo/pkg/plugins/basicroute/plugin_test.go index 6e910c7b5c6..69701877ead 100644 --- a/projects/gloo/pkg/plugins/basicroute/plugin_test.go +++ b/projects/gloo/pkg/plugins/basicroute/plugin_test.go @@ -665,6 +665,28 @@ var _ = Describe("host rewrite", func() { Expect(routeAction.GetAutoHostRewrite().GetValue()).To(BeTrue()) }) + It("sets host_rewrite_header", func() { + hostRewriteHeader := "host-rewrite" + p := NewPlugin() + out := &envoy_config_route_v3.Route{ + Action: &envoy_config_route_v3.Route_Route{ + Route: &envoy_config_route_v3.RouteAction{}, + }, + } + err := p.ProcessRoute(plugins.RouteParams{}, &v1.Route{ + Options: &v1.RouteOptions{ + HostRewriteType: &v1.RouteOptions_HostRewriteHeader{ + HostRewriteHeader: &wrappers.StringValue{ + Value: hostRewriteHeader, + }, + }, + }, + Action: &v1.Route_RouteAction{}, + }, out) + Expect(err).NotTo(HaveOccurred()) + Expect(out.GetRoute().GetHostRewriteHeader()).To(Equal(hostRewriteHeader)) + }) + It("rewrites using regex", func() { p := NewPlugin() routeAction := &envoy_config_route_v3.RouteAction{} From a660aa9ccfb63cc2ac6407d9c5f4c7093872e490 Mon Sep 17 00:00:00 2001 From: David Jumani Date: Tue, 11 Jun 2024 20:34:08 -0400 Subject: [PATCH 03/16] add changelog --- changelog/v1.17.0-rc3/add-host-rewrite-header.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/v1.17.0-rc3/add-host-rewrite-header.yaml diff --git a/changelog/v1.17.0-rc3/add-host-rewrite-header.yaml b/changelog/v1.17.0-rc3/add-host-rewrite-header.yaml new file mode 100644 index 00000000000..8550002ea6e --- /dev/null +++ b/changelog/v1.17.0-rc3/add-host-rewrite-header.yaml @@ -0,0 +1,5 @@ +changelog: +- type: NEW_FEATURE + issueLink: https://github.com/solo-io/gloo/issues/9579 + resolvesIssue: false + description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header From db941fb4fce2e6cce86b8e33d227dd61225b981c Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 12 Jun 2024 19:20:43 +0000 Subject: [PATCH 04/16] Adding changelog file to new location --- changelog/v1.17.0-rc4/add-host-rewrite-header.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/v1.17.0-rc4/add-host-rewrite-header.yaml diff --git a/changelog/v1.17.0-rc4/add-host-rewrite-header.yaml b/changelog/v1.17.0-rc4/add-host-rewrite-header.yaml new file mode 100644 index 00000000000..8550002ea6e --- /dev/null +++ b/changelog/v1.17.0-rc4/add-host-rewrite-header.yaml @@ -0,0 +1,5 @@ +changelog: +- type: NEW_FEATURE + issueLink: https://github.com/solo-io/gloo/issues/9579 + resolvesIssue: false + description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header From 28a581a3651a68b7caf2200c03e6e845acd10223 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Wed, 12 Jun 2024 19:20:44 +0000 Subject: [PATCH 05/16] Deleting changelog file from old location --- changelog/v1.17.0-rc3/add-host-rewrite-header.yaml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 changelog/v1.17.0-rc3/add-host-rewrite-header.yaml diff --git a/changelog/v1.17.0-rc3/add-host-rewrite-header.yaml b/changelog/v1.17.0-rc3/add-host-rewrite-header.yaml deleted file mode 100644 index 8550002ea6e..00000000000 --- a/changelog/v1.17.0-rc3/add-host-rewrite-header.yaml +++ /dev/null @@ -1,5 +0,0 @@ -changelog: -- type: NEW_FEATURE - issueLink: https://github.com/solo-io/gloo/issues/9579 - resolvesIssue: false - description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header From 15f65779dc4b4fe1072334e4bb3406fb189bf65c Mon Sep 17 00:00:00 2001 From: David Jumani Date: Thu, 13 Jun 2024 14:31:04 -0400 Subject: [PATCH 06/16] add validation --- pkg/utils/api_conversion/type.go | 10 ++-- .../gloo/pkg/plugins/basicroute/plugin.go | 5 ++ .../utils/headers/headers_suite_test.go | 13 +++++ .../pkg/plugins/utils/headers/validate.go | 20 ++++++++ .../plugins/utils/headers/validate_test.go | 50 +++++++++++++++++++ 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 projects/gloo/pkg/plugins/utils/headers/headers_suite_test.go create mode 100644 projects/gloo/pkg/plugins/utils/headers/validate.go create mode 100644 projects/gloo/pkg/plugins/utils/headers/validate_test.go diff --git a/pkg/utils/api_conversion/type.go b/pkg/utils/api_conversion/type.go index 454de372e33..34cc91d5ff1 100644 --- a/pkg/utils/api_conversion/type.go +++ b/pkg/utils/api_conversion/type.go @@ -7,6 +7,7 @@ import ( envoy_type_v3 "github.com/envoyproxy/go-control-plane/envoy/type/v3" envoytype_gloo "github.com/solo-io/gloo/projects/gloo/pkg/api/external/envoy/type" v1 "github.com/solo-io/gloo/projects/gloo/pkg/api/v1" + "github.com/solo-io/gloo/projects/gloo/pkg/plugins/utils/headers" envoycore_sk "github.com/solo-io/solo-kit/pkg/api/external/envoy/api/v2/core" "github.com/solo-io/solo-kit/pkg/errors" ) @@ -71,13 +72,14 @@ func ToEnvoyHeaderValueOptionList(option []*envoycore_sk.HeaderValueOption, secr return result, nil } -// CheckForbiddenCustomHeaders checks whether the custom header is allowed to be modified as per https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#custom-request-response-headers -func CheckForbiddenCustomHeaders(header envoycore_sk.HeaderValue) error { +// validateCustomHeaders checks whether the custom header is allowed to be modified as per https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#custom-request-response-headers +// and validates the whether the header will be accepted by envoy +func validateCustomHeaders(header envoycore_sk.HeaderValue) error { key := header.GetKey() if strings.HasPrefix(key, ":") || strings.ToLower(key) == "host" { return errors.Errorf(": -prefixed or host headers may not be modified. Received '%s' header", key) } - return nil + return headers.ValidateHeaderKey(key) } func ToEnvoyHeaderValueOptions(option *envoycore_sk.HeaderValueOption, secrets *v1.SecretList, secretOptions HeaderSecretOptions) ([]*envoy_config_core_v3.HeaderValueOption, error) { @@ -90,7 +92,7 @@ func ToEnvoyHeaderValueOptions(option *envoycore_sk.HeaderValueOption, secrets * switch typedOption := option.GetHeaderOption().(type) { case *envoycore_sk.HeaderValueOption_Header: - if err := CheckForbiddenCustomHeaders(*typedOption.Header); err != nil { + if err := validateCustomHeaders(*typedOption.Header); err != nil { return nil, err } return []*envoy_config_core_v3.HeaderValueOption{ diff --git a/projects/gloo/pkg/plugins/basicroute/plugin.go b/projects/gloo/pkg/plugins/basicroute/plugin.go index a9022983eae..b0330875754 100644 --- a/projects/gloo/pkg/plugins/basicroute/plugin.go +++ b/projects/gloo/pkg/plugins/basicroute/plugin.go @@ -12,6 +12,7 @@ import ( "github.com/solo-io/gloo/projects/gloo/pkg/api/v1/options/protocol_upgrade" "github.com/solo-io/gloo/projects/gloo/pkg/api/v1/options/retries" "github.com/solo-io/gloo/projects/gloo/pkg/plugins" + "github.com/solo-io/gloo/projects/gloo/pkg/plugins/utils/headers" "github.com/solo-io/gloo/projects/gloo/pkg/plugins/utils/upgradeconfig" "github.com/solo-io/gloo/projects/gloo/pkg/utils" "github.com/solo-io/solo-kit/pkg/errors" @@ -231,6 +232,10 @@ func applyHostRewrite(ctx context.Context, in *v1.Route, out *envoy_config_route AutoHostRewrite: rewriteType.AutoHostRewrite, } case *v1.RouteOptions_HostRewriteHeader: + err := headers.ValidateHeaderKey(rewriteType.HostRewriteHeader.GetValue()) + if err != nil { + return err + } routeAction.Route.HostRewriteSpecifier = &envoy_config_route_v3.RouteAction_HostRewriteHeader{ HostRewriteHeader: rewriteType.HostRewriteHeader.GetValue(), } diff --git a/projects/gloo/pkg/plugins/utils/headers/headers_suite_test.go b/projects/gloo/pkg/plugins/utils/headers/headers_suite_test.go new file mode 100644 index 00000000000..895e6446cc2 --- /dev/null +++ b/projects/gloo/pkg/plugins/utils/headers/headers_suite_test.go @@ -0,0 +1,13 @@ +package headers_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestHeaders(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Headers Suite") +} diff --git a/projects/gloo/pkg/plugins/utils/headers/validate.go b/projects/gloo/pkg/plugins/utils/headers/validate.go new file mode 100644 index 00000000000..cec05762a99 --- /dev/null +++ b/projects/gloo/pkg/plugins/utils/headers/validate.go @@ -0,0 +1,20 @@ +package headers + +import ( + "fmt" + "regexp" +) + +// ValidateHeaderKey checks whether a header is valid based on the RFC and envoy's regex to accept a header key +func ValidateHeaderKey(key string) error { + if len(key) == 0 { + return fmt.Errorf("empty HTTP header names are not allowed") + } + // check that header name is only valid ASCII characters + // https://github.com/envoyproxy/envoy/blob/b0f4332867267913d9aa80c5c0befda14a00d826/source/common/http/character_set_validation.h#L24-L35 + validHeaderRegex := regexp.MustCompile("^([a-zA-Z0-9!#$%&'*+.^_`|~-])+$") + if !validHeaderRegex.MatchString(key) { + return fmt.Errorf("'%s' is an invalid HTTP header key", key) + } + return nil +} diff --git a/projects/gloo/pkg/plugins/utils/headers/validate_test.go b/projects/gloo/pkg/plugins/utils/headers/validate_test.go new file mode 100644 index 00000000000..05179b0aecf --- /dev/null +++ b/projects/gloo/pkg/plugins/utils/headers/validate_test.go @@ -0,0 +1,50 @@ +package headers_test + +import ( + "fmt" + "unicode" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/solo-io/gloo/projects/gloo/pkg/plugins/utils/headers" +) + +var _ = Describe("Validate header keys", func() { + + generateInvalidEntries := func(character rune) []TableEntry { + var entries []TableEntry + entries = append(entries, Entry(fmt.Sprintf("just '%s'", string(character)), fmt.Sprintf("%s", string(character)), true)) + entries = append(entries, Entry(fmt.Sprintf("contains leading '%s'", string(character)), fmt.Sprintf("%sreserved", string(character)), true)) + entries = append(entries, Entry(fmt.Sprintf("contains trailing '%s'", string(character)), fmt.Sprintf("reserved%s", string(character)), true)) + entries = append(entries, Entry(fmt.Sprintf("contains '%s'", string(character)), fmt.Sprintf("rese%srved", string(character)), true)) + return entries + } + + DescribeTable("Validates header keys", func(key string, errored bool) { + Expect(headers.ValidateHeaderKey(key) != nil).To(Equal(errored)) + }, + generateInvalidEntries(':'), + generateInvalidEntries('"'), + generateInvalidEntries(' '), + generateInvalidEntries('('), + generateInvalidEntries(')'), + generateInvalidEntries(','), + generateInvalidEntries('/'), + generateInvalidEntries(':'), + generateInvalidEntries(';'), + generateInvalidEntries('<'), + generateInvalidEntries('='), + generateInvalidEntries('>'), + generateInvalidEntries('?'), + generateInvalidEntries('@'), + generateInvalidEntries('['), + generateInvalidEntries('\\'), + generateInvalidEntries(']'), + generateInvalidEntries('{'), + generateInvalidEntries('}'), + generateInvalidEntries('>'), + generateInvalidEntries(unicode.MaxASCII), + Entry("host header", "host", true), + Entry("valid header", "valid-header", false), + ) +}) From 6b87c5d79e9d03e0392c887520973e87b298c975 Mon Sep 17 00:00:00 2001 From: David Jumani Date: Thu, 13 Jun 2024 15:42:58 -0400 Subject: [PATCH 07/16] remove old entry --- projects/gloo/pkg/plugins/utils/headers/validate_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/projects/gloo/pkg/plugins/utils/headers/validate_test.go b/projects/gloo/pkg/plugins/utils/headers/validate_test.go index 05179b0aecf..bfbff6f9df9 100644 --- a/projects/gloo/pkg/plugins/utils/headers/validate_test.go +++ b/projects/gloo/pkg/plugins/utils/headers/validate_test.go @@ -44,7 +44,6 @@ var _ = Describe("Validate header keys", func() { generateInvalidEntries('}'), generateInvalidEntries('>'), generateInvalidEntries(unicode.MaxASCII), - Entry("host header", "host", true), Entry("valid header", "valid-header", false), ) }) From befe27f9814b89ce8de49209d88dfa76883aeaac Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 13 Jun 2024 19:51:17 +0000 Subject: [PATCH 08/16] Adding changelog file to new location --- changelog/v1.17.0-rc5/add-host-rewrite-header.yaml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 changelog/v1.17.0-rc5/add-host-rewrite-header.yaml diff --git a/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml b/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml new file mode 100644 index 00000000000..8550002ea6e --- /dev/null +++ b/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml @@ -0,0 +1,5 @@ +changelog: +- type: NEW_FEATURE + issueLink: https://github.com/solo-io/gloo/issues/9579 + resolvesIssue: false + description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header From 1405ca725eaa5724f9ef7860559a3c931e4537a6 Mon Sep 17 00:00:00 2001 From: changelog-bot Date: Thu, 13 Jun 2024 19:51:17 +0000 Subject: [PATCH 09/16] Deleting changelog file from old location --- changelog/v1.17.0-rc4/add-host-rewrite-header.yaml | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 changelog/v1.17.0-rc4/add-host-rewrite-header.yaml diff --git a/changelog/v1.17.0-rc4/add-host-rewrite-header.yaml b/changelog/v1.17.0-rc4/add-host-rewrite-header.yaml deleted file mode 100644 index 8550002ea6e..00000000000 --- a/changelog/v1.17.0-rc4/add-host-rewrite-header.yaml +++ /dev/null @@ -1,5 +0,0 @@ -changelog: -- type: NEW_FEATURE - issueLink: https://github.com/solo-io/gloo/issues/9579 - resolvesIssue: false - description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header From e3c58037961c185bc35f040b8a6070c43805095c Mon Sep 17 00:00:00 2001 From: David Jumani Date: Thu, 13 Jun 2024 21:31:23 -0400 Subject: [PATCH 10/16] dont remove exposed method --- pkg/utils/api_conversion/type.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/utils/api_conversion/type.go b/pkg/utils/api_conversion/type.go index 34cc91d5ff1..74a861ea29e 100644 --- a/pkg/utils/api_conversion/type.go +++ b/pkg/utils/api_conversion/type.go @@ -75,11 +75,19 @@ func ToEnvoyHeaderValueOptionList(option []*envoycore_sk.HeaderValueOption, secr // validateCustomHeaders checks whether the custom header is allowed to be modified as per https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#custom-request-response-headers // and validates the whether the header will be accepted by envoy func validateCustomHeaders(header envoycore_sk.HeaderValue) error { + if err := CheckForbiddenCustomHeaders(header); err != nil { + return err + } + return headers.ValidateHeaderKey(header.GetKey()) +} + +// CheckForbiddenCustomHeaders checks whether the custom header is allowed to be modified as per https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#custom-request-response-headers +func CheckForbiddenCustomHeaders(header envoycore_sk.HeaderValue) error { key := header.GetKey() if strings.HasPrefix(key, ":") || strings.ToLower(key) == "host" { return errors.Errorf(": -prefixed or host headers may not be modified. Received '%s' header", key) } - return headers.ValidateHeaderKey(key) + return nil } func ToEnvoyHeaderValueOptions(option *envoycore_sk.HeaderValueOption, secrets *v1.SecretList, secretOptions HeaderSecretOptions) ([]*envoy_config_core_v3.HeaderValueOption, error) { From bc97ef75d9c31d91b4b54e562194bd9a50ea457f Mon Sep 17 00:00:00 2001 From: David Jumani Date: Thu, 13 Jun 2024 21:31:58 -0400 Subject: [PATCH 11/16] update changelog --- changelog/v1.17.0-rc5/add-host-rewrite-header.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml b/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml index 8550002ea6e..621f99ecb90 100644 --- a/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml +++ b/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml @@ -2,4 +2,4 @@ changelog: - type: NEW_FEATURE issueLink: https://github.com/solo-io/gloo/issues/9579 resolvesIssue: false - description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header + description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header. Pay attention to the potential security implications of using this option. Provided header must come from trusted source. From e462319fb1b2a2ea1f8a2af0376c96240e70280e Mon Sep 17 00:00:00 2001 From: David Jumani Date: Thu, 13 Jun 2024 21:34:57 -0400 Subject: [PATCH 12/16] update changelog --- .../{v1.17.0-rc5 => v1.18.0-beta1}/add-host-rewrite-header.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename changelog/{v1.17.0-rc5 => v1.18.0-beta1}/add-host-rewrite-header.yaml (100%) diff --git a/changelog/v1.17.0-rc5/add-host-rewrite-header.yaml b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml similarity index 100% rename from changelog/v1.17.0-rc5/add-host-rewrite-header.yaml rename to changelog/v1.18.0-beta1/add-host-rewrite-header.yaml From 3b96f748f0debe56b1bc64a2ed674f0e549569e8 Mon Sep 17 00:00:00 2001 From: David Jumani Date: Fri, 14 Jun 2024 10:44:28 -0400 Subject: [PATCH 13/16] Update changelog/v1.18.0-beta1/add-host-rewrite-header.yaml Co-authored-by: Nathan Fudenberg --- changelog/v1.18.0-beta1/add-host-rewrite-header.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml index 621f99ecb90..d266fe2d708 100644 --- a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml +++ b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml @@ -2,4 +2,5 @@ changelog: - type: NEW_FEATURE issueLink: https://github.com/solo-io/gloo/issues/9579 resolvesIssue: false - description: Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header. Pay attention to the potential security implications of using this option. Provided header must come from trusted source. + description: >| + Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header. Pay attention to the potential security implications of using this option. Provided header must come from trusted source. From 37dbb3955dada4d2135f8f50cefa424cd3b49b0f Mon Sep 17 00:00:00 2001 From: David Jumani Date: Fri, 14 Jun 2024 10:49:56 -0400 Subject: [PATCH 14/16] update changelog --- changelog/v1.18.0-beta1/add-host-rewrite-header.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml index d266fe2d708..f9217931678 100644 --- a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml +++ b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml @@ -2,5 +2,10 @@ changelog: - type: NEW_FEATURE issueLink: https://github.com/solo-io/gloo/issues/9579 resolvesIssue: false - description: >| + description: >- Adds the `host_rewrite_header` to the route options to allow envoy to swapped the host header with the content of given downstream or custom header. Pay attention to the potential security implications of using this option. Provided header must come from trusted source. +- type: FIX + issueLink: https://github.com/solo-io/gloo/issues/9622 + resolvesIssue: true + description: >- + Header names are now validated according to RFC 9110, https://www.rfc-editor.org/rfc/rfc9110.html#section-5.1. If an invalid header name is passed, it is rejected From 6f61dffd3053c53eb39f32cfd35e37a862ceffae Mon Sep 17 00:00:00 2001 From: David Jumani Date: Fri, 14 Jun 2024 11:05:31 -0400 Subject: [PATCH 15/16] update changelog --- changelog/v1.18.0-beta1/add-host-rewrite-header.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml index f9217931678..ee1d7f9b8c3 100644 --- a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml +++ b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml @@ -8,4 +8,4 @@ changelog: issueLink: https://github.com/solo-io/gloo/issues/9622 resolvesIssue: true description: >- - Header names are now validated according to RFC 9110, https://www.rfc-editor.org/rfc/rfc9110.html#section-5.1. If an invalid header name is passed, it is rejected + Header names are now validated according to RFC 9110, https://www.rfc-editor.org/rfc/rfc9110.html#section-5.1. If a header name that consists of invalid characters is passed via the healthCheck or headerManipulation `requestHeadersToAdd`, it is rejected. From 7f5008bc65b51b4d9e546df7d35e758495dc0fd6 Mon Sep 17 00:00:00 2001 From: David Jumani Date: Fri, 14 Jun 2024 11:17:06 -0400 Subject: [PATCH 16/16] address comments --- changelog/v1.18.0-beta1/add-host-rewrite-header.yaml | 2 +- projects/gloo/pkg/plugins/utils/headers/validate.go | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml index ee1d7f9b8c3..a0333bf5495 100644 --- a/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml +++ b/changelog/v1.18.0-beta1/add-host-rewrite-header.yaml @@ -8,4 +8,4 @@ changelog: issueLink: https://github.com/solo-io/gloo/issues/9622 resolvesIssue: true description: >- - Header names are now validated according to RFC 9110, https://www.rfc-editor.org/rfc/rfc9110.html#section-5.1. If a header name that consists of invalid characters is passed via the healthCheck or headerManipulation `requestHeadersToAdd`, it is rejected. + Previously, header names consisting of invalid characters such as '()[]:;,<=>' were accepted when passed via the healthCheck or headerManipulation `requestHeadersToAdd` parameter. This resulted in envoy throwing an `invalid header name` error. Now, header names are validated according to RFC 9110, which is the same validation used by envoy. If a header name consisting of invalid characters is passed via the aforementioned parameters, it is caught and rejected in edge and does not propagate to envoy. diff --git a/projects/gloo/pkg/plugins/utils/headers/validate.go b/projects/gloo/pkg/plugins/utils/headers/validate.go index cec05762a99..b138de693d3 100644 --- a/projects/gloo/pkg/plugins/utils/headers/validate.go +++ b/projects/gloo/pkg/plugins/utils/headers/validate.go @@ -5,15 +5,18 @@ import ( "regexp" ) +var ( + // Regex to check that header names consists of only valid ASCII characters + // https://github.com/envoyproxy/envoy/blob/b0f4332867267913d9aa80c5c0befda14a00d826/source/common/http/character_set_validation.h#L24-L35 + validHeaderNameRegex = regexp.MustCompile("^([a-zA-Z0-9!#$%&'*+.^_`|~-])+$") +) + // ValidateHeaderKey checks whether a header is valid based on the RFC and envoy's regex to accept a header key func ValidateHeaderKey(key string) error { if len(key) == 0 { return fmt.Errorf("empty HTTP header names are not allowed") } - // check that header name is only valid ASCII characters - // https://github.com/envoyproxy/envoy/blob/b0f4332867267913d9aa80c5c0befda14a00d826/source/common/http/character_set_validation.h#L24-L35 - validHeaderRegex := regexp.MustCompile("^([a-zA-Z0-9!#$%&'*+.^_`|~-])+$") - if !validHeaderRegex.MatchString(key) { + if !validHeaderNameRegex.MatchString(key) { return fmt.Errorf("'%s' is an invalid HTTP header key", key) } return nil