aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/surface
diff options
context:
space:
mode:
authorGravatar Craig Tiller <ctiller@google.com>2015-08-24 10:36:39 -0700
committerGravatar Craig Tiller <ctiller@google.com>2015-08-24 10:36:39 -0700
commitbc85be10ef420f35d660bc12afb47580acec3143 (patch)
tree948df90dcff7638f518b1b376cd33ebbe776651c /src/core/surface
parent03d281ab1b59185959afff7621d69a9b77387cfa (diff)
Refactor default host name resolution
Rephrase API's such that resolvers are constrained to be able to provide a default host given just the text of the URI channel target. This avoids needing to rewrite such details in the core library during retries, and generally makes things much saner to debug.
Diffstat (limited to 'src/core/surface')
-rw-r--r--src/core/surface/channel.c24
-rw-r--r--src/core/surface/init.c8
2 files changed, 28 insertions, 4 deletions
diff --git a/src/core/surface/channel.c b/src/core/surface/channel.c
index e50251566d..7378929ca4 100644
--- a/src/core/surface/channel.c
+++ b/src/core/surface/channel.c
@@ -40,6 +40,7 @@
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
+#include "src/core/client_config/resolver_registry.h"
#include "src/core/iomgr/iomgr.h"
#include "src/core/support/string.h"
#include "src/core/surface/call.h"
@@ -70,6 +71,7 @@ struct grpc_channel {
grpc_mdstr *grpc_message_string;
grpc_mdstr *path_string;
grpc_mdstr *authority_string;
+ grpc_mdelem *default_authority;
/** mdelem for grpc-status: 0 thru grpc-status: 2 */
grpc_mdelem *grpc_status_elem[NUM_CACHED_STATUS_ELEMS];
@@ -134,10 +136,27 @@ grpc_channel *grpc_channel_create_from_filters(
} else {
channel->max_message_length = args->args[i].value.integer;
}
+ } else if (0 == strcmp(args->args[i].key, GRPC_ARG_DEFAULT_AUTHORITY)) {
+ if (args->args[i].type != GRPC_ARG_STRING) {
+ gpr_log(GPR_ERROR, "%s: must be an string",
+ GRPC_ARG_DEFAULT_AUTHORITY);
+ } else {
+ channel->default_authority = grpc_mdelem_from_strings(
+ mdctx, ":authority", args->args[i].value.string);
+ }
}
}
}
+ if (channel->is_client && channel->default_authority == NULL) {
+ char *default_authority = grpc_get_default_authority(target);
+ if (default_authority) {
+ channel->default_authority = grpc_mdelem_from_strings(
+ channel->metadata_context, ":authority", default_authority);
+ }
+ gpr_free(default_authority);
+ }
+
grpc_channel_stack_init(filters, num_filters, channel, args,
channel->metadata_context,
CHANNEL_STACK_FROM_CHANNEL(channel));
@@ -161,6 +180,8 @@ static grpc_call *grpc_channel_create_call_internal(
send_metadata[num_metadata++] = path_mdelem;
if (authority_mdelem != NULL) {
send_metadata[num_metadata++] = authority_mdelem;
+ } else if (channel->default_authority != NULL) {
+ send_metadata[num_metadata++] = GRPC_MDELEM_REF(channel->default_authority);
}
return grpc_call_create(channel, parent_call, propagation_mask, cq, NULL,
@@ -251,6 +272,9 @@ static void destroy_channel(void *p, int ok) {
}
gpr_free(rc);
}
+ if (channel->default_authority != NULL) {
+ GRPC_MDELEM_UNREF(channel->default_authority);
+ }
grpc_mdctx_unref(channel->metadata_context);
gpr_mu_destroy(&channel->registered_call_mu);
gpr_free(channel->target);
diff --git a/src/core/surface/init.c b/src/core/surface/init.c
index d9044549f2..0d48cd42d7 100644
--- a/src/core/surface/init.c
+++ b/src/core/surface/init.c
@@ -86,11 +86,11 @@ void grpc_init(void) {
if (++g_initializations == 1) {
gpr_time_init();
grpc_resolver_registry_init("dns:///");
- grpc_register_resolver_type("dns", grpc_dns_resolver_factory_create());
- grpc_register_resolver_type("ipv4", grpc_ipv4_resolver_factory_create());
- grpc_register_resolver_type("ipv6", grpc_ipv6_resolver_factory_create());
+ grpc_register_resolver_type(grpc_dns_resolver_factory_create());
+ grpc_register_resolver_type(grpc_ipv4_resolver_factory_create());
+ grpc_register_resolver_type(grpc_ipv6_resolver_factory_create());
#ifdef GPR_POSIX_SOCKET
- grpc_register_resolver_type("unix", grpc_unix_resolver_factory_create());
+ grpc_register_resolver_type(grpc_unix_resolver_factory_create());
#endif
grpc_register_tracer("channel", &grpc_trace_channel);
grpc_register_tracer("surface", &grpc_surface_trace);