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