working with send_message with multiple slices
diff --git a/src/core/lib/channel/http_client_filter.c b/src/core/lib/channel/http_client_filter.c
index 8725618..f127e3a 100644
--- a/src/core/lib/channel/http_client_filter.c
+++ b/src/core/lib/channel/http_client_filter.c
@@ -53,6 +53,7 @@
grpc_linked_mdelem payload_bin;
grpc_metadata_batch *recv_initial_metadata;
+ uint8_t *payload_bytes;
/** Closure to call when finished with the hc_on_recv hook */
grpc_closure *on_done_recv;
@@ -151,17 +152,23 @@
if (method == GRPC_MDELEM_METHOD_GET) {
gpr_slice slice;
- /* TODO (makdharma): extend code for messages with multiple slices */
- if (grpc_byte_stream_next(NULL, op->send_message, &slice,
- op->send_message->length, NULL)) {
- grpc_mdelem *payload_bin = grpc_mdelem_from_metadata_strings(
+ gpr_slice_buffer slices;
+ gpr_slice_buffer_init(&slices);
+ calld->payload_bytes = gpr_malloc(op->send_message->length);
+ uint8_t *wrptr = calld->payload_bytes;
+
+ while (grpc_byte_stream_next(NULL, op->send_message, &slice, ~(size_t)0, NULL)) {
+ memcpy(wrptr, GPR_SLICE_START_PTR(slice), GPR_SLICE_LENGTH(slice));
+ wrptr += GPR_SLICE_LENGTH(slice);
+ gpr_slice_buffer_add(&slices, slice);
+ if (op->send_message->length == slices.length) {
+ grpc_mdelem *payload_bin = grpc_mdelem_from_metadata_strings(
GRPC_MDSTR_GRPC_PAYLOAD_BIN,
- grpc_mdstr_from_buffer(GPR_SLICE_START_PTR(slice),
- GPR_SLICE_LENGTH(slice)));
- grpc_metadata_batch_add_tail(op->send_initial_metadata,
- &calld->payload_bin, payload_bin);
- } else {
- gpr_log(GPR_ERROR, "send_message could not be read");
+ grpc_mdstr_from_buffer(calld->payload_bytes, op->send_message->length));
+ grpc_metadata_batch_add_tail(op->send_initial_metadata,
+ &calld->payload_bin, payload_bin);
+ break;
+ }
}
op->send_message = NULL;
}
@@ -246,7 +253,7 @@
gpr_log(GPR_ERROR, "%s: must be an integer",
GRPC_ARG_MAX_PAYLOAD_SIZE_FOR_GET);
} else {
- return args->args[i].value.integer;
+ return (size_t)args->args[i].value.integer;
}
}
}