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

Loading…
Cancel
Save