diff options
Diffstat (limited to 'grpc/src/core/lib/security/credentials/composite/composite_credentials.cc')
-rw-r--r-- | grpc/src/core/lib/security/credentials/composite/composite_credentials.cc | 114 |
1 files changed, 28 insertions, 86 deletions
diff --git a/grpc/src/core/lib/security/credentials/composite/composite_credentials.cc b/grpc/src/core/lib/security/credentials/composite/composite_credentials.cc index 5543ad1a..3a62f6f9 100644 --- a/grpc/src/core/lib/security/credentials/composite/composite_credentials.cc +++ b/grpc/src/core/lib/security/credentials/composite/composite_credentials.cc @@ -26,99 +26,42 @@ #include "absl/strings/str_cat.h" #include "absl/strings/str_join.h" -#include "src/core/lib/gprpp/ref_counted_ptr.h" -#include "src/core/lib/iomgr/polling_entity.h" -#include "src/core/lib/surface/api_trace.h" #include <grpc/support/alloc.h> #include <grpc/support/log.h> #include <grpc/support/string_util.h> -/* -- Composite call credentials. -- */ +#include "src/core/lib/gprpp/ref_counted_ptr.h" +#include "src/core/lib/iomgr/polling_entity.h" +#include "src/core/lib/promise/try_seq.h" +#include "src/core/lib/surface/api_trace.h" +#include "src/core/lib/transport/transport.h" -static void composite_call_metadata_cb(void* arg, grpc_error_handle error); - -namespace { -struct grpc_composite_call_credentials_metadata_context { - grpc_composite_call_credentials_metadata_context( - grpc_composite_call_credentials* composite_creds, - grpc_polling_entity* pollent, grpc_auth_metadata_context auth_md_context, - grpc_credentials_mdelem_array* md_array, - grpc_closure* on_request_metadata) - : composite_creds(composite_creds), - pollent(pollent), - auth_md_context(auth_md_context), - md_array(md_array), - on_request_metadata(on_request_metadata) { - GRPC_CLOSURE_INIT(&internal_on_request_metadata, composite_call_metadata_cb, - this, grpc_schedule_on_exec_ctx); - } +// +// grpc_composite_channel_credentials +// - grpc_composite_call_credentials* composite_creds; - size_t creds_index = 0; - grpc_polling_entity* pollent; - grpc_auth_metadata_context auth_md_context; - grpc_credentials_mdelem_array* md_array; - grpc_closure* on_request_metadata; - grpc_closure internal_on_request_metadata; -}; -} // namespace - -static void composite_call_metadata_cb(void* arg, grpc_error_handle error) { - grpc_composite_call_credentials_metadata_context* ctx = - static_cast<grpc_composite_call_credentials_metadata_context*>(arg); - if (error == GRPC_ERROR_NONE) { - const grpc_composite_call_credentials::CallCredentialsList& inner = - ctx->composite_creds->inner(); - /* See if we need to get some more metadata. */ - if (ctx->creds_index < inner.size()) { - if (inner[ctx->creds_index++]->get_request_metadata( - ctx->pollent, ctx->auth_md_context, ctx->md_array, - &ctx->internal_on_request_metadata, &error)) { - // Synchronous response, so call ourselves recursively. - composite_call_metadata_cb(arg, error); - GRPC_ERROR_UNREF(error); - } - return; - } - // We're done! - } - grpc_core::ExecCtx::Run(DEBUG_LOCATION, ctx->on_request_metadata, - GRPC_ERROR_REF(error)); - delete ctx; +const char* grpc_composite_channel_credentials::type() const { + return "Composite"; } -bool grpc_composite_call_credentials::get_request_metadata( - grpc_polling_entity* pollent, grpc_auth_metadata_context auth_md_context, - grpc_credentials_mdelem_array* md_array, grpc_closure* on_request_metadata, - grpc_error_handle* error) { - grpc_composite_call_credentials_metadata_context* ctx; - ctx = new grpc_composite_call_credentials_metadata_context( - this, pollent, auth_md_context, md_array, on_request_metadata); - bool synchronous = true; - const CallCredentialsList& inner = ctx->composite_creds->inner(); - while (ctx->creds_index < inner.size()) { - if (inner[ctx->creds_index++]->get_request_metadata( - ctx->pollent, ctx->auth_md_context, ctx->md_array, - &ctx->internal_on_request_metadata, error)) { - if (*error != GRPC_ERROR_NONE) break; - } else { - synchronous = false; // Async return. - break; - } - } - if (synchronous) delete ctx; - return synchronous; -} +/* -- Composite call credentials. -- */ -void grpc_composite_call_credentials::cancel_get_request_metadata( - grpc_credentials_mdelem_array* md_array, grpc_error_handle error) { - for (size_t i = 0; i < inner_.size(); ++i) { - inner_[i]->cancel_get_request_metadata(md_array, GRPC_ERROR_REF(error)); - } - GRPC_ERROR_UNREF(error); +grpc_core::ArenaPromise<absl::StatusOr<grpc_core::ClientMetadataHandle>> +grpc_composite_call_credentials::GetRequestMetadata( + grpc_core::ClientMetadataHandle initial_metadata, + const grpc_call_credentials::GetRequestMetadataArgs* args) { + auto self = Ref(); + return TrySeqIter( + inner_.begin(), inner_.end(), std::move(initial_metadata), + [self, args](const grpc_core::RefCountedPtr<grpc_call_credentials>& creds, + grpc_core::ClientMetadataHandle initial_metadata) { + return creds->GetRequestMetadata(std::move(initial_metadata), args); + }); } +const char* grpc_composite_call_credentials::Type() { return "Composite"; } + std::string grpc_composite_call_credentials::debug_string() { std::vector<std::string> outputs; for (auto& inner_cred : inner_) { @@ -146,18 +89,17 @@ void grpc_composite_call_credentials::push_to_inner( auto composite_creds = static_cast<grpc_composite_call_credentials*>(creds.get()); for (size_t i = 0; i < composite_creds->inner().size(); ++i) { - inner_.push_back(std::move(composite_creds->inner_[i])); + inner_.push_back(composite_creds->inner_[i]); } } grpc_composite_call_credentials::grpc_composite_call_credentials( grpc_core::RefCountedPtr<grpc_call_credentials> creds1, - grpc_core::RefCountedPtr<grpc_call_credentials> creds2) - : grpc_call_credentials(GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE) { + grpc_core::RefCountedPtr<grpc_call_credentials> creds2) { const bool creds1_is_composite = - strcmp(creds1->type(), GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE) == 0; + creds1->type() == grpc_composite_call_credentials::Type(); const bool creds2_is_composite = - strcmp(creds2->type(), GRPC_CALL_CREDENTIALS_TYPE_COMPOSITE) == 0; + creds2->type() == grpc_composite_call_credentials::Type(); const size_t size = get_creds_array_size(creds1.get(), creds1_is_composite) + get_creds_array_size(creds2.get(), creds2_is_composite); inner_.reserve(size); |