diff --git a/CryptoExchange.Net.UnitTests/CallResultTests.cs b/CryptoExchange.Net.UnitTests/CallResultTests.cs index dd52d41..ab75100 100644 --- a/CryptoExchange.Net.UnitTests/CallResultTests.cs +++ b/CryptoExchange.Net.UnitTests/CallResultTests.cs @@ -112,7 +112,7 @@ namespace CryptoExchange.Net.UnitTests { var result = new WebCallResult( System.Net.HttpStatusCode.OK, - new List>>(), + new KeyValuePair[0], TimeSpan.FromSeconds(1), null, "{}", @@ -120,7 +120,7 @@ namespace CryptoExchange.Net.UnitTests "https://test.com/api", null, HttpMethod.Get, - new List>>(), + new KeyValuePair[0], ResultDataSource.Server, new TestObjectResult(), null); @@ -142,7 +142,7 @@ namespace CryptoExchange.Net.UnitTests { var result = new WebCallResult( System.Net.HttpStatusCode.OK, - new List>>(), + new KeyValuePair[0], TimeSpan.FromSeconds(1), null, "{}", @@ -150,7 +150,7 @@ namespace CryptoExchange.Net.UnitTests "https://test.com/api", null, HttpMethod.Get, - new List>>(), + new KeyValuePair[0], ResultDataSource.Server, new TestObjectResult(), null); diff --git a/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs b/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs index 8d1ef36..f1841d3 100644 --- a/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs +++ b/CryptoExchange.Net.UnitTests/TestImplementations/TestRestClient.cs @@ -17,6 +17,7 @@ using Microsoft.Extensions.Logging; using CryptoExchange.Net.Clients; using CryptoExchange.Net.SharedApis; using Microsoft.Extensions.Options; +using System.Linq; namespace CryptoExchange.Net.UnitTests.TestImplementations { @@ -49,13 +50,13 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations response.Setup(c => c.IsSuccessStatusCode).Returns(true); response.Setup(c => c.GetResponseStreamAsync()).Returns(Task.FromResult((Stream)responseStream)); - var headers = new Dictionary>(); + var headers = new Dictionary(); var request = new Mock(); request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com")); request.Setup(c => c.GetResponseAsync(It.IsAny())).Returns(Task.FromResult(response.Object)); request.Setup(c => c.SetContent(It.IsAny(), It.IsAny())).Callback(new Action((content, type) => { request.Setup(r => r.Content).Returns(content); })); - request.Setup(c => c.AddHeader(It.IsAny(), It.IsAny())).Callback((key, val) => headers.Add(key, new List { val })); - request.Setup(c => c.GetHeaders()).Returns(() => headers); + request.Setup(c => c.AddHeader(It.IsAny(), It.IsAny())).Callback((key, val) => headers.Add(key, new string[] { val })); + request.Setup(c => c.GetHeaders()).Returns(() => headers.ToArray()); var factory = Mock.Get(Api1.RequestFactory); factory.Setup(c => c.Create(It.IsAny(), It.IsAny(), It.IsAny())) @@ -84,7 +85,7 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations var request = new Mock(); request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com")); - request.Setup(c => c.GetHeaders()).Returns(new Dictionary>()); + request.Setup(c => c.GetHeaders()).Returns(new KeyValuePair[0]); request.Setup(c => c.GetResponseAsync(It.IsAny())).Throws(we); var factory = Mock.Get(Api1.RequestFactory); @@ -108,12 +109,12 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations response.Setup(c => c.IsSuccessStatusCode).Returns(false); response.Setup(c => c.GetResponseStreamAsync()).Returns(Task.FromResult((Stream)responseStream)); - var headers = new Dictionary>(); + var headers = new List>(); var request = new Mock(); request.Setup(c => c.Uri).Returns(new Uri("http://www.test.com")); request.Setup(c => c.GetResponseAsync(It.IsAny())).Returns(Task.FromResult(response.Object)); - request.Setup(c => c.AddHeader(It.IsAny(), It.IsAny())).Callback((key, val) => headers.Add(key, new List { val })); - request.Setup(c => c.GetHeaders()).Returns(headers); + request.Setup(c => c.AddHeader(It.IsAny(), It.IsAny())).Callback((key, val) => headers.Add(new KeyValuePair(key, new string[] { val }))); + request.Setup(c => c.GetHeaders()).Returns(headers.ToArray()); var factory = Mock.Get(Api1.RequestFactory); factory.Setup(c => c.Create(It.IsAny(), It.IsAny(), It.IsAny())) @@ -186,7 +187,7 @@ namespace CryptoExchange.Net.UnitTests.TestImplementations return await SendRequestAsync(new Uri("http://www.test.com"), HttpMethod.Get, ct, requestWeight: 0); } - protected override Error ParseErrorResponse(int httpStatusCode, IEnumerable>> responseHeaders, IMessageAccessor accessor) + protected override Error ParseErrorResponse(int httpStatusCode, KeyValuePair[] responseHeaders, IMessageAccessor accessor) { var errorData = accessor.Deserialize(); diff --git a/CryptoExchange.Net/Clients/RestApiClient.cs b/CryptoExchange.Net/Clients/RestApiClient.cs index 0ee0af1..3c22555 100644 --- a/CryptoExchange.Net/Clients/RestApiClient.cs +++ b/CryptoExchange.Net/Clients/RestApiClient.cs @@ -638,7 +638,7 @@ namespace CryptoExchange.Net.Clients paramString = $" with request body '{request.Content}'"; var headers = request.GetHeaders(); - if (headers.Count != 0) + if (headers.Length != 0) paramString += " with headers " + string.Join(", ", headers.Select(h => h.Key + $"=[{string.Join(",", h.Value)}]")); TotalRequestsMade++; @@ -768,7 +768,7 @@ namespace CryptoExchange.Net.Clients /// Data accessor /// The response headers /// Null if not an error, Error otherwise - protected virtual Error? TryParseError(IEnumerable>> responseHeaders, IMessageAccessor accessor) => null; + protected virtual Error? TryParseError(KeyValuePair[] responseHeaders, IMessageAccessor accessor) => null; /// /// Can be used to indicate that a request should be retried. Defaults to false. Make sure to retry a max number of times (based on the the tries parameter) or the request will retry forever. @@ -943,7 +943,7 @@ namespace CryptoExchange.Net.Clients /// The response headers /// Data accessor /// - protected virtual Error ParseErrorResponse(int httpStatusCode, IEnumerable>> responseHeaders, IMessageAccessor accessor) + protected virtual Error ParseErrorResponse(int httpStatusCode, KeyValuePair[] responseHeaders, IMessageAccessor accessor) { var message = accessor.OriginalDataAvailable ? accessor.GetOriginalString() : "[Error response content only available when OutputOriginal = true in client options]"; return new ServerError(message); @@ -956,7 +956,7 @@ namespace CryptoExchange.Net.Clients /// The response headers /// Data accessor /// - protected virtual ServerRateLimitError ParseRateLimitResponse(int httpStatusCode, IEnumerable>> responseHeaders, IMessageAccessor accessor) + protected virtual ServerRateLimitError ParseRateLimitResponse(int httpStatusCode, KeyValuePair[] responseHeaders, IMessageAccessor accessor) { var message = accessor.OriginalDataAvailable ? accessor.GetOriginalString() : "[Error response content only available when OutputOriginal = true in client options]"; diff --git a/CryptoExchange.Net/Interfaces/IRequest.cs b/CryptoExchange.Net/Interfaces/IRequest.cs index 7f7414a..72ebe59 100644 --- a/CryptoExchange.Net/Interfaces/IRequest.cs +++ b/CryptoExchange.Net/Interfaces/IRequest.cs @@ -54,7 +54,7 @@ namespace CryptoExchange.Net.Interfaces /// Get all headers /// /// - Dictionary GetHeaders(); + KeyValuePair[] GetHeaders(); /// /// Get the response diff --git a/CryptoExchange.Net/Requests/Request.cs b/CryptoExchange.Net/Requests/Request.cs index 47428e6..23f1f1c 100644 --- a/CryptoExchange.Net/Requests/Request.cs +++ b/CryptoExchange.Net/Requests/Request.cs @@ -67,9 +67,9 @@ namespace CryptoExchange.Net.Requests } /// - public Dictionary GetHeaders() + public KeyValuePair[] GetHeaders() { - return _request.Headers.ToDictionary(h => h.Key, h => h.Value.ToArray()); + return _request.Headers.Select(h => new KeyValuePair(h.Key, h.Value.ToArray())).ToArray(); } /// diff --git a/CryptoExchange.Net/SharedApis/Interfaces/Rest/Futures/IFuturesOrderRestClient.cs b/CryptoExchange.Net/SharedApis/Interfaces/Rest/Futures/IFuturesOrderRestClient.cs index cb84dde..8b78ab9 100644 --- a/CryptoExchange.Net/SharedApis/Interfaces/Rest/Futures/IFuturesOrderRestClient.cs +++ b/CryptoExchange.Net/SharedApis/Interfaces/Rest/Futures/IFuturesOrderRestClient.cs @@ -21,11 +21,11 @@ namespace CryptoExchange.Net.SharedApis /// /// Supported order types /// - IEnumerable FuturesSupportedOrderTypes { get; } + SharedOrderType[] FuturesSupportedOrderTypes { get; } /// /// Supported time in force /// - IEnumerable FuturesSupportedTimeInForce { get; } + SharedTimeInForce[] FuturesSupportedTimeInForce { get; } /// /// Quantity types support /// diff --git a/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PlaceFuturesOrderOptions.cs b/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PlaceFuturesOrderOptions.cs index d989a78..1a4980f 100644 --- a/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PlaceFuturesOrderOptions.cs +++ b/CryptoExchange.Net/SharedApis/Models/Options/Endpoints/PlaceFuturesOrderOptions.cs @@ -25,8 +25,8 @@ namespace CryptoExchange.Net.SharedApis PlaceFuturesOrderRequest request, TradingMode? tradingMode, TradingMode[] supportedApiTypes, - IEnumerable supportedOrderTypes, - IEnumerable supportedTimeInForce, + SharedOrderType[] supportedOrderTypes, + SharedTimeInForce[] supportedTimeInForce, SharedQuantitySupport quantitySupport) { if (request.OrderType == SharedOrderType.Other) diff --git a/CryptoExchange.Net/SharedApis/Models/Options/Subscriptions/SubscribeKlineOptions.cs b/CryptoExchange.Net/SharedApis/Models/Options/Subscriptions/SubscribeKlineOptions.cs index f46bd74..f6c4d7f 100644 --- a/CryptoExchange.Net/SharedApis/Models/Options/Subscriptions/SubscribeKlineOptions.cs +++ b/CryptoExchange.Net/SharedApis/Models/Options/Subscriptions/SubscribeKlineOptions.cs @@ -13,7 +13,7 @@ namespace CryptoExchange.Net.SharedApis /// /// Kline intervals supported for updates /// - public IEnumerable SupportIntervals { get; } + public SharedKlineInterval[] SupportIntervals { get; } /// /// ctor diff --git a/CryptoExchange.Net/Testing/Implementations/TestRequest.cs b/CryptoExchange.Net/Testing/Implementations/TestRequest.cs index 32ea87f..dc6ba5a 100644 --- a/CryptoExchange.Net/Testing/Implementations/TestRequest.cs +++ b/CryptoExchange.Net/Testing/Implementations/TestRequest.cs @@ -10,7 +10,7 @@ namespace CryptoExchange.Net.Testing.Implementations { internal class TestRequest : IRequest { - private readonly Dictionary _headers = new Dictionary(); + private readonly List> _headers = new(); private readonly TestResponse _response; public string Accept { set { } } @@ -32,10 +32,10 @@ namespace CryptoExchange.Net.Testing.Implementations public void AddHeader(string key, string value) { - _headers.Add(key, new[] { value }); + _headers.Add(new KeyValuePair(key, new[] { value })); } - public Dictionary GetHeaders() => _headers; + public KeyValuePair[] GetHeaders() => _headers.ToArray(); public Task GetResponseAsync(CancellationToken cancellationToken) => Task.FromResult(_response);