From 8ddd9ecf22b32dc77d342399d7ec1af53574e9a6 Mon Sep 17 00:00:00 2001 From: JKorf Date: Fri, 22 Mar 2024 16:41:19 +0100 Subject: [PATCH] Some small improvements and fixes --- .../SystemTextJson/EnumConverter.cs | 7 +- CryptoExchange.Net/ExtensionMethods.cs | 69 +++++++++++++++---- .../Interfaces/ISymbolOrderBook.cs | 9 ++- CryptoExchange.Net/Objects/Enums.cs | 13 +++- 4 files changed, 76 insertions(+), 22 deletions(-) diff --git a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs index 29126ca..04732e2 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs @@ -92,9 +92,10 @@ namespace CryptoExchange.Net.Converters.SystemTextJson { JsonTokenType.String => reader.GetString(), JsonTokenType.Number => reader.GetInt16().ToString(), - JsonTokenType.True => "true", - JsonTokenType.False => "false", - _ => null + JsonTokenType.True => reader.GetBoolean().ToString(), + JsonTokenType.False => reader.GetBoolean().ToString(), + JsonTokenType.Null => null, + _ => throw new Exception("Invalid token type for enum deserialization: " + reader.TokenType) }; if (string.IsNullOrEmpty(stringValue)) diff --git a/CryptoExchange.Net/ExtensionMethods.cs b/CryptoExchange.Net/ExtensionMethods.cs index c28d6d0..d8b3091 100644 --- a/CryptoExchange.Net/ExtensionMethods.cs +++ b/CryptoExchange.Net/ExtensionMethods.cs @@ -10,6 +10,11 @@ using System.Text; using System.Web; using CryptoExchange.Net.Objects; using Microsoft.Extensions.Logging; +using System.Globalization; +using System.Collections; +using System.Net.Http; +using System.Data.Common; +using Newtonsoft.Json.Linq; namespace CryptoExchange.Net { @@ -59,7 +64,7 @@ namespace CryptoExchange.Net /// Whether or not the values should be url encoded /// How to serialize array parameters /// - public static string CreateParamString(this Dictionary parameters, bool urlEncodeValues, ArrayParametersSerialization serializationType) + public static string CreateParamString(this IDictionary parameters, bool urlEncodeValues, ArrayParametersSerialization serializationType) { var uriString = string.Empty; var arraysParameters = parameters.Where(p => p.Value.GetType().IsArray).ToList(); @@ -67,17 +72,22 @@ namespace CryptoExchange.Net { if (serializationType == ArrayParametersSerialization.Array) { - uriString += $"{string.Join("&", ((object[])(urlEncodeValues ? Uri.EscapeDataString(arrayEntry.Value.ToString()) : arrayEntry.Value)).Select(v => $"{arrayEntry.Key}[]={v}"))}&"; + uriString += $"{string.Join("&", ((object[])(urlEncodeValues ? Uri.EscapeDataString(arrayEntry.Value.ToString()) : arrayEntry.Value)).Select(v => $"{arrayEntry.Key}[]={string.Format(CultureInfo.InvariantCulture, "{0}", v)}"))}&"; + } + else if (serializationType == ArrayParametersSerialization.MultipleValues) + { + var array = (Array)arrayEntry.Value; + uriString += string.Join("&", array.OfType().Select(a => $"{arrayEntry.Key}={Uri.EscapeDataString(string.Format(CultureInfo.InvariantCulture, "{0}", a))}")); + uriString += "&"; } else { var array = (Array)arrayEntry.Value; - uriString += string.Join("&", array.OfType().Select(a => $"{arrayEntry.Key}={Uri.EscapeDataString(a.ToString())}")); - uriString += "&"; + uriString += $"{arrayEntry.Key}=[{string.Join(",", array.OfType().Select(a => string.Format(CultureInfo.InvariantCulture, "{0}", a)))}]&"; } } - uriString += $"{string.Join("&", parameters.Where(p => !p.Value.GetType().IsArray).Select(s => $"{s.Key}={(urlEncodeValues ? Uri.EscapeDataString(s.Value.ToString()) : s.Value)}"))}"; + uriString += $"{string.Join("&", parameters.Where(p => !p.Value.GetType().IsArray).Select(s => $"{s.Key}={(urlEncodeValues ? Uri.EscapeDataString(string.Format(CultureInfo.InvariantCulture, "{0}", s.Value)) : string.Format(CultureInfo.InvariantCulture, "{0}", s.Value))}"))}"; uriString = uriString.TrimEnd('&'); return uriString; } @@ -87,7 +97,7 @@ namespace CryptoExchange.Net /// /// /// - public static string ToFormData(this SortedDictionary parameters) + public static string ToFormData(this IDictionary parameters) { var formData = HttpUtility.ParseQueryString(string.Empty); foreach (var kvp in parameters) @@ -96,16 +106,15 @@ namespace CryptoExchange.Net { var array = (Array)kvp.Value; foreach (var value in array) - formData.Add(kvp.Key, value.ToString()); + formData.Add(kvp.Key, string.Format(CultureInfo.InvariantCulture, "{0}", value)); } else { - formData.Add(kvp.Key, kvp.Value.ToString()); + formData.Add(kvp.Key, string.Format(CultureInfo.InvariantCulture, "{0}", kvp.Value)); } } return formData.ToString(); } - /// /// Get the string the secure string is representing @@ -349,10 +358,26 @@ namespace CryptoExchange.Net var httpValueCollection = HttpUtility.ParseQueryString(string.Empty); foreach (var parameter in parameters) { - if(parameter.Value.GetType().IsArray) + if (parameter.Value.GetType().IsArray) { - foreach (var item in (object[])parameter.Value) - httpValueCollection.Add(arraySerialization == ArrayParametersSerialization.Array ? parameter.Key + "[]" : parameter.Key, item.ToString()); + if (arraySerialization == ArrayParametersSerialization.JsonArray) + { + httpValueCollection.Add(parameter.Key, $"[{string.Join(",", (object[])parameter.Value)}]"); + } + else + { + foreach (var item in (object[])parameter.Value) + { + if (arraySerialization == ArrayParametersSerialization.Array) + { + httpValueCollection.Add(parameter.Key + "[]", item.ToString()); + } + else + { + httpValueCollection.Add(parameter.Key, item.ToString()); + } + } + } } else { @@ -382,8 +407,24 @@ namespace CryptoExchange.Net { if (parameter.Value.GetType().IsArray) { - foreach (var item in (object[])parameter.Value) - httpValueCollection.Add(arraySerialization == ArrayParametersSerialization.Array ? parameter.Key + "[]" : parameter.Key, item.ToString()); + if (arraySerialization == ArrayParametersSerialization.JsonArray) + { + httpValueCollection.Add(parameter.Key, $"[{string.Join(",", (object[])parameter.Value)}]"); + } + else + { + foreach (var item in (object[])parameter.Value) + { + if (arraySerialization == ArrayParametersSerialization.Array) + { + httpValueCollection.Add(parameter.Key + "[]", item.ToString()); + } + else + { + httpValueCollection.Add(parameter.Key, item.ToString()); + } + } + } } else { diff --git a/CryptoExchange.Net/Interfaces/ISymbolOrderBook.cs b/CryptoExchange.Net/Interfaces/ISymbolOrderBook.cs index ec39d27..120ad7e 100644 --- a/CryptoExchange.Net/Interfaces/ISymbolOrderBook.cs +++ b/CryptoExchange.Net/Interfaces/ISymbolOrderBook.cs @@ -12,9 +12,14 @@ namespace CryptoExchange.Net.Interfaces public interface ISymbolOrderBook { /// - /// Identifier + /// The exchange the book is for /// - string Id { get; } + string Exchange { get; } + + /// + /// The Api the book is for + /// + string Api { get; } /// /// The status of the order book. Order book is up to date when the status is `Synced` diff --git a/CryptoExchange.Net/Objects/Enums.cs b/CryptoExchange.Net/Objects/Enums.cs index d91a341..514af9e 100644 --- a/CryptoExchange.Net/Objects/Enums.cs +++ b/CryptoExchange.Net/Objects/Enums.cs @@ -99,15 +99,22 @@ /// Define how array parameters should be send /// public enum ArrayParametersSerialization +#pragma warning disable CS1570 // XML comment has badly formed XML { /// - /// Send multiple key=value for each entry + /// Send as key=value1&key=value2 /// MultipleValues, + /// - /// Create an []=value array + /// Send as key[]=value1&key[]=value2 /// - Array + Array, + /// + /// Send as key=[value1, value2] + /// + JsonArray +#pragma warning restore CS1570 // XML comment has badly formed XML } ///