Use "host" header field if ":authority" is not present

":authority" is not mandatory in HTTP/2 unless request method is
"CONNECT".  If ":authority" is not present, server should look for
"host" header field.  This patch does not check method value, it is a
future TODO.  This is a first step for GH-1022.
pull/1025/head
Tatsuhiro Tsujikawa 10 years ago
parent c3be769409
commit 229000fd2b
  1. 19
      src/core/channel/http_server_filter.c

@ -66,6 +66,10 @@ typedef struct channel_data {
grpc_mdelem *status_ok; grpc_mdelem *status_ok;
grpc_mdelem *status_not_found; grpc_mdelem *status_not_found;
grpc_mdstr *path_key; grpc_mdstr *path_key;
grpc_mdstr *authority_key;
grpc_mdstr *host_key;
grpc_mdctx *mdctx;
size_t gettable_count; size_t gettable_count;
gettable *gettables; gettable *gettables;
@ -181,6 +185,15 @@ static void call_op(grpc_call_element *elem, grpc_call_element *from_elem,
} }
calld->path = op->data.metadata; calld->path = op->data.metadata;
op->done_cb(op->user_data, GRPC_OP_OK); op->done_cb(op->user_data, GRPC_OP_OK);
} else if (op->data.metadata->key == channeld->host_key) {
/* translate host to :authority since :authority may be
omitted */
grpc_mdelem *authority = grpc_mdelem_from_metadata_strings(
channeld->mdctx, channeld->authority_key, op->data.metadata->value);
grpc_mdelem_unref(op->data.metadata);
op->data.metadata = authority;
/* pass the event up */
grpc_call_next_op(elem, op);
} else { } else {
/* pass the event up */ /* pass the event up */
grpc_call_next_op(elem, op); grpc_call_next_op(elem, op);
@ -305,9 +318,13 @@ static void init_channel_elem(grpc_channel_element *elem,
channeld->https_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "https"); channeld->https_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "https");
channeld->grpc_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "grpc"); channeld->grpc_scheme = grpc_mdelem_from_strings(mdctx, ":scheme", "grpc");
channeld->path_key = grpc_mdstr_from_string(mdctx, ":path"); channeld->path_key = grpc_mdstr_from_string(mdctx, ":path");
channeld->authority_key = grpc_mdstr_from_string(mdctx, ":authority");
channeld->host_key = grpc_mdstr_from_string(mdctx, "host");
channeld->content_type = channeld->content_type =
grpc_mdelem_from_strings(mdctx, "content-type", "application/grpc"); grpc_mdelem_from_strings(mdctx, "content-type", "application/grpc");
channeld->mdctx = mdctx;
/* initialize http download support */ /* initialize http download support */
channeld->gettable_count = 0; channeld->gettable_count = 0;
channeld->gettables = NULL; channeld->gettables = NULL;
@ -357,6 +374,8 @@ static void destroy_channel_elem(grpc_channel_element *elem) {
grpc_mdelem_unref(channeld->grpc_scheme); grpc_mdelem_unref(channeld->grpc_scheme);
grpc_mdelem_unref(channeld->content_type); grpc_mdelem_unref(channeld->content_type);
grpc_mdstr_unref(channeld->path_key); grpc_mdstr_unref(channeld->path_key);
grpc_mdstr_unref(channeld->authority_key);
grpc_mdstr_unref(channeld->host_key);
} }
const grpc_channel_filter grpc_http_server_filter = { const grpc_channel_filter grpc_http_server_filter = {

Loading…
Cancel
Save