Fix cronet for new metadata interfaces

reviewable/pr8842/r2
Craig Tiller 8 years ago
parent 5efdf3ca26
commit 35e3491542
  1. 47
      src/core/ext/transport/cronet/transport/cronet_transport.c

@ -44,6 +44,8 @@
#include "src/core/ext/transport/chttp2/transport/incoming_metadata.h" #include "src/core/ext/transport/chttp2/transport/incoming_metadata.h"
#include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/endpoint.h"
#include "src/core/lib/iomgr/exec_ctx.h" #include "src/core/lib/iomgr/exec_ctx.h"
#include "src/core/lib/slice/slice_internal.h"
#include "src/core/lib/slice/slice_string_helpers.h"
#include "src/core/lib/support/string.h" #include "src/core/lib/support/string.h"
#include "src/core/lib/surface/channel.h" #include "src/core/lib/surface/channel.h"
#include "src/core/lib/transport/metadata_batch.h" #include "src/core/lib/transport/metadata_batch.h"
@ -429,9 +431,11 @@ static void on_response_headers_received(
for (size_t i = 0; i < headers->count; i++) { for (size_t i = 0; i < headers->count; i++) {
grpc_chttp2_incoming_metadata_buffer_add( grpc_chttp2_incoming_metadata_buffer_add(
&s->state.rs.initial_metadata, &s->state.rs.initial_metadata,
grpc_mdelem_from_metadata_strings( grpc_mdelem_from_slices(
&exec_ctx, grpc_mdstr_from_string(headers->headers[i].key), &exec_ctx, grpc_slice_intern(grpc_slice_from_static_string(
grpc_mdstr_from_string(headers->headers[i].value))); headers->headers[i].key)),
grpc_slice_intern(
grpc_slice_from_static_string(headers->headers[i].value))));
} }
s->state.state_callback_received[OP_RECV_INITIAL_METADATA] = true; s->state.state_callback_received[OP_RECV_INITIAL_METADATA] = true;
gpr_mu_unlock(&s->mu); gpr_mu_unlock(&s->mu);
@ -507,9 +511,11 @@ static void on_response_trailers_received(
trailers->headers[i].value); trailers->headers[i].value);
grpc_chttp2_incoming_metadata_buffer_add( grpc_chttp2_incoming_metadata_buffer_add(
&s->state.rs.trailing_metadata, &s->state.rs.trailing_metadata,
grpc_mdelem_from_metadata_strings( grpc_mdelem_from_slices(
&exec_ctx, grpc_mdstr_from_string(trailers->headers[i].key), &exec_ctx, grpc_slice_intern(grpc_slice_from_static_string(
grpc_mdstr_from_string(trailers->headers[i].value))); trailers->headers[i].key)),
grpc_slice_intern(
grpc_slice_from_static_string(trailers->headers[i].value))));
s->state.rs.trailing_metadata_valid = true; s->state.rs.trailing_metadata_valid = true;
} }
s->state.state_callback_received[OP_RECV_TRAILING_METADATA] = true; s->state.state_callback_received[OP_RECV_TRAILING_METADATA] = true;
@ -573,31 +579,39 @@ static void convert_metadata_to_cronet_headers(
while (num_headers < num_headers_available) { while (num_headers < num_headers_available) {
grpc_mdelem mdelem = curr->md; grpc_mdelem mdelem = curr->md;
curr = curr->next; curr = curr->next;
const char *key = grpc_mdstr_as_c_string(mdelem->key); char *key = grpc_dump_slice(GRPC_MDKEY(mdelem), GPR_DUMP_ASCII);
const char *value = grpc_mdstr_as_c_string(mdelem->value); char *value = grpc_dump_slice(GRPC_MDVALUE(mdelem), GPR_DUMP_ASCII);
if (mdelem->key == GRPC_MDSTR_SCHEME || if (grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_SCHEME) ||
mdelem->key == GRPC_MDSTR_AUTHORITY) { grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_AUTHORITY)) {
/* Cronet populates these fields on its own */ /* Cronet populates these fields on its own */
gpr_free(key);
gpr_free(value);
continue; continue;
} }
if (mdelem->key == GRPC_MDSTR_METHOD) { if (grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_METHOD)) {
if (mdelem->value == GRPC_MDSTR_PUT) { if (grpc_slice_eq(GRPC_MDVALUE(mdelem), GRPC_MDSTR_PUT)) {
*method = "PUT"; *method = "PUT";
} else { } else {
/* POST method in default*/ /* POST method in default*/
*method = "POST"; *method = "POST";
} }
gpr_free(key);
gpr_free(value);
continue; continue;
} }
if (mdelem->key == GRPC_MDSTR_PATH) { if (grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_PATH)) {
/* Create URL by appending :path value to the hostname */ /* Create URL by appending :path value to the hostname */
gpr_asprintf(pp_url, "https://%s%s", host, value); gpr_asprintf(pp_url, "https://%s%s", host, value);
gpr_free(key);
gpr_free(value);
continue; continue;
} }
CRONET_LOG(GPR_DEBUG, "header %s = %s", key, value); CRONET_LOG(GPR_DEBUG, "header %s = %s", key, value);
headers[num_headers].key = key; headers[num_headers].key = key;
headers[num_headers].value = value; headers[num_headers].value = value;
num_headers++; num_headers++;
gpr_free(key);
gpr_free(value);
if (curr == NULL) { if (curr == NULL) {
break; break;
} }
@ -617,7 +631,7 @@ static int parse_grpc_header(const uint8_t *data) {
static bool header_has_authority(grpc_linked_mdelem *head) { static bool header_has_authority(grpc_linked_mdelem *head) {
while (head != NULL) { while (head != NULL) {
if (head->md->key == GRPC_MDSTR_AUTHORITY) { if (grpc_slice_eq(GRPC_MDKEY(head->md), GRPC_MDSTR_AUTHORITY)) {
return true; return true;
} }
head = head->next; head = head->next;
@ -818,7 +832,8 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx,
GRPC_ERROR_CANCELLED, NULL); GRPC_ERROR_CANCELLED, NULL);
} else { } else {
grpc_chttp2_incoming_metadata_buffer_publish( grpc_chttp2_incoming_metadata_buffer_publish(
&oas->s->state.rs.initial_metadata, stream_op->recv_initial_metadata); exec_ctx, &oas->s->state.rs.initial_metadata,
stream_op->recv_initial_metadata);
grpc_exec_ctx_sched(exec_ctx, stream_op->recv_initial_metadata_ready, grpc_exec_ctx_sched(exec_ctx, stream_op->recv_initial_metadata_ready,
GRPC_ERROR_NONE, NULL); GRPC_ERROR_NONE, NULL);
} }
@ -962,7 +977,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx,
CRONET_LOG(GPR_DEBUG, "running: %p OP_RECV_TRAILING_METADATA", oas); CRONET_LOG(GPR_DEBUG, "running: %p OP_RECV_TRAILING_METADATA", oas);
if (oas->s->state.rs.trailing_metadata_valid) { if (oas->s->state.rs.trailing_metadata_valid) {
grpc_chttp2_incoming_metadata_buffer_publish( grpc_chttp2_incoming_metadata_buffer_publish(
&oas->s->state.rs.trailing_metadata, exec_ctx, &oas->s->state.rs.trailing_metadata,
stream_op->recv_trailing_metadata); stream_op->recv_trailing_metadata);
stream_state->rs.trailing_metadata_valid = false; stream_state->rs.trailing_metadata_valid = false;
} }

Loading…
Cancel
Save