diff --git a/src/core/ext/filters/message_size/message_size_filter.cc b/src/core/ext/filters/message_size/message_size_filter.cc index 89fdab6fae8..5579fbd620c 100644 --- a/src/core/ext/filters/message_size/message_size_filter.cc +++ b/src/core/ext/filters/message_size/message_size_filter.cc @@ -117,17 +117,38 @@ void MessageSizeParser::Register() { size_t MessageSizeParser::ParserIndex() { return g_message_size_parser_index; } +namespace { +const grpc_arg* ChannelArgsFindLast(const grpc_channel_args* args, + const char* name) { + grpc_arg* arg = nullptr; + if (args != nullptr) { + for (size_t i = 0; i < args->num_args; ++i) { + if (strcmp(args->args[i].key, name) == 0) { + arg = &args->args[i]; + } + } + } + return arg; +} +} // namespace + int GetMaxRecvSizeFromChannelArgs(const grpc_channel_args* args) { if (grpc_channel_args_want_minimal_stack(args)) return -1; - return grpc_channel_args_find_integer( - args, GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH, + // We are not using grpc_channel_args_find_integer here because of ordering + // issues. The logic below maintains existing behavior by choosing the last + // matching channel argument instead of the first. + return grpc_channel_arg_get_integer( + ChannelArgsFindLast(args, GRPC_ARG_MAX_RECEIVE_MESSAGE_LENGTH), {GRPC_DEFAULT_MAX_RECV_MESSAGE_LENGTH, -1, INT_MAX}); } int GetMaxSendSizeFromChannelArgs(const grpc_channel_args* args) { if (grpc_channel_args_want_minimal_stack(args)) return -1; - return grpc_channel_args_find_integer( - args, GRPC_ARG_MAX_SEND_MESSAGE_LENGTH, + // We are not using grpc_channel_args_find_integer here because of ordering + // issues. The logic below maintains existing behavior by choosing the last + // matching channel argument instead of the first. + return grpc_channel_arg_get_integer( + ChannelArgsFindLast(args, GRPC_ARG_MAX_SEND_MESSAGE_LENGTH), {GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH, -1, INT_MAX}); }