aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/ext/transport/cronet
diff options
context:
space:
mode:
authorGravatar Muxi Yan <mxyan@google.com>2016-09-15 16:00:54 -0700
committerGravatar Muxi Yan <mxyan@google.com>2016-10-11 11:58:40 -0700
commitf2f3bb89514e4453b5c26458fac333d58a07e85d (patch)
treebad5bbb59e995646af08c3624a5993135bb1688f /src/core/ext/transport/cronet
parent6e0d5676ea4559fc23b4a0d865b8072502b012ec (diff)
Add an extra Cronet read after response header is received
Diffstat (limited to 'src/core/ext/transport/cronet')
-rw-r--r--src/core/ext/transport/cronet/transport/cronet_transport.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/src/core/ext/transport/cronet/transport/cronet_transport.c b/src/core/ext/transport/cronet/transport/cronet_transport.c
index 444873988b..8b074f4ea8 100644
--- a/src/core/ext/transport/cronet/transport/cronet_transport.c
+++ b/src/core/ext/transport/cronet/transport/cronet_transport.c
@@ -432,6 +432,15 @@ static void on_response_headers_received(
grpc_mdstr_from_string(headers->headers[i].value)));
}
s->state.state_callback_received[OP_RECV_INITIAL_METADATA] = true;
+ /* Do an extra read to trigger on_succeeded() callback in case connection
+ is closed */
+ GPR_ASSERT(s->state.rs.length_field_received == false);
+ s->state.rs.read_buffer = s->state.rs.grpc_header_bytes;
+ s->state.rs.received_bytes = 0;
+ s->state.rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES;
+ CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
+ cronet_bidirectional_stream_read(s->cbs, s->state.rs.read_buffer,
+ s->state.rs.remaining_bytes);
gpr_mu_unlock(&s->mu);
execute_from_storage(s);
}
@@ -509,20 +518,8 @@ static void on_response_trailers_received(
s->state.rs.trailing_metadata_valid = true;
}
s->state.state_callback_received[OP_RECV_TRAILING_METADATA] = true;
- if (!s->state.state_op_done[OP_READ_REQ_MADE]) {
- /* Do an extra read to trigger on_succeeded() callback in case connection
- is closed */
- s->state.rs.received_bytes = 0;
- s->state.rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES;
- s->state.rs.length_field_received = false;
- CRONET_LOG(GPR_DEBUG, "cronet_bidirectional_stream_read(%p)", s->cbs);
- cronet_bidirectional_stream_read(s->cbs, s->state.rs.read_buffer,
- s->state.rs.remaining_bytes);
- gpr_mu_unlock(&s->mu);
- } else {
- gpr_mu_unlock(&s->mu);
- execute_from_storage(s);
- }
+ gpr_mu_unlock(&s->mu);
+ execute_from_storage(s);
}
/*
@@ -633,9 +630,9 @@ static bool op_can_be_run(grpc_transport_stream_op *curr_op,
/* When call is canceled, every op can be run, except under following
conditions
*/
- bool is_canceled_of_failed = stream_state->state_op_done[OP_CANCEL_ERROR] ||
+ bool is_canceled_or_failed = stream_state->state_op_done[OP_CANCEL_ERROR] ||
stream_state->state_callback_received[OP_FAILED];
- if (is_canceled_of_failed) {
+ if (is_canceled_or_failed) {
if (op_id == OP_SEND_INITIAL_METADATA) result = false;
if (op_id == OP_SEND_MESSAGE) result = false;
if (op_id == OP_SEND_TRAILING_METADATA) result = false;
@@ -949,6 +946,7 @@ static enum e_op_result execute_stream_op(grpc_exec_ctx *exec_ctx,
oas->state.state_op_done[OP_RECV_MESSAGE] = true;
/* Do an extra read to trigger on_succeeded() callback in case connection
is closed */
+ stream_state->rs.read_buffer = stream_state->rs.grpc_header_bytes;
stream_state->rs.received_bytes = 0;
stream_state->rs.remaining_bytes = GRPC_HEADER_SIZE_IN_BYTES;
stream_state->rs.length_field_received = false;