diff options
author | Muxi Yan <muxi@users.noreply.github.com> | 2017-09-25 10:41:38 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-25 10:41:38 -0700 |
commit | 008a173a7e2ba1d5c0933aa7a77395945ba2024d (patch) | |
tree | 86ccc0a756def38daeb0e99c8bfbc6bb639a24f4 /src | |
parent | f3f420d91f4770b196cf61f66f1d90c0dc3f1048 (diff) | |
parent | f7d8860f4ff688e966159f31e2c281a22e2aa3f4 (diff) |
Merge pull request #12244 from muxi/fix-stream-compression-eos
End stream compression gzip stream at end of call
Diffstat (limited to 'src')
-rw-r--r-- | src/core/ext/transport/chttp2/transport/writing.c | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/src/core/ext/transport/chttp2/transport/writing.c b/src/core/ext/transport/chttp2/transport/writing.c index c333a34eb3..be1af16019 100644 --- a/src/core/ext/transport/chttp2/transport/writing.c +++ b/src/core/ext/transport/chttp2/transport/writing.c @@ -341,6 +341,23 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( (send_bytes == s->compressed_data_buffer.length && s->flow_controlled_buffer.length == 0 && s->fetching_send_message == NULL); + if (is_last_data_frame && s->send_trailing_metadata != NULL && + s->stream_compression_ctx != NULL) { + if (!grpc_stream_compress( + s->stream_compression_ctx, &s->flow_controlled_buffer, + &s->compressed_data_buffer, NULL, MAX_SIZE_T, + GRPC_STREAM_COMPRESSION_FLUSH_FINISH)) { + gpr_log(GPR_ERROR, "Stream compression failed."); + } + grpc_stream_compression_context_destroy( + s->stream_compression_ctx); + s->stream_compression_ctx = NULL; + /* After finish, bytes in s->compressed_data_buffer may be + * more than max_outgoing. Start another round of the current + * while loop so that send_bytes and is_last_data_frame are + * recalculated. */ + continue; + } is_last_frame = is_last_data_frame && s->send_trailing_metadata != NULL && grpc_metadata_batch_is_empty(s->send_trailing_metadata); @@ -360,10 +377,12 @@ grpc_chttp2_begin_write_result grpc_chttp2_begin_write( s->stream_compression_method); } s->uncompressed_data_size = s->flow_controlled_buffer.length; - GPR_ASSERT(grpc_stream_compress( - s->stream_compression_ctx, &s->flow_controlled_buffer, - &s->compressed_data_buffer, NULL, MAX_SIZE_T, - GRPC_STREAM_COMPRESSION_FLUSH_SYNC)); + if (!grpc_stream_compress( + s->stream_compression_ctx, &s->flow_controlled_buffer, + &s->compressed_data_buffer, NULL, MAX_SIZE_T, + GRPC_STREAM_COMPRESSION_FLUSH_SYNC)) { + gpr_log(GPR_ERROR, "Stream compression failed."); + } } } if (!t->is_client) { |