You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Sonarr/src/NzbDrone.Common/Http/JsonRpcRequestBuilder.cs

125 lines
4.1 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using Newtonsoft.Json;
using NzbDrone.Common.Serializer;
namespace NzbDrone.Common.Http
{
public class JsonRpcRequestBuilder : HttpRequestBuilder
{
public static HttpAccept JsonRpcHttpAccept = new HttpAccept("application/json-rpc, application/json");
public static string JsonRpcContentType = "application/json";
public string JsonMethod { get; private set; }
public List<object> JsonParameters { get; private set; }
public bool JsonParametersToObject { get; private set; }
public JsonRpcRequestBuilder(string baseUrl)
: base(baseUrl)
{
Method = HttpMethod.Post;
JsonParameters = new List<object>();
JsonParametersToObject = false;
}
public JsonRpcRequestBuilder(string baseUrl, string method, IEnumerable<object> parameters)
: base(baseUrl)
{
Method = HttpMethod.Post;
JsonMethod = method;
JsonParameters = parameters.ToList();
JsonParametersToObject = false;
}
public JsonRpcRequestBuilder(string baseUrl, string method, bool paramToObj, IEnumerable<object> parameters)
: base(baseUrl)
{
Method = HttpMethod.Post;
JsonMethod = method;
JsonParameters = parameters.ToList();
JsonParametersToObject = paramToObj;
}
public override HttpRequestBuilder Clone()
{
var clone = base.Clone() as JsonRpcRequestBuilder;
clone.JsonParameters = new List<object>(JsonParameters);
return clone;
}
public JsonRpcRequestBuilder Call(string method, params object[] parameters)
{
var clone = Clone() as JsonRpcRequestBuilder;
clone.JsonMethod = method;
clone.JsonParameters = parameters.ToList();
return clone;
}
protected override void Apply(HttpRequest request)
{
base.Apply(request);
request.Headers.ContentType = JsonRpcContentType;
var parameterAsArray = new object[JsonParameters.Count];
var parameterSummary = new string[JsonParameters.Count];
for (var i = 0; i < JsonParameters.Count; i++)
{
ConvertParameter(JsonParameters[i], out parameterAsArray[i], out parameterSummary[i]);
}
object paramFinal = parameterAsArray;
if (JsonParametersToObject)
{
var left = parameterAsArray.Skip(0).Where((v, i) => i % 2 == 0);
var right = parameterAsArray.Skip(1).Where((v, i) => i % 2 == 0);
var parameterAsDict = left.Zip(right, Tuple.Create).ToDictionary(x => x.Item1.ToString(), x => x.Item2);
paramFinal = parameterAsDict;
}
var message = new Dictionary<string, object>();
message["jsonrpc"] = "2.0";
message["method"] = JsonMethod;
message["params"] = paramFinal;
message["id"] = CreateNextId();
request.SetContent(message.ToJson());
if (request.ContentSummary == null)
{
request.ContentSummary = string.Format("{0}({1})", JsonMethod, string.Join(", ", parameterSummary));
}
}
private void ConvertParameter(object value, out object data, out string summary)
{
if (value is byte[])
{
data = Convert.ToBase64String(value as byte[]);
summary = string.Format("[blob {0} bytes]", (value as byte[]).Length);
}
else if (value is Array && ((Array)value).Length > 0)
{
data = value;
summary = "[...]";
}
else
{
data = value;
summary = JsonConvert.SerializeObject(data);
}
}
public string CreateNextId()
{
return Guid.NewGuid().ToString().Substring(0, 8);
}
}
}