Commit 2120dcf1 authored by Marc Gravell's avatar Marc Gravell

#201 - give specific message when too many arguments are involved

parent 3d7dbd60
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization;
using System.Text; using System.Text;
namespace StackExchange.Redis namespace StackExchange.Redis
...@@ -30,6 +31,13 @@ internal static Exception CommandDisabled(bool includeDetail, RedisCommand comma ...@@ -30,6 +31,13 @@ internal static Exception CommandDisabled(bool includeDetail, RedisCommand comma
if (includeDetail) AddDetail(ex, message, server, s); if (includeDetail) AddDetail(ex, message, server, s);
return ex; return ex;
} }
internal static Exception TooManyArgs(bool includeDetail, string command, Message message, ServerEndPoint server, int required)
{
string s = GetLabel(includeDetail, command, message);
var ex = new RedisCommandException($"This operation would involve too many arguments ({required} vs the redis limit of {PhysicalConnection.REDIS_MAX_ARGS}): {s}");
if (includeDetail) AddDetail(ex, message, server, s);
return ex;
}
internal static Exception CommandDisabled(bool includeDetail, string command, Message message, ServerEndPoint server) internal static Exception CommandDisabled(bool includeDetail, string command, Message message, ServerEndPoint server)
{ {
string s = GetLabel(includeDetail, command, message); string s = GetLabel(includeDetail, command, message);
......
...@@ -474,8 +474,14 @@ internal void WriteHeader(RedisCommand command, int arguments) ...@@ -474,8 +474,14 @@ internal void WriteHeader(RedisCommand command, int arguments)
WriteRaw(outStream, arguments + 1); WriteRaw(outStream, arguments + 1);
WriteUnified(outStream, commandBytes); WriteUnified(outStream, commandBytes);
} }
internal const int REDIS_MAX_ARGS = 1024 * 1024; // there is a <= 1024*1024 max constraint inside redis itself: https://github.com/antirez/redis/blob/6c60526db91e23fb2d666fc52facc9a11780a2a3/src/networking.c#L1024
internal void WriteHeader(string command, int arguments) internal void WriteHeader(string command, int arguments)
{ {
if(arguments >= REDIS_MAX_ARGS) // using >= here because we will be adding 1 for the command itself (which is an arg for the purposes of the multi-bulk protocol)
{
throw ExceptionFactory.TooManyArgs(Multiplexer.IncludeDetailInExceptions, command, null, Bridge.ServerEndPoint, arguments + 1);
}
var commandBytes = Multiplexer.CommandMap.GetBytes(command); var commandBytes = Multiplexer.CommandMap.GetBytes(command);
if (commandBytes == null) if (commandBytes == null)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment