|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|