From 985e1ce7582e28b4b05e4cd34b8d3cd1a93da687 Mon Sep 17 00:00:00 2001 From: Alexander Gubin Date: Fri, 2 Feb 2024 17:27:50 +0300 Subject: [PATCH] SP-13399: Fix duplication keys in response headers (#97) * SP-13399: Fix duplication keys in response headers * update * update * SP-13399: Fix duplication keys in response headers * SP-13399: Fix duplication keys in response headers --------- Co-authored-by: Kiryl Kovaliov --- .../Api/DefaultApi.cs | 64 +++++++++---------- .../Api/ProcessApi.cs | 14 ++-- .../Client/ApiClient.cs | 2 +- .../Extensions.cs | 21 ++++++ 4 files changed, 62 insertions(+), 39 deletions(-) create mode 100644 src/Regula.DocumentReader.WebClient/Extensions.cs diff --git a/src/Regula.DocumentReader.WebClient/Api/DefaultApi.cs b/src/Regula.DocumentReader.WebClient/Api/DefaultApi.cs index 92b3612..7d1bd94 100644 --- a/src/Regula.DocumentReader.WebClient/Api/DefaultApi.cs +++ b/src/Regula.DocumentReader.WebClient/Api/DefaultApi.cs @@ -34,7 +34,7 @@ public interface IDefaultApi : IApiAccessor /// Thrown when fails to make API call /// (optional) /// DeviceInfo - DeviceInfo Ping (Dictionary headers, string xRequestID = default(string)); + DeviceInfo Ping(Dictionary headers, string xRequestID = default(string)); /// /// Server health check @@ -45,7 +45,7 @@ public interface IDefaultApi : IApiAccessor /// Thrown when fails to make API call /// (optional) /// ApiResponse of DeviceInfo - ApiResponse PingWithHttpInfo (Dictionary headers, string xRequestID = default(string)); + ApiResponse PingWithHttpInfo(Dictionary headers, string xRequestID = default(string)); #endregion Synchronous Operations #region Asynchronous Operations /// @@ -58,7 +58,7 @@ public interface IDefaultApi : IApiAccessor /// (optional) /// Cancellation Token to cancel request (optional) /// Task of DeviceInfo - System.Threading.Tasks.Task PingAsync (string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)); + System.Threading.Tasks.Task PingAsync(string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)); /// /// Server health check @@ -70,7 +70,7 @@ public interface IDefaultApi : IApiAccessor /// (optional) /// Cancellation Token to cancel request (optional) /// Task of ApiResponse (DeviceInfo) - System.Threading.Tasks.Task> PingWithHttpInfoAsync (string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)); + System.Threading.Tasks.Task> PingWithHttpInfoAsync(string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)); #endregion Asynchronous Operations } @@ -142,7 +142,7 @@ public void SetBasePath(String basePath) /// Gets or sets the configuration object /// /// An instance of the Configuration - public Regula.DocumentReader.WebClient.Client.Configuration Configuration {get; set;} + public Regula.DocumentReader.WebClient.Client.Configuration Configuration { get; set; } /// /// Provides a factory method hook for the creation of exceptions. @@ -188,19 +188,26 @@ public void AddDefaultHeader(string key, string value) /// Thrown when fails to make API call /// (optional) /// DeviceInfo - public DeviceInfo Ping (Dictionary headers, string xRequestID = default(string)) + public DeviceInfo Ping(Dictionary headers, string xRequestID = default(string)) { - ApiResponse localVarResponse = PingWithHttpInfo(headers, xRequestID); - return localVarResponse.Data; + ApiResponse localVarResponse = PingWithHttpInfo(headers, xRequestID); + return localVarResponse.Data; } + public ApiResponse SaveResponse(RestResponse response) + { + int localVarStatusCode = (int)response.StatusCode; + return new ApiResponse(localVarStatusCode, + response.Headers.ToDictionarySafe(x => x.Name, x => string.Join(",", x.Value)), + (DeviceInfo)this.Configuration.ApiClient.Deserialize(response, typeof(DeviceInfo))); + } /// /// Server health check /// /// Thrown when fails to make API call /// (optional) /// ApiResponse of DeviceInfo - public ApiResponse PingWithHttpInfo (Dictionary headers, string xRequestID = default(string)) + public ApiResponse PingWithHttpInfo(Dictionary headers, string xRequestID = default(string)) { var localVarPath = "/api/ping"; @@ -222,29 +229,25 @@ public void AddDefaultHeader(string key, string value) }; String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); - - if (xRequestID != null) localVarHeaderParams.Add("X-RequestID", this.Configuration.ApiClient.ParameterToString(xRequestID)); // header parameter + localVarHeaderParams["Accept"] = localVarHttpHeaderAccept; + if (xRequestID != null) + localVarHeaderParams["X-RequestID"] = this.Configuration.ApiClient.ParameterToString(xRequestID); // header parameter // make the HTTP request - RestResponse localVarResponse = (RestResponse) this.Configuration.ApiClient.CallApi(localVarPath, + RestResponse localVarResponse = (RestResponse)this.Configuration.ApiClient.CallApi(localVarPath, Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType); - int localVarStatusCode = (int) localVarResponse.StatusCode; + int localVarStatusCode = (int)localVarResponse.StatusCode; if (ExceptionFactory != null) { Exception exception = ExceptionFactory("Ping", localVarResponse); if (exception != null) throw exception; } - - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (DeviceInfo) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(DeviceInfo))); + return SaveResponse(localVarResponse); } - /// /// Server health check /// @@ -252,10 +255,10 @@ public void AddDefaultHeader(string key, string value) /// (optional) /// Cancellation Token to cancel request (optional) /// Task of DeviceInfo - public async System.Threading.Tasks.Task PingAsync (string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)) + public async System.Threading.Tasks.Task PingAsync(string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)) { - ApiResponse localVarResponse = await PingWithHttpInfoAsync(xRequestID, cancellationToken); - return localVarResponse.Data; + ApiResponse localVarResponse = await PingWithHttpInfoAsync(xRequestID, cancellationToken); + return localVarResponse.Data; } @@ -266,7 +269,7 @@ public void AddDefaultHeader(string key, string value) /// (optional) /// Cancellation Token to cancel request (optional) /// Task of ApiResponse (DeviceInfo) - public async System.Threading.Tasks.Task> PingWithHttpInfoAsync (string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)) + public async System.Threading.Tasks.Task> PingWithHttpInfoAsync(string xRequestID = default(string), CancellationToken cancellationToken = default(CancellationToken)) { var localVarPath = "/api/ping"; @@ -288,17 +291,17 @@ public void AddDefaultHeader(string key, string value) }; String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + localVarHeaderParams["Accept"] = localVarHttpHeaderAccept; - if (xRequestID != null) localVarHeaderParams.Add("X-RequestID", this.Configuration.ApiClient.ParameterToString(xRequestID)); // header parameter + if (xRequestID != null) localVarHeaderParams["X-RequestID"] = this.Configuration.ApiClient.ParameterToString(xRequestID); // header parameter // make the HTTP request - RestResponse localVarResponse = (RestResponse) await this.Configuration.ApiClient.CallApiAsync(localVarPath, + RestResponse localVarResponse = (RestResponse)await this.Configuration.ApiClient.CallApiAsync(localVarPath, Method.Get, localVarQueryParams, localVarPostBody, localVarHeaderParams, localVarFormParams, localVarFileParams, localVarPathParams, localVarHttpContentType, cancellationToken); - int localVarStatusCode = (int) localVarResponse.StatusCode; + int localVarStatusCode = (int)localVarResponse.StatusCode; if (ExceptionFactory != null) { @@ -306,10 +309,7 @@ public void AddDefaultHeader(string key, string value) if (exception != null) throw exception; } - return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), - (DeviceInfo) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(DeviceInfo))); + return SaveResponse(localVarResponse); } - } -} +} \ No newline at end of file diff --git a/src/Regula.DocumentReader.WebClient/Api/ProcessApi.cs b/src/Regula.DocumentReader.WebClient/Api/ProcessApi.cs index 0f878a5..1ba00ce 100644 --- a/src/Regula.DocumentReader.WebClient/Api/ProcessApi.cs +++ b/src/Regula.DocumentReader.WebClient/Api/ProcessApi.cs @@ -259,7 +259,7 @@ public void AddDefaultHeader(string key, string value) } return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + localVarResponse.Headers.ToDictionarySafe(x => x.Name, x => string.Join(",", x.Value)), (ProcessResponse) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(ProcessResponse))); } @@ -295,7 +295,7 @@ public void AddDefaultHeader(string key, string value) var localVarPath = "/api/process"; var localVarPathParams = new Dictionary(); var localVarQueryParams = new List>(); - var localVarHeaderParams = this.Configuration.DefaultHeader.Union(headers).ToDictionary(k => k.Key, v => v.Value); + var localVarHeaderParams = this.Configuration.DefaultHeader.Union(headers).ToDictionarySafe(k => k.Key, v => v.Value); var localVarFormParams = new Dictionary(); var localVarFileParams = new Dictionary(); Object localVarPostBody = null; @@ -312,10 +312,12 @@ public void AddDefaultHeader(string key, string value) }; String localVarHttpHeaderAccept = this.Configuration.ApiClient.SelectHeaderAccept(localVarHttpHeaderAccepts); if (localVarHttpHeaderAccept != null) - localVarHeaderParams.Add("Accept", localVarHttpHeaderAccept); + localVarHeaderParams["Accept"] = localVarHttpHeaderAccept; - if (xRequestID != null) localVarHeaderParams.Add("X-RequestID", this.Configuration.ApiClient.ParameterToString(xRequestID)); // header parameter - if (processRequest != null && processRequest.GetType() != typeof(byte[])) + if (xRequestID != null) + localVarHeaderParams["X-RequestID"] = this.Configuration.ApiClient.ParameterToString(xRequestID); // header parameter + + if (processRequest.GetType() != typeof(byte[])) { localVarPostBody = this.Configuration.ApiClient.Serialize(processRequest); // http body (model) parameter } @@ -339,7 +341,7 @@ public void AddDefaultHeader(string key, string value) } return new ApiResponse(localVarStatusCode, - localVarResponse.Headers.ToDictionary(x => x.Name, x => string.Join(",", x.Value)), + localVarResponse.Headers.ToDictionarySafe(x => x.Name, x => string.Join(",", x.Value)), (ProcessResponse) this.Configuration.ApiClient.Deserialize(localVarResponse, typeof(ProcessResponse))); } diff --git a/src/Regula.DocumentReader.WebClient/Client/ApiClient.cs b/src/Regula.DocumentReader.WebClient/Client/ApiClient.cs index 9519ebc..0f29eda 100644 --- a/src/Regula.DocumentReader.WebClient/Client/ApiClient.cs +++ b/src/Regula.DocumentReader.WebClient/Client/ApiClient.cs @@ -76,7 +76,7 @@ public ApiClient(Configuration config) ThrowOnAnyError = true, MaxTimeout = Configuration.Timeout }; - RestClient = new RestClient(Configuration.BasePath); + RestClient = new RestClient(options); } /// diff --git a/src/Regula.DocumentReader.WebClient/Extensions.cs b/src/Regula.DocumentReader.WebClient/Extensions.cs new file mode 100644 index 0000000..058ffb9 --- /dev/null +++ b/src/Regula.DocumentReader.WebClient/Extensions.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Regula.DocumentReader.WebClient +{ + public static class CollectionExtensions + { + public static Dictionary ToDictionarySafe(this IEnumerable collection, + Func keySelector, + Func elementSelector) + where TKey : notnull + { + var result = new Dictionary(); + foreach (var value in collection) + { + result[keySelector(value)] = elementSelector(value); + } + return result; + } + } +} \ No newline at end of file