static void composite_metadata_cb(void *user_data, grpc_credentials_md *md_elems, size_t num_md, grpc_credentials_status status) { grpc_composite_credentials_metadata_context *ctx = (grpc_composite_credentials_metadata_context *)user_data; if (status != GRPC_CREDENTIALS_OK) { ctx->cb(ctx->user_data, NULL, 0, status); return; } /* Copy the metadata in the context. */ if (num_md > 0) { size_t i; for (i = 0; i < num_md; i++) { grpc_credentials_md_store_add(ctx->md_elems, md_elems[i].key, md_elems[i].value); } } /* See if we need to get some more metadata. */ while (ctx->creds_index < ctx->composite_creds->inner.num_creds) { grpc_credentials *inner_creds = ctx->composite_creds->inner.creds_array[ctx->creds_index++]; if (grpc_credentials_has_request_metadata(inner_creds)) { grpc_credentials_get_request_metadata(inner_creds, ctx->service_url, composite_metadata_cb, ctx); return; } } /* We're done!. */ ctx->cb(ctx->user_data, ctx->md_elems->entries, ctx->md_elems->num_entries, GRPC_CREDENTIALS_OK); composite_md_context_destroy(ctx); }
static void composite_metadata_cb(void *user_data, grpc_mdelem **md_elems, size_t num_md, grpc_credentials_status status) { grpc_composite_credentials_metadata_context *ctx = (grpc_composite_credentials_metadata_context *)user_data; size_t i; if (status != GRPC_CREDENTIALS_OK) { ctx->cb(ctx->user_data, NULL, 0, status); return; } /* Copy the metadata in the context. */ if (num_md > 0) { ctx->md_elems = gpr_realloc(ctx->md_elems, (ctx->num_md + num_md) * sizeof(grpc_mdelem *)); for (i = 0; i < num_md; i++) { ctx->md_elems[i + ctx->num_md] = grpc_mdelem_ref(md_elems[i]); } ctx->num_md += num_md; } /* See if we need to get some more metadata. */ while (ctx->creds_index < ctx->composite_creds->inner.num_creds) { grpc_credentials *inner_creds = ctx->composite_creds->inner.creds_array[ctx->creds_index++]; if (grpc_credentials_has_request_metadata(inner_creds)) { grpc_credentials_get_request_metadata(inner_creds, ctx->service_url, composite_metadata_cb, ctx); return; } } /* We're done!. */ ctx->cb(ctx->user_data, ctx->md_elems, ctx->num_md, GRPC_CREDENTIALS_OK); composite_md_context_destroy(ctx); }