convert cronet headers to metadata in one function

pull/14433/head
Muxi Yan 7 years ago
parent ec42f32834
commit 09bd5c0b1b
  1. 63
      src/core/ext/transport/cronet/transport/cronet_transport.cc

@ -415,6 +415,29 @@ static void execute_from_storage(stream_obj* s) {
gpr_mu_unlock(&s->mu);
}
static void convert_cronet_array_to_metadata(
const bidirectional_stream_header_array* header_array,
grpc_chttp2_incoming_metadata_buffer* mds) {
for (size_t i = 0; i < header_array->count; i++) {
CRONET_LOG(GPR_DEBUG, "header key=%s, value=%s",
header_array->headers[i].key, header_array->headers[i].value);
grpc_slice key = grpc_slice_intern(
grpc_slice_from_static_string(header_array->headers[i].key));
grpc_slice value;
if (grpc_is_binary_header(key)) {
value = grpc_slice_from_static_string(header_array->headers[i].value);
value = grpc_slice_intern(grpc_chttp2_base64_decode_with_length(
value, infer_length_after_decode(value)));
} else {
value = grpc_slice_intern(
grpc_slice_from_static_string(header_array->headers[i].value));
}
GRPC_LOG_IF_ERROR("convert_cronet_array_to_metadata",
grpc_chttp2_incoming_metadata_buffer_add(
mds, grpc_mdelem_from_slices(key, value)));
}
}
/*
Cronet callback
*/
@ -539,23 +562,7 @@ static void on_response_headers_received(
sizeof(s->state.rs.initial_metadata));
grpc_chttp2_incoming_metadata_buffer_init(&s->state.rs.initial_metadata,
s->arena);
for (size_t i = 0; i < headers->count; i++) {
grpc_slice key = grpc_slice_intern(
grpc_slice_from_static_string(headers->headers[i].key));
grpc_slice value;
if (grpc_is_binary_header(key)) {
value = grpc_slice_from_static_string(headers->headers[i].value);
value = grpc_slice_intern(grpc_chttp2_base64_decode_with_length(
value, infer_length_after_decode(value)));
} else {
value = grpc_slice_intern(
grpc_slice_from_static_string(headers->headers[i].value));
}
GRPC_LOG_IF_ERROR("on_response_headers_received",
grpc_chttp2_incoming_metadata_buffer_add(
&s->state.rs.initial_metadata,
grpc_mdelem_from_slices(key, value)));
}
convert_cronet_array_to_metadata(headers, &s->state.rs.initial_metadata);
s->state.state_callback_received[OP_RECV_INITIAL_METADATA] = true;
if (!(s->state.state_op_done[OP_CANCEL_ERROR] ||
s->state.state_callback_received[OP_FAILED])) {
@ -650,25 +657,11 @@ static void on_response_trailers_received(
s->state.rs.trailing_metadata_valid = false;
grpc_chttp2_incoming_metadata_buffer_init(&s->state.rs.trailing_metadata,
s->arena);
for (size_t i = 0; i < trailers->count; i++) {
CRONET_LOG(GPR_DEBUG, "trailer key=%s, value=%s", trailers->headers[i].key,
trailers->headers[i].value);
grpc_slice key = grpc_slice_intern(
grpc_slice_from_static_string(trailers->headers[i].key));
grpc_slice value;
if (grpc_is_binary_header(key)) {
value = grpc_slice_from_static_string(trailers->headers[i].value);
value = grpc_slice_intern(grpc_chttp2_base64_decode_with_length(
value, infer_length_after_decode(value)));
} else {
value = grpc_slice_intern(
grpc_slice_from_static_string(trailers->headers[i].value));
}
GRPC_LOG_IF_ERROR("on_response_trailers_received",
grpc_chttp2_incoming_metadata_buffer_add(
&s->state.rs.trailing_metadata,
grpc_mdelem_from_slices(key, value)));
convert_cronet_array_to_metadata(trailers, &s->state.rs.trailing_metadata);
if (trailers->count > 0) {
s->state.rs.trailing_metadata_valid = true;
}
for (size_t i = 0; i < trailers->count; i++) {
if (0 == strcmp(trailers->headers[i].key, "grpc-status") &&
0 != strcmp(trailers->headers[i].value, "0")) {
s->state.fail_state = true;

Loading…
Cancel
Save