Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 32 additions & 21 deletions Json-Rpc/Handler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)
return PostProcess(Rpc, response, RpcContext);
}

object[] parameters = null;
Dictionary<string, object> parameters = new Dictionary<string, object>();
bool expectsRefException = false;
var metaDataParamCount = metadata.parameters.Count(x => x != null);

Expand All @@ -245,24 +245,26 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)
paramCount++;
expectsRefException = true;
}
parameters = new object[paramCount];

if (Rpc.Params is Newtonsoft.Json.Linq.JArray)
{
var jarr = ((Newtonsoft.Json.Linq.JArray)Rpc.Params);
for (int i = 0; i < loopCt && i < metadata.parameters.Length; i++)
{
parameters[i] = CleanUpParameter(jarr[i], metadata.parameters[i]);
parameters.Add(metadata.parameters[i].Name, CleanUpParameter(jarr[i], metadata.parameters[i]));
}
}
else if (Rpc.Params is Newtonsoft.Json.Linq.JObject)
{
var asDict = Rpc.Params as IDictionary<string, Newtonsoft.Json.Linq.JToken>;
var keys = asDict.Keys.ToList();
var metaParamsList = metadata.parameters.ToList();
for (int i = 0; i < loopCt && i < metadata.parameters.Length; i++)
{
if (asDict.ContainsKey(metadata.parameters[i].Name) == true)
var param = metadata.parameters.Where(x => x.Name == keys[i]).FirstOrDefault();
if (param != null)
{
parameters[i] = CleanUpParameter(asDict[metadata.parameters[i].Name], metadata.parameters[i]);
parameters.Add(keys[i], CleanUpParameter(asDict[keys[i]], param));
continue;
}
else
Expand All @@ -273,7 +275,7 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)
new JsonRpcException(-32602,
"Invalid params",
string.Format("Named parameter '{0}' was not present.",
metadata.parameters[i].Name)
keys[i])
)),
Id = Rpc.Id
};
Expand All @@ -285,17 +287,20 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)
// Optional Parameter support
// check if we still miss parameters compared to metadata which may include optional parameters.
// if the rpc-call didn't supply a value for an optional parameter, we should be assinging the default value of it.
if (parameters.Length < metaDataParamCount && metadata.defaultValues.Length > 0) // rpc call didn't set values for all optional parameters, so we need to assign the default values for them.
if (parameters.Count < metaDataParamCount && metadata.defaultValues.Length > 0) // rpc call didn't set values for all optional parameters, so we need to assign the default values for them.
{
var suppliedParamsCount = parameters.Length; // the index we should start storing default values of optional parameters.
var missingParamsCount = metaDataParamCount - parameters.Length; // the amount of optional parameters without a value set by rpc-call.
Array.Resize(ref parameters, parameters.Length + missingParamsCount); // resize the array to include all optional parameters.

for (int paramIndex = parameters.Length - 1, defaultIndex = metadata.defaultValues.Length - 1; // fill missing parameters from the back
paramIndex >= suppliedParamsCount && defaultIndex >= 0; // to don't overwrite supplied ones.
paramIndex--, defaultIndex--)
var suppliedParamsCount = parameters.Count; // the index we should start storing default values of optional parameters.
var missingParamsCount = metaDataParamCount - parameters.Count; // the amount of optional parameters without a value set by rpc-call.

//for (int paramIndex = parameters.Count - 1, defaultIndex = metadata.defaultValues.Length - 1; // add missing parameters
// paramIndex >= suppliedParamsCount && defaultIndex >= 0;
// paramIndex--, defaultIndex--)
//{
// parameters.Add(metadata.defaultValues[defaultIndex].Name, metadata.defaultValues[defaultIndex].Value);
//}
foreach (var item in metadata.defaultValues) // add missing parameters
{
parameters[paramIndex] = metadata.defaultValues[defaultIndex].Value;
if (!parameters.ContainsKey(item.Name)) parameters.Add(item.Name, item.Value);
}

if (missingParamsCount > metadata.defaultValues.Length)
Expand All @@ -315,7 +320,7 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)
}
}

if (parameters.Length != metaDataParamCount)
if (parameters.Count != metaDataParamCount)
{
JsonResponse response = new JsonResponse()
{
Expand All @@ -324,7 +329,7 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)
"Invalid params",
string.Format("Expecting {0} parameters, and received {1}",
metadata.parameters.Length,
parameters.Length)
parameters.Count)
)),
Id = Rpc.Id
};
Expand All @@ -333,18 +338,24 @@ public JsonResponse Handle(JsonRequest Rpc, Object RpcContext = null)

try
{
var results = handle.DynamicInvoke(parameters);

var methodParamsList = handle.Method.GetParameters();
object[] paras = new object[methodParamsList.Length];
for (int i = 0; i < methodParamsList.Length; i++)
{
paras[i] = parameters[metadata.parameters[i].Name];
}
var results = handle.DynamicInvoke(paras);

var last = parameters.LastOrDefault();
var contextException = RpcGetAndRemoveRpcException();
JsonResponse response = null;
if (contextException != null)
{
response = new JsonResponse() { Error = ProcessException(Rpc, contextException), Id = Rpc.Id };
}
else if (expectsRefException && last != null && last is JsonRpcException)
else if (expectsRefException && last.Value != null && last.Value is JsonRpcException)
{
response = new JsonResponse() { Error = ProcessException(Rpc, last as JsonRpcException), Id = Rpc.Id };
response = new JsonResponse() { Error = ProcessException(Rpc, last.Value as JsonRpcException), Id = Rpc.Id };
}
else
{
Expand Down