From 579cdb3d1403783dbd72f0b2213ba5a74656d1ab Mon Sep 17 00:00:00 2001 From: Jkorf Date: Mon, 24 Nov 2025 10:17:30 +0100 Subject: [PATCH] wip --- CryptoExchange.Net/Clients/RestApiClient.cs | 17 +++++++++++------ CryptoExchange.Net/ExtensionMethods.cs | 16 +++++++--------- CryptoExchange.Net/Interfaces/IRequest.cs | 2 +- .../Objects/RestRequestConfiguration.cs | 16 ++++++++-------- CryptoExchange.Net/Requests/Request.cs | 4 ++-- .../Testing/Implementations/TestRequest.cs | 2 +- 6 files changed, 30 insertions(+), 27 deletions(-) diff --git a/CryptoExchange.Net/Clients/RestApiClient.cs b/CryptoExchange.Net/Clients/RestApiClient.cs index 4db108a..1ae8495 100644 --- a/CryptoExchange.Net/Clients/RestApiClient.cs +++ b/CryptoExchange.Net/Clients/RestApiClient.cs @@ -98,6 +98,8 @@ namespace CryptoExchange.Net.Clients /// protected abstract IRestMessageHandler MessageHandler { get; } + private static MediaTypeWithQualityHeaderValue AcceptJsonContent = new MediaTypeWithQualityHeaderValue(Constants.JsonContentHeader); + /// /// ctor /// @@ -388,9 +390,9 @@ namespace CryptoExchange.Net.Clients var requestConfiguration = new RestRequestConfiguration( definition, baseAddress, - uriParameters == null ? new Dictionary() : CreateParameterDictionary(uriParameters), - bodyParameters == null ? new Dictionary() : CreateParameterDictionary(bodyParameters), - new Dictionary(additionalHeaders ?? []), + uriParameters == null ? null : CreateParameterDictionary(uriParameters), + bodyParameters == null ? null : CreateParameterDictionary(bodyParameters), + additionalHeaders, definition.ArraySerialization ?? ArraySerialization, definition.ParameterPosition ?? ParameterPositions[definition.Method], definition.RequestBodyFormat ?? RequestBodyFormat); @@ -411,10 +413,13 @@ namespace CryptoExchange.Net.Clients var uri = new Uri(baseAddress.AppendPath(definition.Path) + queryString); var request = RequestFactory.Create(ClientOptions.HttpVersion, definition.Method, uri, requestId); #warning Should be configurable - request.Accept = Constants.JsonContentHeader; + request.Accept = AcceptJsonContent; - foreach (var header in requestConfiguration.Headers) - request.AddHeader(header.Key, header.Value); + if (requestConfiguration.Headers != null) + { + foreach (var header in requestConfiguration.Headers) + request.AddHeader(header.Key, header.Value); + } foreach (var header in StandardRequestHeaders) { diff --git a/CryptoExchange.Net/ExtensionMethods.cs b/CryptoExchange.Net/ExtensionMethods.cs index b26fd3d..864d45f 100644 --- a/CryptoExchange.Net/ExtensionMethods.cs +++ b/CryptoExchange.Net/ExtensionMethods.cs @@ -271,18 +271,16 @@ namespace CryptoExchange.Net /// /// Append a base url with provided path /// - /// - /// - /// public static string AppendPath(this string url, params string[] path) { - if (!url.EndsWith("/")) - url += "/"; + var sb = new StringBuilder(url.TrimEnd('/')); + foreach (var subPath in path) + { + sb.Append('/'); + sb.Append(subPath.Trim('/')); + } - foreach (var item in path) - url += item.Trim('/') + "/"; - - return url.TrimEnd('/'); + return sb.ToString(); } /// diff --git a/CryptoExchange.Net/Interfaces/IRequest.cs b/CryptoExchange.Net/Interfaces/IRequest.cs index 7c8dcfb..612bf3b 100644 --- a/CryptoExchange.Net/Interfaces/IRequest.cs +++ b/CryptoExchange.Net/Interfaces/IRequest.cs @@ -15,7 +15,7 @@ namespace CryptoExchange.Net.Interfaces /// /// Accept header /// - string Accept { set; } + MediaTypeWithQualityHeaderValue Accept { set; } /// /// Content /// diff --git a/CryptoExchange.Net/Objects/RestRequestConfiguration.cs b/CryptoExchange.Net/Objects/RestRequestConfiguration.cs index e748b9f..acbb75c 100644 --- a/CryptoExchange.Net/Objects/RestRequestConfiguration.cs +++ b/CryptoExchange.Net/Objects/RestRequestConfiguration.cs @@ -30,15 +30,15 @@ namespace CryptoExchange.Net.Objects /// /// Query parameters /// - public IDictionary QueryParameters { get; set; } + public IDictionary? QueryParameters { get; set; } /// /// Body parameters /// - public IDictionary BodyParameters { get; set; } + public IDictionary? BodyParameters { get; set; } /// /// Request headers /// - public IDictionary Headers { get; set; } + public IDictionary? Headers { get; set; } /// /// Array serialization type /// @@ -58,9 +58,9 @@ namespace CryptoExchange.Net.Objects public RestRequestConfiguration( RequestDefinition requestDefinition, string baseAddress, - IDictionary queryParams, - IDictionary bodyParams, - IDictionary headers, + IDictionary? queryParams, + IDictionary? bodyParams, + IDictionary? headers, ArrayParametersSerialization arraySerialization, HttpMethodParameterPosition parametersPosition, RequestBodyFormat bodyFormat) @@ -80,7 +80,7 @@ namespace CryptoExchange.Net.Objects /// /// Get the parameter collection based on the ParameterPosition /// - public IDictionary GetPositionParameters() + public IDictionary? GetPositionParameters() { if (ParameterPosition == HttpMethodParameterPosition.InBody) return BodyParameters; @@ -94,7 +94,7 @@ namespace CryptoExchange.Net.Objects /// Whether to URL encode the parameter string if creating new public string GetQueryString(bool urlEncode = true) { - return _queryString ?? QueryParameters.CreateParamString(urlEncode, ArraySerialization); + return _queryString ?? QueryParameters?.CreateParamString(urlEncode, ArraySerialization) ?? string.Empty; } /// diff --git a/CryptoExchange.Net/Requests/Request.cs b/CryptoExchange.Net/Requests/Request.cs index 417ddfc..31e2ba8 100644 --- a/CryptoExchange.Net/Requests/Request.cs +++ b/CryptoExchange.Net/Requests/Request.cs @@ -35,9 +35,9 @@ namespace CryptoExchange.Net.Requests public string? Content { get; private set; } /// - public string Accept + public MediaTypeWithQualityHeaderValue Accept { - set => _request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue(value)); + set => _request.Headers.Accept.Add(value); } /// diff --git a/CryptoExchange.Net/Testing/Implementations/TestRequest.cs b/CryptoExchange.Net/Testing/Implementations/TestRequest.cs index 301c4f3..ed0b062 100644 --- a/CryptoExchange.Net/Testing/Implementations/TestRequest.cs +++ b/CryptoExchange.Net/Testing/Implementations/TestRequest.cs @@ -14,7 +14,7 @@ namespace CryptoExchange.Net.Testing.Implementations private readonly HttpRequestHeaders _headers = new HttpRequestMessage().Headers; private readonly TestResponse _response; - public string Accept { set { } } + public MediaTypeWithQualityHeaderValue Accept { set { } } public string? Content { get; private set; }