pull/35418/head
Craig Tiller 1 year ago
parent 2c18d16475
commit ae131d8164
  1. 42
      src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc

@ -54,7 +54,8 @@ namespace grpc_core {
namespace {
class ServiceConfigChannelArgFilter : public ChannelFilter {
class ServiceConfigChannelArgFilter
: public ImplementChannelFilter<ServiceConfigChannelArgFilter> {
public:
static absl::StatusOr<ServiceConfigChannelArgFilter> Create(
const ChannelArgs& args, ChannelFilter::Args) {
@ -74,28 +75,43 @@ class ServiceConfigChannelArgFilter : public ChannelFilter {
}
}
// Construct a promise for one call.
ArenaPromise<ServerMetadataHandle> MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) override;
class Call {
public:
void OnClientInitialMetadata(ClientMetadata& md,
ServiceConfigChannelArgFilter* filter);
static const NoInterceptor OnServerInitialMetadata;
static const NoInterceptor OnServerTrailingMetadata;
static const NoInterceptor OnClientToServerMessage;
static const NoInterceptor OnServerToClientMessage;
static const NoInterceptor OnFinalize;
};
private:
RefCountedPtr<ServiceConfig> service_config_;
};
ArenaPromise<ServerMetadataHandle>
ServiceConfigChannelArgFilter::MakeCallPromise(
CallArgs call_args, NextPromiseFactory next_promise_factory) {
const NoInterceptor
ServiceConfigChannelArgFilter::Call::OnServerInitialMetadata;
const NoInterceptor
ServiceConfigChannelArgFilter::Call::OnServerTrailingMetadata;
const NoInterceptor
ServiceConfigChannelArgFilter::Call::OnClientToServerMessage;
const NoInterceptor
ServiceConfigChannelArgFilter::Call::OnServerToClientMessage;
const NoInterceptor ServiceConfigChannelArgFilter::Call::OnFinalize;
void ServiceConfigChannelArgFilter::Call::OnClientInitialMetadata(
ClientMetadata& md, ServiceConfigChannelArgFilter* filter) {
const ServiceConfigParser::ParsedConfigVector* method_configs = nullptr;
if (service_config_ != nullptr) {
method_configs = service_config_->GetMethodParsedConfigVector(
call_args.client_initial_metadata->get_pointer(HttpPathMetadata())
->c_slice());
if (filter->service_config_ != nullptr) {
method_configs = filter->service_config_->GetMethodParsedConfigVector(
md.get_pointer(HttpPathMetadata())->c_slice());
}
auto* arena = GetContext<Arena>();
auto* service_config_call_data = arena->New<ServiceConfigCallData>(
arena, GetContext<grpc_call_context_element>());
service_config_call_data->SetServiceConfig(service_config_, method_configs);
return next_promise_factory(std::move(call_args));
service_config_call_data->SetServiceConfig(filter->service_config_,
method_configs);
}
const grpc_channel_filter kServiceConfigChannelArgFilter =

Loading…
Cancel
Save