static void* method_config_convert_value( const grpc_method_config* method_config) { message_size_limits* value = gpr_malloc(sizeof(message_size_limits)); const int32_t* max_request_message_bytes = grpc_method_config_get_max_request_message_bytes(method_config); value->max_send_size = max_request_message_bytes != NULL ? *max_request_message_bytes : -1; const int32_t* max_response_message_bytes = grpc_method_config_get_max_response_message_bytes(method_config); value->max_recv_size = max_response_message_bytes != NULL ? *max_response_message_bytes : -1; return value; }
// Constructor for call_data. static grpc_error* init_call_elem(grpc_exec_ctx* exec_ctx, grpc_call_element* elem, grpc_call_element_args* args) { channel_data* chand = elem->channel_data; call_data* calld = elem->call_data; calld->next_recv_message_ready = NULL; grpc_closure_init(&calld->recv_message_ready, recv_message_ready, elem); // Get max sizes from channel data, then merge in per-method config values. // Note: Per-method config is only available on the client, so we // apply the max request size to the send limit and the max response // size to the receive limit. calld->max_send_size = chand->max_send_size; calld->max_recv_size = chand->max_recv_size; if (chand->method_config_table != NULL) { grpc_method_config* method_config = grpc_method_config_table_get_method_config(chand->method_config_table, args->path); if (method_config != NULL) { const int32_t* max_request_message_bytes = grpc_method_config_get_max_request_message_bytes(method_config); if (max_request_message_bytes != NULL && (*max_request_message_bytes < calld->max_send_size || calld->max_send_size < 0)) { calld->max_send_size = *max_request_message_bytes; } const int32_t* max_response_message_bytes = grpc_method_config_get_max_response_message_bytes(method_config); if (max_response_message_bytes != NULL && (*max_response_message_bytes < calld->max_recv_size || calld->max_recv_size < 0)) { calld->max_recv_size = *max_response_message_bytes; } } } return GRPC_ERROR_NONE; }