|  | @@ -73,15 +73,13 @@ typedef struct grpcsharp_batch_context {
 | 
	
		
			
				|  |  |    grpc_byte_buffer *send_message;
 | 
	
		
			
				|  |  |    struct {
 | 
	
		
			
				|  |  |      grpc_metadata_array trailing_metadata;
 | 
	
		
			
				|  |  | -    char *status_details;
 | 
	
		
			
				|  |  |    } send_status_from_server;
 | 
	
		
			
				|  |  |    grpc_metadata_array recv_initial_metadata;
 | 
	
		
			
				|  |  |    grpc_byte_buffer *recv_message;
 | 
	
		
			
				|  |  |    struct {
 | 
	
		
			
				|  |  |      grpc_metadata_array trailing_metadata;
 | 
	
		
			
				|  |  |      grpc_status_code status;
 | 
	
		
			
				|  |  | -    char *status_details;
 | 
	
		
			
				|  |  | -    size_t status_details_capacity;
 | 
	
		
			
				|  |  | +    grpc_slice status_details;
 | 
	
		
			
				|  |  |    } recv_status_on_client;
 | 
	
		
			
				|  |  |    int recv_close_on_server_cancelled;
 | 
	
		
			
				|  |  |  } grpcsharp_batch_context;
 | 
	
	
		
			
				|  | @@ -178,21 +176,17 @@ grpcsharp_metadata_array_count(grpc_metadata_array *array) {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT const char *GPR_CALLTYPE
 | 
	
		
			
				|  |  | -grpcsharp_metadata_array_get_key(grpc_metadata_array *array, size_t index) {
 | 
	
		
			
				|  |  | +grpcsharp_metadata_array_get_key(grpc_metadata_array *array, size_t index, size_t *key_length) {
 | 
	
		
			
				|  |  |    GPR_ASSERT(index < array->count);
 | 
	
		
			
				|  |  | -  return array->metadata[index].key;
 | 
	
		
			
				|  |  | +  *key_length = GRPC_SLICE_LENGTH(array->metadata[index].key);
 | 
	
		
			
				|  |  | +  return (char *)GRPC_SLICE_START_PTR(array->metadata[index].key);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT const char *GPR_CALLTYPE
 | 
	
		
			
				|  |  | -grpcsharp_metadata_array_get_value(grpc_metadata_array *array, size_t index) {
 | 
	
		
			
				|  |  | +grpcsharp_metadata_array_get_value(grpc_metadata_array *array, size_t index, size_t *value_length) {
 | 
	
		
			
				|  |  |    GPR_ASSERT(index < array->count);
 | 
	
		
			
				|  |  | -  return array->metadata[index].value;
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -GPR_EXPORT intptr_t GPR_CALLTYPE grpcsharp_metadata_array_get_value_length(
 | 
	
		
			
				|  |  | -    grpc_metadata_array *array, size_t index) {
 | 
	
		
			
				|  |  | -  GPR_ASSERT(index < array->count);
 | 
	
		
			
				|  |  | -  return (intptr_t)array->metadata[index].value_length;
 | 
	
		
			
				|  |  | +  *value_length = GRPC_SLICE_LENGTH(array->metadata[index].value);
 | 
	
		
			
				|  |  | +  return (char *)GRPC_SLICE_START_PTR(array->metadata[index].value);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /* Move contents of metadata array */
 | 
	
	
		
			
				|  | @@ -225,7 +219,6 @@ GPR_EXPORT void GPR_CALLTYPE grpcsharp_batch_context_destroy(grpcsharp_batch_con
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpcsharp_metadata_array_destroy_metadata_including_entries(
 | 
	
		
			
				|  |  |        &(ctx->send_status_from_server.trailing_metadata));
 | 
	
		
			
				|  |  | -  gpr_free(ctx->send_status_from_server.status_details);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpcsharp_metadata_array_destroy_metadata_only(&(ctx->recv_initial_metadata));
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -233,7 +226,7 @@ GPR_EXPORT void GPR_CALLTYPE grpcsharp_batch_context_destroy(grpcsharp_batch_con
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    grpcsharp_metadata_array_destroy_metadata_only(
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.trailing_metadata));
 | 
	
		
			
				|  |  | -  gpr_free((void *)ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  | +  grpc_slice_unref(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    gpr_free(ctx);
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -305,8 +298,9 @@ grpcsharp_batch_context_recv_status_on_client_status(
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT const char *GPR_CALLTYPE
 | 
	
		
			
				|  |  |  grpcsharp_batch_context_recv_status_on_client_details(
 | 
	
		
			
				|  |  | -    const grpcsharp_batch_context *ctx) {
 | 
	
		
			
				|  |  | -  return ctx->recv_status_on_client.status_details;
 | 
	
		
			
				|  |  | +    const grpcsharp_batch_context *ctx, size_t *details_length) {
 | 
	
		
			
				|  |  | +  *details_length = GRPC_SLICE_LENGTH(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  | +  return (char *)GRPC_SLICE_START_PTR(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT const grpc_metadata_array *GPR_CALLTYPE
 | 
	
	
		
			
				|  | @@ -322,13 +316,15 @@ GPR_EXPORT grpc_call *GPR_CALLTYPE grpcsharp_request_call_context_call(
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT const char *GPR_CALLTYPE
 | 
	
		
			
				|  |  |  grpcsharp_request_call_context_method(
 | 
	
		
			
				|  |  | -    const grpcsharp_request_call_context *ctx) {
 | 
	
		
			
				|  |  | -  return ctx->call_details.method;
 | 
	
		
			
				|  |  | +    const grpcsharp_request_call_context *ctx, size_t *method_length) {
 | 
	
		
			
				|  |  | +  *method_length = GRPC_SLICE_LENGTH(ctx->call_details.method);
 | 
	
		
			
				|  |  | +  return (char *)GRPC_SLICE_START_PTR(ctx->call_details.method);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT const char *GPR_CALLTYPE grpcsharp_request_call_context_host(
 | 
	
		
			
				|  |  | -    const grpcsharp_request_call_context *ctx) {
 | 
	
		
			
				|  |  | -  return ctx->call_details.host;
 | 
	
		
			
				|  |  | +    const grpcsharp_request_call_context *ctx, size_t *host_length) {
 | 
	
		
			
				|  |  | +  *host_length = GRPC_SLICE_LENGTH(ctx->call_details.host);
 | 
	
		
			
				|  |  | +  return (char *)GRPC_SLICE_START_PTR(ctx->call_details.host);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT gpr_timespec GPR_CALLTYPE
 | 
	
	
		
			
				|  | @@ -403,9 +399,14 @@ grpcsharp_channel_create_call(grpc_channel *channel, grpc_call *parent_call,
 | 
	
		
			
				|  |  |                                const char *method, const char *host,
 | 
	
		
			
				|  |  |                                gpr_timespec deadline) {
 | 
	
		
			
				|  |  |    grpc_slice method_slice = grpc_slice_from_copied_string(method);
 | 
	
		
			
				|  |  | -  grpc_slice host_slice = host == NULL ? grpc_empty_string() : grpc_slice_from_copied_string(host);
 | 
	
		
			
				|  |  | -  grpc_call *grpc_channel_create_call(channel, parent_call, propagation_mask, cq,
 | 
	
		
			
				|  |  | -                                  method_slice, host_slice, deadline, NULL);
 | 
	
		
			
				|  |  | +  grpc_slice *host_slice_ptr = NULL;
 | 
	
		
			
				|  |  | +  grpc_slice host_slice;
 | 
	
		
			
				|  |  | +  if (host != NULL) {
 | 
	
		
			
				|  |  | +    host_slice = grpc_slice_from_copied_string(host);
 | 
	
		
			
				|  |  | +    host_slice_ptr = &host_slice;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return grpc_channel_create_call(channel, parent_call, propagation_mask, cq,
 | 
	
		
			
				|  |  | +                                  method_slice, host_slice_ptr, deadline, NULL);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  GPR_EXPORT grpc_connectivity_state GPR_CALLTYPE
 | 
	
	
		
			
				|  | @@ -560,11 +561,8 @@ grpcsharp_call_start_unary(grpc_call *call, grpcsharp_batch_context *ctx,
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.trailing_metadata);
 | 
	
		
			
				|  |  |    ops[5].data.recv_status_on_client.status =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status);
 | 
	
		
			
				|  |  | -  /* not using preallocation for status_details */
 | 
	
		
			
				|  |  |    ops[5].data.recv_status_on_client.status_details =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  | -  ops[5].data.recv_status_on_client.status_details_capacity =
 | 
	
		
			
				|  |  | -      &(ctx->recv_status_on_client.status_details_capacity);
 | 
	
		
			
				|  |  |    ops[5].flags = 0;
 | 
	
		
			
				|  |  |    ops[5].reserved = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -604,11 +602,8 @@ grpcsharp_call_start_client_streaming(grpc_call *call,
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.trailing_metadata);
 | 
	
		
			
				|  |  |    ops[3].data.recv_status_on_client.status =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status);
 | 
	
		
			
				|  |  | -  /* not using preallocation for status_details */
 | 
	
		
			
				|  |  |    ops[3].data.recv_status_on_client.status_details =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  | -  ops[3].data.recv_status_on_client.status_details_capacity =
 | 
	
		
			
				|  |  | -      &(ctx->recv_status_on_client.status_details_capacity);
 | 
	
		
			
				|  |  |    ops[3].flags = 0;
 | 
	
		
			
				|  |  |    ops[3].reserved = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -647,11 +642,8 @@ GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_start_server_streaming(
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.trailing_metadata);
 | 
	
		
			
				|  |  |    ops[3].data.recv_status_on_client.status =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status);
 | 
	
		
			
				|  |  | -  /* not using preallocation for status_details */
 | 
	
		
			
				|  |  |    ops[3].data.recv_status_on_client.status_details =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  | -  ops[3].data.recv_status_on_client.status_details_capacity =
 | 
	
		
			
				|  |  | -      &(ctx->recv_status_on_client.status_details_capacity);
 | 
	
		
			
				|  |  |    ops[3].flags = 0;
 | 
	
		
			
				|  |  |    ops[3].reserved = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -681,11 +673,8 @@ grpcsharp_call_start_duplex_streaming(grpc_call *call,
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.trailing_metadata);
 | 
	
		
			
				|  |  |    ops[1].data.recv_status_on_client.status =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status);
 | 
	
		
			
				|  |  | -  /* not using preallocation for status_details */
 | 
	
		
			
				|  |  |    ops[1].data.recv_status_on_client.status_details =
 | 
	
		
			
				|  |  |        &(ctx->recv_status_on_client.status_details);
 | 
	
		
			
				|  |  | -  ops[1].data.recv_status_on_client.status_details_capacity =
 | 
	
		
			
				|  |  | -      &(ctx->recv_status_on_client.status_details_capacity);
 | 
	
		
			
				|  |  |    ops[1].flags = 0;
 | 
	
		
			
				|  |  |    ops[1].reserved = NULL;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -749,10 +738,10 @@ GPR_EXPORT grpc_call_error GPR_CALLTYPE grpcsharp_call_send_status_from_server(
 | 
	
		
			
				|  |  |    grpc_op ops[3];
 | 
	
		
			
				|  |  |    memset(ops, 0, sizeof(ops));
 | 
	
		
			
				|  |  |    size_t nops = 1;
 | 
	
		
			
				|  |  | +  grpc_slice status_details_slice = grpc_slice_from_copied_string(status_details);
 | 
	
		
			
				|  |  |    ops[0].op = GRPC_OP_SEND_STATUS_FROM_SERVER;
 | 
	
		
			
				|  |  |    ops[0].data.send_status_from_server.status = status_code;
 | 
	
		
			
				|  |  | -  ops[0].data.send_status_from_server.status_details =
 | 
	
		
			
				|  |  | -      gpr_strdup(status_details);
 | 
	
		
			
				|  |  | +  ops[0].data.send_status_from_server.status_details = &status_details_slice;
 | 
	
		
			
				|  |  |    grpcsharp_metadata_array_move(
 | 
	
		
			
				|  |  |        &(ctx->send_status_from_server.trailing_metadata), trailing_metadata);
 | 
	
		
			
				|  |  |    ops[0].data.send_status_from_server.trailing_metadata_count =
 |