|
|
|
@ -40,8 +40,9 @@ |
|
|
|
|
|
|
|
|
|
#include "src/core/lib/channel/channel_args.h" |
|
|
|
|
|
|
|
|
|
#define DEFAULT_MAX_SEND_MESSAGE_LENGTH -1 // Unlimited.
|
|
|
|
|
// The protobuf library will (by default) start warning at 100 megs.
|
|
|
|
|
#define DEFAULT_MAX_MESSAGE_LENGTH (4 * 1024 * 1024) |
|
|
|
|
#define DEFAULT_MAX_RECV_MESSAGE_LENGTH (4 * 1024 * 1024) |
|
|
|
|
|
|
|
|
|
typedef struct call_data { |
|
|
|
|
// Receive closures are chained: we inject this closure as the
|
|
|
|
@ -55,8 +56,8 @@ typedef struct call_data { |
|
|
|
|
} call_data; |
|
|
|
|
|
|
|
|
|
typedef struct channel_data { |
|
|
|
|
size_t max_send_size; |
|
|
|
|
size_t max_recv_size; |
|
|
|
|
long max_send_size; |
|
|
|
|
long max_recv_size; |
|
|
|
|
} channel_data; |
|
|
|
|
|
|
|
|
|
// Callback invoked when we receive a message. Here we check the max
|
|
|
|
@ -66,7 +67,7 @@ static void recv_message_ready(grpc_exec_ctx* exec_ctx, void* user_data, |
|
|
|
|
grpc_call_element* elem = user_data; |
|
|
|
|
call_data* calld = elem->call_data; |
|
|
|
|
channel_data* chand = elem->channel_data; |
|
|
|
|
if (*calld->recv_message != NULL && |
|
|
|
|
if (*calld->recv_message != NULL && chand->max_recv_size >= 0 && |
|
|
|
|
(*calld->recv_message)->length > chand->max_recv_size) { |
|
|
|
|
char* message_string; |
|
|
|
|
gpr_asprintf( |
|
|
|
@ -88,7 +89,7 @@ static void start_transport_stream_op(grpc_exec_ctx* exec_ctx, |
|
|
|
|
call_data* calld = elem->call_data; |
|
|
|
|
channel_data* chand = elem->channel_data; |
|
|
|
|
// Check max send message size.
|
|
|
|
|
if (op->send_message != NULL && |
|
|
|
|
if (op->send_message != NULL && chand->max_send_size >= 0 && |
|
|
|
|
op->send_message->length > chand->max_send_size) { |
|
|
|
|
char* message_string; |
|
|
|
|
gpr_asprintf(&message_string, "Sent message larger than max (%u vs. %lu)", |
|
|
|
@ -130,17 +131,20 @@ static void init_channel_elem(grpc_exec_ctx* exec_ctx, |
|
|
|
|
GPR_ASSERT(!args->is_last); |
|
|
|
|
channel_data* chand = elem->channel_data; |
|
|
|
|
memset(chand, 0, sizeof(*chand)); |
|
|
|
|
chand->max_send_size = DEFAULT_MAX_MESSAGE_LENGTH; |
|
|
|
|
chand->max_recv_size = DEFAULT_MAX_MESSAGE_LENGTH; |
|
|
|
|
const grpc_integer_options options = {DEFAULT_MAX_MESSAGE_LENGTH, 0, INT_MAX}; |
|
|
|
|
chand->max_send_size = DEFAULT_MAX_SEND_MESSAGE_LENGTH; |
|
|
|
|
chand->max_recv_size = DEFAULT_MAX_RECV_MESSAGE_LENGTH; |
|
|
|
|
for (size_t i = 0; i < args->channel_args->num_args; ++i) { |
|
|
|
|
if (strcmp(args->channel_args->args[i].key, |
|
|
|
|
GRPC_ARG_MAX_SEND_MESSAGE_LENGTH) == 0) { |
|
|
|
|
const grpc_integer_options options = {DEFAULT_MAX_SEND_MESSAGE_LENGTH, 0, |
|
|
|
|
INT_MAX}; |
|
|
|
|
chand->max_send_size = (size_t)grpc_channel_arg_get_integer( |
|
|
|
|
&args->channel_args->args[i], options); |
|
|
|
|
} |
|
|
|
|
if (strcmp(args->channel_args->args[i].key, |
|
|
|
|
GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH) == 0) { |
|
|
|
|
const grpc_integer_options options = {DEFAULT_MAX_RECV_MESSAGE_LENGTH, 0, |
|
|
|
|
INT_MAX}; |
|
|
|
|
chand->max_recv_size = (size_t)grpc_channel_arg_get_integer( |
|
|
|
|
&args->channel_args->args[i], options); |
|
|
|
|
} |
|
|
|
|