Go to the documentation of this file.
19 #include <ruby/ruby.h>
89 if (
call->wrapped != NULL) {
107 "grpc_metadata_array",
114 #ifdef RUBY_TYPED_FREE_IMMEDIATELY
132 #ifdef RUBY_TYPED_FREE_IMMEDIATELY
133 RUBY_TYPED_FREE_IMMEDIATELY
143 const char*
detail =
"unknown error code!";
144 if (detail_ref != Qnil) {
145 detail = StringValueCStr(detail_ref);
155 if (RTYPEDDATA_DATA(
self) == NULL) {
179 if (RTYPEDDATA_DATA(
self) == NULL) {
185 rb_raise(rb_eTypeError,
186 "Bad parameter type error for cancel with status. Want Fixnum, "
193 StringValueCStr(
details), NULL);
211 xfree(RTYPEDDATA_DATA(
self));
212 RTYPEDDATA_DATA(
self) = NULL;
222 if (RTYPEDDATA_DATA(
self) == NULL) {
228 res = rb_str_new2(peer);
239 if (RTYPEDDATA_DATA(
self) == NULL) {
259 res = rb_str_new2(prop->
value);
283 rb_raise(rb_eTypeError,
"bad status: got:<%s> want: <Struct::Status>",
284 rb_obj_classname(
status));
307 rb_raise(rb_eTypeError,
"bad metadata: got:<%s> want: <Hash>",
331 rb_raise(rb_eTypeError,
"bad metadata: got:<%s> want: <Hash>",
354 if (!NIL_P(write_flag) &&
TYPE(write_flag) != T_FIXNUM) {
355 rb_raise(rb_eTypeError,
"bad write_flag: got:<%s> want: <Fixnum>",
356 rb_obj_classname(write_flag));
372 if (RTYPEDDATA_DATA(
self) == NULL) {
381 "grpc_call_set_credentials failed with %s (code=%d)",
402 char* tmp_str = NULL;
406 }
else if (
TYPE(
key) == T_STRING) {
410 rb_raise(rb_eTypeError,
411 "grpc_rb_md_ary_fill_hash_cb: bad type for key parameter");
417 rb_raise(rb_eArgError,
418 "'%s' is an invalid header key, must match [a-z0-9-_.]+", tmp_str);
426 if (
TYPE(val) == T_ARRAY) {
427 array_length = RARRAY_LEN(val);
429 for (
i = 0;
i < array_length;
i++) {
431 RSTRING_PTR(rb_ary_entry(val,
i)), RSTRING_LEN(rb_ary_entry(val,
i)));
436 rb_raise(rb_eArgError,
"Header value '%s' has invalid characters",
445 }
else if (
TYPE(val) == T_STRING) {
452 rb_raise(rb_eArgError,
"Header value '%s' has invalid characters",
461 rb_raise(rb_eArgError,
"Header values must be of type string or array");
480 if (
TYPE(val) == T_ARRAY) {
482 md_ary->
capacity += RARRAY_LEN(val);
495 VALUE md_ary_obj = Qnil;
496 if (md_ary_hash == Qnil) {
499 if (
TYPE(md_ary_hash) != T_HASH) {
500 rb_raise(rb_eTypeError,
"md_ary_convert: got <%s>, want <Hash>",
501 rb_obj_classname(md_ary_hash));
517 VALUE new_ary = Qnil;
519 VALUE
result = rb_hash_new();
522 for (
i = 0;
i < md_ary->
count;
i++) {
534 new_ary = rb_ary_new();
535 rb_ary_push(new_ary,
value);
553 rb_raise(rb_eTypeError,
"invalid operation : got <%s>, want <Fixnum>",
554 rb_obj_classname(
key));
557 switch (NUM2INT(
key)) {
566 rb_ary_push(ops_ary,
key);
569 rb_raise(rb_eTypeError,
"invalid operation : bad value %d", NUM2INT(
key));
586 rb_raise(rb_eTypeError,
"invalid code : got <%s>, want <Fixnum>",
587 rb_obj_classname(
code));
591 rb_raise(rb_eTypeError,
"invalid details : got <%s>, want <String>",
592 rb_obj_classname(
code));
596 *send_status_details =
632 unsigned write_flag) {
645 if (
array->metadata) {
646 for (
i = 0;
i <
array->count;
i++) {
686 VALUE this_op = Qnil;
687 VALUE this_value = Qnil;
688 VALUE ops_ary = rb_ary_new();
695 for (
i = 0;
i < (size_t)RARRAY_LEN(ops_ary);
i++) {
696 this_op = rb_ary_entry(ops_ary,
i);
697 this_value = rb_hash_aref(ops_hash, this_op);
699 switch (NUM2INT(this_op)) {
710 RSTRING_LEN(this_value));
743 rb_raise(rb_eTypeError,
"invalid operation : bad value %d",
757 Qnil, Qnil, Qnil, Qnil, NULL);
828 unsigned write_flag = 0;
829 void*
tag = (
void*)&st;
832 if (RTYPEDDATA_DATA(
self) == NULL) {
839 if (
TYPE(ops_hash) != T_HASH) {
840 rb_raise(rb_eTypeError,
"call#run_batch: ops hash should be a hash");
843 if (rb_write_flag != Qnil) {
844 write_flag = NUM2UINT(rb_write_flag);
857 "grpc_call_start_batch failed with %s (code=%d)",
876 VALUE grpc_rb_mWriteFlags =
878 rb_define_const(grpc_rb_mWriteFlags,
"BUFFER_HINT",
880 rb_define_const(grpc_rb_mWriteFlags,
"NO_COMPRESS",
886 VALUE grpc_rb_mRpcErrors =
888 rb_define_const(grpc_rb_mRpcErrors,
"OK", UINT2NUM(
GRPC_CALL_OK));
889 rb_define_const(grpc_rb_mRpcErrors,
"ERROR", UINT2NUM(
GRPC_CALL_ERROR));
890 rb_define_const(grpc_rb_mRpcErrors,
"NOT_ON_SERVER",
892 rb_define_const(grpc_rb_mRpcErrors,
"NOT_ON_CLIENT",
894 rb_define_const(grpc_rb_mRpcErrors,
"ALREADY_ACCEPTED",
896 rb_define_const(grpc_rb_mRpcErrors,
"ALREADY_INVOKED",
898 rb_define_const(grpc_rb_mRpcErrors,
"NOT_INVOKED",
900 rb_define_const(grpc_rb_mRpcErrors,
"ALREADY_FINISHED",
902 rb_define_const(grpc_rb_mRpcErrors,
"TOO_MANY_OPERATIONS",
904 rb_define_const(grpc_rb_mRpcErrors,
"INVALID_FLAGS",
915 rb_str_new2(
"unknown error"));
917 rb_str_new2(
"not available on a server"));
919 rb_str_new2(
"not available on a client"));
922 rb_str_new2(
"call is already accepted"));
924 rb_str_new2(
"call is already invoked"));
926 rb_str_new2(
"call is not yet invoked"));
929 rb_str_new2(
"call is already finished"));
932 rb_str_new2(
"outstanding read or write present"));
934 rb_str_new2(
"a bad flag was given"));
942 rb_define_const(grpc_rb_mCallOps,
"SEND_INITIAL_METADATA",
944 rb_define_const(grpc_rb_mCallOps,
"SEND_MESSAGE",
946 rb_define_const(grpc_rb_mCallOps,
"SEND_CLOSE_FROM_CLIENT",
948 rb_define_const(grpc_rb_mCallOps,
"SEND_STATUS_FROM_SERVER",
950 rb_define_const(grpc_rb_mCallOps,
"RECV_INITIAL_METADATA",
952 rb_define_const(grpc_rb_mCallOps,
"RECV_MESSAGE",
954 rb_define_const(grpc_rb_mCallOps,
"RECV_STATUS_ON_CLIENT",
956 rb_define_const(grpc_rb_mCallOps,
"RECV_CLOSE_ON_SERVER",
961 VALUE grpc_rb_mMetadataKeys =
963 rb_define_const(grpc_rb_mMetadataKeys,
"COMPRESSION_REQUEST_ALGORITHM",
1025 "BatchResult",
"send_message",
"send_metadata",
"send_close",
1026 "send_status",
"message",
"metadata",
"status",
"cancelled", NULL);
1038 return call->wrapped;
1044 if (
c == NULL || q == NULL) {
grpc_completion_queue * queue
static VALUE grpc_rb_call_get_trailing_metadata(VALUE self)
GPRAPI void grpc_slice_unref(grpc_slice s)
struct grpc_byte_buffer * send_message
const char * recv_status_debug_error_string
static VALUE grpc_run_batch_stack_build_result(run_batch_stack *st)
VALUE grpc_rb_slice_to_ruby_string(grpc_slice slice)
GRPCAPI grpc_call_error grpc_call_cancel(grpc_call *call, void *reserved)
@ GRPC_CALL_ERROR_ALREADY_INVOKED
grpc_metadata_array * trailing_metadata
grpc_status_code * status
@ GRPC_CALL_ERROR_TOO_MANY_OPERATIONS
VALUE grpc_rb_cannot_alloc(VALUE cls)
#define GRPC_RB_MEMSIZE_UNAVAILABLE
static void grpc_run_batch_stack_fill_ops(run_batch_stack *st, VALUE ops_hash)
struct grpc_op::grpc_op_data::grpc_op_send_initial_metadata send_initial_metadata
static VALUE grpc_rb_call_cancel_with_status(VALUE self, VALUE status_code, VALUE details)
#define GRPC_RB_GC_NOT_MARKED
GRPCAPI int grpc_header_key_is_legal(grpc_slice slice)
GRPCAPI char * grpc_call_get_peer(grpc_call *call)
static VALUE sym_cancelled
static void grpc_rb_call_destroy(void *p)
static VALUE grpc_rb_sBatchResult
@ GRPC_CALL_ERROR_NOT_ON_CLIENT
GPRAPI void gpr_free(void *ptr)
GRPCAPI int grpc_auth_context_peer_is_authenticated(const grpc_auth_context *ctx)
grpc_event rb_completion_queue_pluck(grpc_completion_queue *queue, void *tag, gpr_timespec deadline, void *reserved)
GPRAPI void * gpr_malloc(size_t size)
static VALUE grpc_rb_call_set_metadata(VALUE self, VALUE metadata)
GPRAPI gpr_timespec gpr_inf_future(gpr_clock_type type)
static int grpc_rb_md_ary_capacity_hash_cb(VALUE key, VALUE val, VALUE md_ary_obj)
static void grpc_run_batch_stack_cleanup(run_batch_stack *st)
grpc_metadata_array recv_metadata
static VALUE grpc_rb_eOutOfTime
@ GRPC_CALL_ERROR_NOT_ON_SERVER
grpc_metadata_array send_trailing_metadata
#define GRPC_WRITE_NO_COMPRESS
GRPCAPI void grpc_auth_context_release(grpc_auth_context *context)
static VALUE grpc_rb_call_set_credentials(VALUE self, VALUE credentials)
struct grpc_op::grpc_op_data::grpc_op_recv_message recv_message
const GRPCAPI grpc_auth_property * grpc_auth_property_iterator_next(grpc_auth_property_iterator *it)
grpc_byte_buffer * recv_message
VALUE grpc_rb_byte_buffer_to_s(grpc_byte_buffer *buffer)
static int grpc_rb_call_check_op_keys_hash_cb(VALUE key, VALUE val, VALUE ops_ary)
union grpc_op::grpc_op_data data
void grpc_rb_metadata_array_destroy_including_entries(grpc_metadata_array *array)
GPRAPI void * gpr_zalloc(size_t size)
GRPCAPI int grpc_header_nonbin_value_is_legal(grpc_slice slice)
static VALUE grpc_rb_call_get_metadata(VALUE self)
GRPCAPI void grpc_metadata_array_destroy(grpc_metadata_array *array)
struct run_batch_stack run_batch_stack
struct grpc_byte_buffer ** recv_message
static VALUE grpc_rb_call_run_batch(VALUE self, VALUE ops_hash)
grpc_status_code recv_status
static void grpc_rb_op_update_status_from_server(grpc_op *op, grpc_metadata_array *md_ary, grpc_slice *send_status_details, VALUE status)
@ GRPC_OP_RECV_INITIAL_METADATA
@ GRPC_CALL_ERROR_NOT_INVOKED
@ GRPC_OP_SEND_STATUS_FROM_SERVER
@ GRPC_CALL_ERROR_INVALID_FLAGS
static void * tag(intptr_t t)
grpc_call_credentials * grpc_rb_get_wrapped_call_credentials(VALUE v)
GRPCAPI void grpc_call_unref(grpc_call *call)
const char ** error_string
static VALUE grpc_rb_call_get_write_flag(VALUE self)
static int grpc_rb_md_ary_fill_hash_cb(VALUE key, VALUE val, VALUE md_ary_obj)
static VALUE grpc_rb_call_get_peer(VALUE self)
struct grpc_call grpc_call
#define GRPC_WRITE_BUFFER_HINT
static void Init_grpc_error_codes()
#define GRPC_SLICE_START_PTR(slice)
GPRAPI grpc_slice grpc_slice_from_static_string(const char *source)
grpc_metadata * trailing_metadata
static VALUE sym_send_close
GRPCAPI grpc_auth_context * grpc_call_auth_context(grpc_call *call)
static VALUE grpc_rb_call_close(VALUE self)
static const rb_data_type_t grpc_call_data_type
grpc_channel_wrapper * wrapper
#define GRPC_RB_GC_DONT_FREE
grpc_slice recv_status_details
static VALUE grpc_rb_call_set_write_flag(VALUE self, VALUE write_flag)
static VALUE grpc_rb_call_set_trailing_metadata(VALUE self, VALUE metadata)
const rb_data_type_t grpc_rb_md_ary_data_type
grpc_metadata_array recv_trailing_metadata
grpc_slice * status_details
static VALUE sym_send_metadata
static grpc_slice details
GRPCAPI grpc_call_error grpc_call_set_credentials(grpc_call *call, grpc_call_credentials *creds)
GPRAPI char * grpc_slice_to_c_string(grpc_slice s)
struct grpc_op::grpc_op_data::grpc_op_recv_close_on_server recv_close_on_server
@ GRPC_CALL_ERROR_ALREADY_ACCEPTED
VALUE rb_error_code_details
#define GRPC_X509_PEM_CERT_PROPERTY_NAME
static void Init_grpc_metadata_keys()
GPRAPI grpc_slice grpc_slice_from_copied_buffer(const char *source, size_t len)
static VALUE grpc_rb_call_get_status(VALUE self)
static void Init_grpc_write_flags()
struct grpc_op::grpc_op_data::grpc_op_send_status_from_server send_status_from_server
static VALUE sym_send_message
#define GRPC_COMPRESSION_REQUEST_ALGORITHM_MD_KEY
void grpc_rb_completion_queue_destroy(grpc_completion_queue *cq)
static VALUE grpc_rb_call_set_status(VALUE self, VALUE status)
@ GRPC_OP_SEND_INITIAL_METADATA
static void Init_grpc_op_codes()
#define ALLOC(class_name)
struct grpc_op::grpc_op_data::grpc_op_send_message send_message
VALUE grpc_rb_wrap_call(grpc_call *c, grpc_completion_queue *q)
VALUE grpc_rb_cannot_init_copy(VALUE copy, VALUE self)
static VALUE sym_send_status
struct grpc_op::grpc_op_data::grpc_op_recv_status_on_client recv_status_on_client
size_t trailing_metadata_count
GRPCAPI int grpc_is_binary_header(grpc_slice slice)
static VALUE grpc_rb_call_cancel(VALUE self)
GRPCAPI void grpc_byte_buffer_destroy(grpc_byte_buffer *bb)
const char * grpc_call_error_detail_of(grpc_call_error err)
VALUE grpc_rb_md_ary_to_h(grpc_metadata_array *md_ary)
VALUE grpc_rb_cannot_init(VALUE self)
void grpc_ruby_fork_guard()
static ID id_trailing_metadata
grpc_call * grpc_rb_get_wrapped_call(VALUE v)
grpc_metadata_array send_metadata
@ GRPC_OP_RECV_CLOSE_ON_SERVER
@ GRPC_CALL_ERROR_ALREADY_FINISHED
GRPCAPI grpc_auth_property_iterator grpc_auth_context_find_properties_by_name(const grpc_auth_context *ctx, const char *name)
struct grpc_op::grpc_op_data::grpc_op_recv_initial_metadata recv_initial_metadata
grpc_slice * status_details
static void destroy_call(grpc_rb_call *call)
grpc_byte_buffer * grpc_rb_s_to_byte_buffer(char *string, size_t length)
@ GRPC_OP_RECV_STATUS_ON_CLIENT
static VALUE grpc_rb_cCall
grpc_slice send_status_details
GRPCAPI grpc_call_error grpc_call_start_batch(grpc_call *call, const grpc_op *ops, size_t nops, void *tag, void *reserved)
static void grpc_run_batch_stack_init(run_batch_stack *st, unsigned write_flag)
struct grpc_rb_call grpc_rb_call
GRPCAPI grpc_call_error grpc_call_cancel_with_status(grpc_call *call, grpc_status_code status, const char *description, void *reserved)
@ GRPC_OP_SEND_CLOSE_FROM_CLIENT
void grpc_rb_md_ary_convert(VALUE md_ary_hash, grpc_metadata_array *md_ary)
GRPCAPI void grpc_metadata_array_init(grpc_metadata_array *array)
static VALUE grpc_rb_call_get_peer_cert(VALUE self)
grpc
Author(s):
autogenerated on Fri May 16 2025 02:59:59