aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/client_config/resolver_registry.c
diff options
context:
space:
mode:
authorGravatar Alistair Veitch <aveitch@google.com>2015-08-28 14:35:49 -0700
committerGravatar Alistair Veitch <aveitch@google.com>2015-08-28 14:35:49 -0700
commitbff9cf52ed6407862ce96ddfdcd8e97e56cdc520 (patch)
treeadcefb4d7740776b4e44a57336308c31dc0ef099 /src/core/client_config/resolver_registry.c
parent6afe53f2360a20a4d3abda60cfdde576c29b9857 (diff)
parent808e5ae95f2fba44d2da925e8da0eaa5ce5c6585 (diff)
Merge branch 'master' into tracing_api
Diffstat (limited to 'src/core/client_config/resolver_registry.c')
-rw-r--r--src/core/client_config/resolver_registry.c91
1 files changed, 50 insertions, 41 deletions
diff --git a/src/core/client_config/resolver_registry.c b/src/core/client_config/resolver_registry.c
index 16be2da994..37979b3b86 100644
--- a/src/core/client_config/resolver_registry.c
+++ b/src/core/client_config/resolver_registry.c
@@ -41,41 +41,33 @@
#define MAX_RESOLVERS 10
-typedef struct {
- char *scheme;
- grpc_resolver_factory *factory;
-} registered_resolver;
-
-static registered_resolver g_all_of_the_resolvers[MAX_RESOLVERS];
+static grpc_resolver_factory *g_all_of_the_resolvers[MAX_RESOLVERS];
static int g_number_of_resolvers = 0;
-static char *g_default_resolver_scheme;
+static char *g_default_resolver_prefix;
-void grpc_resolver_registry_init(const char *default_resolver_scheme) {
+void grpc_resolver_registry_init(const char *default_resolver_prefix) {
g_number_of_resolvers = 0;
- g_default_resolver_scheme = gpr_strdup(default_resolver_scheme);
+ g_default_resolver_prefix = gpr_strdup(default_resolver_prefix);
}
void grpc_resolver_registry_shutdown(void) {
int i;
for (i = 0; i < g_number_of_resolvers; i++) {
- gpr_free(g_all_of_the_resolvers[i].scheme);
- grpc_resolver_factory_unref(g_all_of_the_resolvers[i].factory);
+ grpc_resolver_factory_unref(g_all_of_the_resolvers[i]);
}
- gpr_free(g_default_resolver_scheme);
+ gpr_free(g_default_resolver_prefix);
}
-void grpc_register_resolver_type(const char *scheme,
- grpc_resolver_factory *factory) {
+void grpc_register_resolver_type(grpc_resolver_factory *factory) {
int i;
for (i = 0; i < g_number_of_resolvers; i++) {
- GPR_ASSERT(0 != strcmp(scheme, g_all_of_the_resolvers[i].scheme));
+ GPR_ASSERT(0 != strcmp(factory->vtable->scheme,
+ g_all_of_the_resolvers[i]->vtable->scheme));
}
GPR_ASSERT(g_number_of_resolvers != MAX_RESOLVERS);
- g_all_of_the_resolvers[g_number_of_resolvers].scheme = gpr_strdup(scheme);
grpc_resolver_factory_ref(factory);
- g_all_of_the_resolvers[g_number_of_resolvers].factory = factory;
- g_number_of_resolvers++;
+ g_all_of_the_resolvers[g_number_of_resolvers++] = factory;
}
static grpc_resolver_factory *lookup_factory(grpc_uri *uri) {
@@ -85,40 +77,57 @@ static grpc_resolver_factory *lookup_factory(grpc_uri *uri) {
if (!uri) return NULL;
for (i = 0; i < g_number_of_resolvers; i++) {
- if (0 == strcmp(uri->scheme, g_all_of_the_resolvers[i].scheme)) {
- return g_all_of_the_resolvers[i].factory;
+ if (0 == strcmp(uri->scheme, g_all_of_the_resolvers[i]->vtable->scheme)) {
+ return g_all_of_the_resolvers[i];
}
}
return NULL;
}
-grpc_resolver *grpc_resolver_create(
- const char *name, grpc_subchannel_factory *subchannel_factory) {
- grpc_uri *uri;
+static grpc_resolver_factory *resolve_factory(const char *target,
+ grpc_uri **uri) {
char *tmp;
grpc_resolver_factory *factory = NULL;
- grpc_resolver *resolver;
-
- uri = grpc_uri_parse(name, 1);
- factory = lookup_factory(uri);
- if (factory == NULL && g_default_resolver_scheme != NULL) {
- grpc_uri_destroy(uri);
- gpr_asprintf(&tmp, "%s%s", g_default_resolver_scheme, name);
- uri = grpc_uri_parse(tmp, 1);
- factory = lookup_factory(uri);
- if (factory == NULL) {
- grpc_uri_destroy(grpc_uri_parse(name, 0));
- grpc_uri_destroy(grpc_uri_parse(tmp, 0));
- gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", name, tmp);
+
+ GPR_ASSERT(uri != NULL);
+ *uri = grpc_uri_parse(target, 1);
+ factory = lookup_factory(*uri);
+ if (factory == NULL) {
+ if (g_default_resolver_prefix != NULL) {
+ grpc_uri_destroy(*uri);
+ gpr_asprintf(&tmp, "%s%s", g_default_resolver_prefix, target);
+ *uri = grpc_uri_parse(tmp, 1);
+ factory = lookup_factory(*uri);
+ if (factory == NULL) {
+ grpc_uri_destroy(grpc_uri_parse(target, 0));
+ grpc_uri_destroy(grpc_uri_parse(tmp, 0));
+ gpr_log(GPR_ERROR, "don't know how to resolve '%s' or '%s'", target,
+ tmp);
+ }
+ gpr_free(tmp);
+ } else {
+ grpc_uri_destroy(grpc_uri_parse(target, 0));
+ gpr_log(GPR_ERROR, "don't know how to resolve '%s'", target);
}
- gpr_free(tmp);
- } else if (factory == NULL) {
- grpc_uri_destroy(grpc_uri_parse(name, 0));
- gpr_log(GPR_ERROR, "don't know how to resolve '%s'", name);
}
- resolver =
+ return factory;
+}
+
+grpc_resolver *grpc_resolver_create(
+ const char *target, grpc_subchannel_factory *subchannel_factory) {
+ grpc_uri *uri = NULL;
+ grpc_resolver_factory *factory = resolve_factory(target, &uri);
+ grpc_resolver *resolver =
grpc_resolver_factory_create_resolver(factory, uri, subchannel_factory);
grpc_uri_destroy(uri);
return resolver;
}
+
+char *grpc_get_default_authority(const char *target) {
+ grpc_uri *uri = NULL;
+ grpc_resolver_factory *factory = resolve_factory(target, &uri);
+ char *authority = grpc_resolver_factory_get_default_authority(factory, uri);
+ grpc_uri_destroy(uri);
+ return authority;
+}