|
|
|
@ -44,6 +44,8 @@ |
|
|
|
|
#include "src/core/ext/transport/chttp2/transport/incoming_metadata.h" |
|
|
|
|
#include "src/core/lib/iomgr/endpoint.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/surface/channel.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++) { |
|
|
|
|
grpc_chttp2_incoming_metadata_buffer_add( |
|
|
|
|
&s->state.rs.initial_metadata, |
|
|
|
|
grpc_mdelem_from_metadata_strings( |
|
|
|
|
&exec_ctx, grpc_mdstr_from_string(headers->headers[i].key), |
|
|
|
|
grpc_mdstr_from_string(headers->headers[i].value))); |
|
|
|
|
grpc_mdelem_from_slices( |
|
|
|
|
&exec_ctx, grpc_slice_intern(grpc_slice_from_static_string( |
|
|
|
|
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; |
|
|
|
|
gpr_mu_unlock(&s->mu); |
|
|
|
@ -507,9 +511,11 @@ static void on_response_trailers_received( |
|
|
|
|
trailers->headers[i].value); |
|
|
|
|
grpc_chttp2_incoming_metadata_buffer_add( |
|
|
|
|
&s->state.rs.trailing_metadata, |
|
|
|
|
grpc_mdelem_from_metadata_strings( |
|
|
|
|
&exec_ctx, grpc_mdstr_from_string(trailers->headers[i].key), |
|
|
|
|
grpc_mdstr_from_string(trailers->headers[i].value))); |
|
|
|
|
grpc_mdelem_from_slices( |
|
|
|
|
&exec_ctx, grpc_slice_intern(grpc_slice_from_static_string( |
|
|
|
|
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.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) { |
|
|
|
|
grpc_mdelem mdelem = curr->md; |
|
|
|
|
curr = curr->next; |
|
|
|
|
const char *key = grpc_mdstr_as_c_string(mdelem->key); |
|
|
|
|
const char *value = grpc_mdstr_as_c_string(mdelem->value); |
|
|
|
|
if (mdelem->key == GRPC_MDSTR_SCHEME || |
|
|
|
|
mdelem->key == GRPC_MDSTR_AUTHORITY) { |
|
|
|
|
char *key = grpc_dump_slice(GRPC_MDKEY(mdelem), GPR_DUMP_ASCII); |
|
|
|
|
char *value = grpc_dump_slice(GRPC_MDVALUE(mdelem), GPR_DUMP_ASCII); |
|
|
|
|
if (grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_SCHEME) || |
|
|
|
|
grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_AUTHORITY)) { |
|
|
|
|
/* Cronet populates these fields on its own */ |
|
|
|
|
gpr_free(key); |
|
|
|
|
gpr_free(value); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
if (mdelem->key == GRPC_MDSTR_METHOD) { |
|
|
|
|
if (mdelem->value == GRPC_MDSTR_PUT) { |
|
|
|
|
if (grpc_slice_eq(GRPC_MDKEY(mdelem), GRPC_MDSTR_METHOD)) { |
|
|
|
|
if (grpc_slice_eq(GRPC_MDVALUE(mdelem), GRPC_MDSTR_PUT)) { |
|
|
|
|
*method = "PUT"; |
|
|
|
|
} else { |
|
|
|
|
/* POST method in default*/ |
|
|
|
|
*method = "POST"; |
|
|
|
|
} |
|
|
|
|
gpr_free(key); |
|
|
|
|
gpr_free(value); |
|
|
|
|
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 */ |
|
|
|
|
gpr_asprintf(pp_url, "https://%s%s", host, value); |
|
|
|
|
gpr_free(key); |
|
|
|
|
gpr_free(value); |
|
|
|
|
continue; |
|
|
|
|
} |
|
|
|
|
CRONET_LOG(GPR_DEBUG, "header %s = %s", key, value); |
|
|
|
|
headers[num_headers].key = key; |
|
|
|
|
headers[num_headers].value = value; |
|
|
|
|
num_headers++; |
|
|
|
|
gpr_free(key); |
|
|
|
|
gpr_free(value); |
|
|
|
|
if (curr == NULL) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
@ -617,7 +631,7 @@ static int parse_grpc_header(const uint8_t *data) { |
|
|
|
|
|
|
|
|
|
static bool header_has_authority(grpc_linked_mdelem *head) { |
|
|
|
|
while (head != NULL) { |
|
|
|
|
if (head->md->key == GRPC_MDSTR_AUTHORITY) { |
|
|
|
|
if (grpc_slice_eq(GRPC_MDKEY(head->md), GRPC_MDSTR_AUTHORITY)) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
head = head->next; |
|
|
|
@ -818,7 +832,8 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx, |
|
|
|
|
GRPC_ERROR_CANCELLED, NULL); |
|
|
|
|
} else { |
|
|
|
|
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_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); |
|
|
|
|
if (oas->s->state.rs.trailing_metadata_valid) { |
|
|
|
|
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_state->rs.trailing_metadata_valid = false; |
|
|
|
|
} |
|
|
|
|