/* * Gets the next slice from recv_message byte buffer. * Returns 1 if a slice was get successfully, 0 if there are no more slices to * read. Set slice_len to the length of the slice and the slice_data_ptr to * point to slice's data. Caller must ensure that the byte buffer being read * from stays alive as long as the data of the slice are being accessed * (grpc_byte_buffer_reader_peek method is used internally) * * Remarks: * Slices can only be iterated once. * Initializes recv_message_buffer_reader if it was not initialized yet. */ GPR_EXPORT int GPR_CALLTYPE grpcsharp_batch_context_recv_message_next_slice_peek( grpcsharp_batch_context* ctx, size_t* slice_len, uint8_t** slice_data_ptr) { *slice_len = 0; *slice_data_ptr = NULL; if (!ctx->recv_message) { return 0; } if (!ctx->recv_message_reader) { ctx->recv_message_reader = &ctx->reserved_recv_message_reader; GPR_ASSERT(grpc_byte_buffer_reader_init(ctx->recv_message_reader, ctx->recv_message)); } grpc_slice* slice_ptr; if (!grpc_byte_buffer_reader_peek(ctx->recv_message_reader, &slice_ptr)) { return 0; } /* recv_message buffer must not be deleted before all the data is read */ *slice_len = GRPC_SLICE_LENGTH(*slice_ptr); *slice_data_ptr = GRPC_SLICE_START_PTR(*slice_ptr); return 1; }
static void test_readall(void) { char* lotsa_as[512]; char* lotsa_bs[1024]; gpr_slice slices[2]; grpc_byte_buffer *buffer; grpc_byte_buffer_reader reader; gpr_slice slice_out; LOG_TEST("test_readall"); memset(lotsa_as, 'a', 512); memset(lotsa_bs, 'b', 1024); /* use slices large enough to overflow inlining */ slices[0] = gpr_slice_malloc(512); memcpy(GPR_SLICE_START_PTR(slices[0]), lotsa_as, 512); slices[1] = gpr_slice_malloc(1024); memcpy(GPR_SLICE_START_PTR(slices[1]), lotsa_bs, 1024); buffer = grpc_raw_byte_buffer_create(slices, 2); gpr_slice_unref(slices[0]); gpr_slice_unref(slices[1]); grpc_byte_buffer_reader_init(&reader, buffer); slice_out = grpc_byte_buffer_reader_readall(&reader); GPR_ASSERT(GPR_SLICE_LENGTH(slice_out) == 512 + 1024); GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(slice_out), lotsa_as, 512) == 0); GPR_ASSERT(memcmp(&(GPR_SLICE_START_PTR(slice_out)[512]), lotsa_bs, 1024) == 0); gpr_slice_unref(slice_out); grpc_byte_buffer_destroy(buffer); }
static void read_compressed_slice(grpc_compression_algorithm algorithm, int input_size) { gpr_slice input_slice; gpr_slice_buffer sliceb_in; gpr_slice_buffer sliceb_out; grpc_byte_buffer *buffer; grpc_byte_buffer_reader reader; gpr_slice read_slice; int read_count = 0; gpr_slice_buffer_init(&sliceb_in); gpr_slice_buffer_init(&sliceb_out); input_slice = gpr_slice_malloc(input_size); memset(GPR_SLICE_START_PTR(input_slice), 'a', input_size); gpr_slice_buffer_add(&sliceb_in, input_slice); /* takes ownership */ GPR_ASSERT(grpc_msg_compress(algorithm, &sliceb_in, &sliceb_out)); buffer = grpc_raw_compressed_byte_buffer_create(sliceb_out.slices, sliceb_out.count, algorithm); grpc_byte_buffer_reader_init(&reader, buffer); while (grpc_byte_buffer_reader_next(&reader, &read_slice)) { GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(read_slice), GPR_SLICE_START_PTR(input_slice) + read_count, GPR_SLICE_LENGTH(read_slice)) == 0); read_count += GPR_SLICE_LENGTH(read_slice); gpr_slice_unref(read_slice); } GPR_ASSERT(read_count == input_size); grpc_byte_buffer_reader_destroy(&reader); grpc_byte_buffer_destroy(buffer); gpr_slice_buffer_destroy(&sliceb_out); gpr_slice_buffer_destroy(&sliceb_in); }
GPR_EXPORT intptr_t GPR_CALLTYPE grpcsharp_batch_context_recv_message_length( const grpcsharp_batch_context *ctx) { grpc_byte_buffer_reader reader; if (!ctx->recv_message) { return -1; } GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, ctx->recv_message)); intptr_t result = (intptr_t)grpc_byte_buffer_length(reader.buffer_out); grpc_byte_buffer_reader_destroy(&reader); return result; }
int byte_buffer_eq_string(grpc_byte_buffer *bb, const char *str) { grpc_byte_buffer_reader reader; grpc_byte_buffer *rbb; int res; grpc_byte_buffer_reader_init(&reader, bb); rbb = grpc_raw_byte_buffer_from_reader(&reader); res = byte_buffer_eq_slice(rbb, gpr_slice_from_copied_string(str)); grpc_byte_buffer_reader_destroy(&reader); grpc_byte_buffer_destroy(rbb); return res; }
int byte_buffer_eq_slice(grpc_byte_buffer *bb, gpr_slice b) { grpc_byte_buffer_reader reader; grpc_byte_buffer *rbb; int res; GPR_ASSERT(grpc_byte_buffer_reader_init(&reader, bb) && "Couldn't init byte buffer reader"); rbb = grpc_raw_byte_buffer_from_reader(&reader); res = raw_byte_buffer_eq_slice(rbb, b); grpc_byte_buffer_reader_destroy(&reader); grpc_byte_buffer_destroy(rbb); return res; }
/* * Copies data from recv_message to a buffer. Fatal error occurs if * buffer is too small. */ GPR_EXPORT void GPR_CALLTYPE grpcsharp_batch_context_recv_message_to_buffer( const grpcsharp_batch_context *ctx, char *buffer, size_t buffer_len) { grpc_byte_buffer_reader reader; gpr_slice slice; size_t offset = 0; grpc_byte_buffer_reader_init(&reader, ctx->recv_message); while (grpc_byte_buffer_reader_next(&reader, &slice)) { size_t len = GPR_SLICE_LENGTH(slice); GPR_ASSERT(offset + len <= buffer_len); memcpy(buffer + offset, GPR_SLICE_START_PTR(slice), GPR_SLICE_LENGTH(slice)); offset += len; gpr_slice_unref(slice); } }
void pygrpc_byte_buffer_to_bytes( grpc_byte_buffer *buffer, char **result, size_t *result_size) { grpc_byte_buffer_reader reader; gpr_slice slice; char *read_result = NULL; size_t size = 0; grpc_byte_buffer_reader_init(&reader, buffer); while (grpc_byte_buffer_reader_next(&reader, &slice)) { read_result = gpr_realloc(read_result, size + GPR_SLICE_LENGTH(slice)); memcpy(read_result + size, GPR_SLICE_START_PTR(slice), GPR_SLICE_LENGTH(slice)); size = size + GPR_SLICE_LENGTH(slice); gpr_slice_unref(slice); } *result_size = size; *result = read_result; }
void byte_buffer_to_string(grpc_byte_buffer *buffer, char **out_string, size_t *out_length) { grpc_byte_buffer_reader reader; if (buffer == NULL || !grpc_byte_buffer_reader_init(&reader, buffer)) { /* TODO(dgq): distinguish between the error cases. */ *out_string = NULL; *out_length = 0; return; } grpc_slice slice = grpc_byte_buffer_reader_readall(&reader); size_t length = GRPC_SLICE_LENGTH(slice); char *string = ecalloc(length + 1, sizeof(char)); memcpy(string, GRPC_SLICE_START_PTR(slice), length); grpc_slice_unref(slice); *out_string = string; *out_length = length; }
VALUE grpc_rb_byte_buffer_to_s(grpc_byte_buffer *buffer) { size_t length = 0; char *string = NULL; size_t offset = 0; grpc_byte_buffer_reader reader; gpr_slice next; if (buffer == NULL) { return Qnil; } length = grpc_byte_buffer_length(buffer); string = xmalloc(length + 1); grpc_byte_buffer_reader_init(&reader, buffer); while (grpc_byte_buffer_reader_next(&reader, &next) != 0) { memcpy(string + offset, GPR_SLICE_START_PTR(next), GPR_SLICE_LENGTH(next)); offset += GPR_SLICE_LENGTH(next); } return rb_str_new(string, length); }
static void test_read_none_compressed_slice(void) { gpr_slice slice; grpc_byte_buffer *buffer; grpc_byte_buffer_reader reader; gpr_slice first_slice, second_slice; int first_code, second_code; LOG_TEST("test_read_none_compressed_slice"); slice = gpr_slice_from_copied_string("test"); buffer = grpc_raw_byte_buffer_create(&slice, 1); gpr_slice_unref(slice); grpc_byte_buffer_reader_init(&reader, buffer); first_code = grpc_byte_buffer_reader_next(&reader, &first_slice); GPR_ASSERT(first_code != 0); GPR_ASSERT(memcmp(GPR_SLICE_START_PTR(first_slice), "test", 4) == 0); gpr_slice_unref(first_slice); second_code = grpc_byte_buffer_reader_next(&reader, &second_slice); GPR_ASSERT(second_code == 0); grpc_byte_buffer_destroy(buffer); }
VALUE grpc_rb_byte_buffer_to_s(grpc_byte_buffer *buffer) { VALUE rb_string; grpc_byte_buffer_reader reader; grpc_slice next; if (buffer == NULL) { return Qnil; } rb_string = rb_str_buf_new(grpc_byte_buffer_length(buffer)); if (!grpc_byte_buffer_reader_init(&reader, buffer)) { rb_raise(rb_eRuntimeError, "Error initializing byte buffer reader."); return Qnil; } while (grpc_byte_buffer_reader_next(&reader, &next) != 0) { rb_str_cat(rb_string, (const char *) GRPC_SLICE_START_PTR(next), GRPC_SLICE_LENGTH(next)); grpc_slice_unref(next); } grpc_byte_buffer_reader_destroy(&reader); return rb_string; }
static void test_byte_buffer_from_reader(void) { gpr_slice slice; grpc_byte_buffer *buffer, *buffer_from_reader; grpc_byte_buffer_reader reader; LOG_TEST("test_byte_buffer_from_reader"); slice = gpr_slice_malloc(4); memcpy(GPR_SLICE_START_PTR(slice), "test", 4); buffer = grpc_raw_byte_buffer_create(&slice, 1); gpr_slice_unref(slice); grpc_byte_buffer_reader_init(&reader, buffer); buffer_from_reader = grpc_raw_byte_buffer_from_reader(&reader); GPR_ASSERT(buffer->type == buffer_from_reader->type); GPR_ASSERT(buffer_from_reader->data.raw.compression == GRPC_COMPRESS_NONE); GPR_ASSERT(buffer_from_reader->data.raw.slice_buffer.count == 1); GPR_ASSERT(memcmp(GPR_SLICE_START_PTR( buffer_from_reader->data.raw.slice_buffer.slices[0]), "test", 4) == 0); grpc_byte_buffer_destroy(buffer); grpc_byte_buffer_destroy(buffer_from_reader); }
static struct grpc_memory_counters send_snapshot_request(int call_idx, grpc_slice call_type) { grpc_metadata_array_init(&calls[call_idx].initial_metadata_recv); grpc_metadata_array_init(&calls[call_idx].trailing_metadata_recv); grpc_byte_buffer *response_payload_recv = NULL; memset(snapshot_ops, 0, sizeof(snapshot_ops)); op = snapshot_ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; op->flags = GRPC_INITIAL_METADATA_WAIT_FOR_READY; op++; op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; op++; op->op = GRPC_OP_RECV_INITIAL_METADATA; op->data.recv_initial_metadata.recv_initial_metadata = &calls[call_idx].initial_metadata_recv; op++; op->op = GRPC_OP_RECV_MESSAGE; op->data.recv_message.recv_message = &response_payload_recv; op++; op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; op->data.recv_status_on_client.trailing_metadata = &calls[call_idx].trailing_metadata_recv; op->data.recv_status_on_client.status = &calls[call_idx].status; op->data.recv_status_on_client.status_details = &calls[call_idx].details; op++; grpc_slice hostname = grpc_slice_from_static_string("localhost"); calls[call_idx].call = grpc_channel_create_call( channel, NULL, GRPC_PROPAGATE_DEFAULTS, cq, call_type, &hostname, gpr_inf_future(GPR_CLOCK_REALTIME), NULL); GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch( calls[call_idx].call, snapshot_ops, (size_t)(op - snapshot_ops), (void *)0, NULL)); grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL); grpc_byte_buffer_reader reader; grpc_byte_buffer_reader_init(&reader, response_payload_recv); grpc_slice response = grpc_byte_buffer_reader_readall(&reader); struct grpc_memory_counters snapshot; snapshot.total_size_absolute = ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response)) ->total_size_absolute; snapshot.total_allocs_absolute = ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response)) ->total_allocs_absolute; snapshot.total_size_relative = ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response)) ->total_size_relative; snapshot.total_allocs_relative = ((struct grpc_memory_counters *)GRPC_SLICE_START_PTR(response)) ->total_allocs_relative; grpc_metadata_array_destroy(&calls[call_idx].initial_metadata_recv); grpc_metadata_array_destroy(&calls[call_idx].trailing_metadata_recv); grpc_slice_unref(response); grpc_byte_buffer_reader_destroy(&reader); grpc_byte_buffer_destroy(response_payload_recv); grpc_slice_unref(calls[call_idx].details); calls[call_idx].details = grpc_empty_slice(); grpc_call_destroy(calls[call_idx].call); calls[call_idx].call = NULL; return snapshot; }