summaryrefslogtreecommitdiff
path: root/grpc/src/core/lib/security/credentials/composite/composite_credentials.cc
diff options
context:
space:
mode:
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.cc114
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);