aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/surface/byte_buffer_reader.c
diff options
context:
space:
mode:
authorGravatar David Garcia Quintas <dgq@google.com>2015-06-04 17:40:54 -0700
committerGravatar David Garcia Quintas <dgq@google.com>2015-06-05 16:34:33 -0700
commit25d02d56370bfa0ead2a79203c522ce02cbe9394 (patch)
treee4a2c7152c4d5c3c1ef24296d8f74a514e4ee968 /src/core/surface/byte_buffer_reader.c
parent8507e150ba0071d6bd0790cb0dc23a03260ed791 (diff)
Made grpc_byte_buffer_reader able to decompress msgs.
Diffstat (limited to 'src/core/surface/byte_buffer_reader.c')
-rw-r--r--src/core/surface/byte_buffer_reader.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/src/core/surface/byte_buffer_reader.c b/src/core/surface/byte_buffer_reader.c
index 41ad700274..0754a17226 100644
--- a/src/core/surface/byte_buffer_reader.c
+++ b/src/core/surface/byte_buffer_reader.c
@@ -39,35 +39,68 @@
#include <grpc/support/slice_buffer.h>
#include <grpc/byte_buffer.h>
+#include "src/core/compression/algorithm.h"
+#include "src/core/compression/message_compress.h"
+
void grpc_byte_buffer_reader_init(grpc_byte_buffer_reader *reader,
grpc_byte_buffer *buffer) {
- reader->buffer = buffer;
+ grpc_compression_algorithm compress_algo;
+ gpr_slice_buffer decompressed_slices_buffer;
+ reader->buffer_in = buffer;
switch (buffer->type) {
+ case GRPC_BB_COMPRESSED_DEFLATE:
+ case GRPC_BB_COMPRESSED_GZIP:
+ compress_algo =
+ GRPC_COMPRESS_ALGORITHM_FROM_BB_TYPE(reader->buffer_in->type);
+ gpr_slice_buffer_init(&decompressed_slices_buffer);
+ grpc_msg_decompress(compress_algo, &reader->buffer_in->data.slice_buffer,
+ &decompressed_slices_buffer);
+ /* the output buffer is a regular GRPC_BB_SLICE_BUFFER */
+ reader->buffer_out = grpc_byte_buffer_create(
+ decompressed_slices_buffer.slices,
+ decompressed_slices_buffer.count);
+ gpr_slice_buffer_destroy(&decompressed_slices_buffer);
+ /* fallthrough */
case GRPC_BB_SLICE_BUFFER:
+ case GRPC_BB_COMPRESSED_NONE:
reader->current.index = 0;
}
}
void grpc_byte_buffer_reader_destroy(grpc_byte_buffer_reader *reader) {
- /* no-op: the user is responsible for memory deallocation.
- * Other cleanup operations would go here if needed. */
+ switch (reader->buffer_in->type) {
+ case GRPC_BB_COMPRESSED_DEFLATE:
+ case GRPC_BB_COMPRESSED_GZIP:
+ grpc_byte_buffer_destroy(reader->buffer_out);
+ break;
+ case GRPC_BB_SLICE_BUFFER:
+ case GRPC_BB_COMPRESSED_NONE:
+ ; /* no-op */
+ }
}
int grpc_byte_buffer_reader_next(grpc_byte_buffer_reader *reader,
gpr_slice *slice) {
- grpc_byte_buffer *buffer = reader->buffer;
gpr_slice_buffer *slice_buffer;
- switch (buffer->type) {
+ grpc_byte_buffer *buffer = NULL;
+
+ /* Pick the right buffer based on the input type */
+ switch (reader->buffer_in->type) {
case GRPC_BB_SLICE_BUFFER:
- slice_buffer = &buffer->data.slice_buffer;
- if (reader->current.index < slice_buffer->count) {
- *slice = gpr_slice_ref(slice_buffer->slices[reader->current.index]);
- reader->current.index += 1;
- return 1;
- } else {
- return 0;
- }
+ case GRPC_BB_COMPRESSED_NONE:
+ buffer = reader->buffer_in;
break;
+ case GRPC_BB_COMPRESSED_DEFLATE:
+ case GRPC_BB_COMPRESSED_GZIP:
+ buffer = reader->buffer_out;
+ break;
+ }
+ GPR_ASSERT(buffer);
+ slice_buffer = &buffer->data.slice_buffer;
+ if (reader->current.index < slice_buffer->count) {
+ *slice = gpr_slice_ref(slice_buffer->slices[reader->current.index]);
+ reader->current.index += 1;
+ return 1;
}
return 0;
}