diff --git a/CHANGELOG.md b/CHANGELOG.md index 8491e7dc14..f876bb3972 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Removed the `Features` API which is not supported by OpenSearch from the low-level client ([#331](https://github.com/opensearch-project/opensearch-net/pull/331)) - Removed the deprecated low-level `IndexTemplateV2` APIs in favour of the `ComposableIndexTemplate` APIs ([#437](https://github.com/opensearch-project/opensearch-net/pull/437)) +### Fixed +- Fix `HttpConnection.ConvertHttpMethod` to support `Patch` method ([#489](https://github.com/opensearch-project/opensearch-net/pull/489)) + ### Dependencies - Bumps `Microsoft.CodeAnalysis.CSharp` from 4.2.0 to 4.6.0 - Bumps `NSwag.Core.Yaml` from 13.19.0 to 13.20.0 @@ -130,4 +133,4 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) [1.6.0]: https://github.com/opensearch-project/opensearch-net/compare/v1.5.0...v1.6.0 [1.5.0]: https://github.com/opensearch-project/opensearch-net/compare/v1.4.0...v1.5.0 [1.4.0]: https://github.com/opensearch-project/opensearch-net/compare/v1.3.0...v1.4.0 -[1.3.0]: https://github.com/opensearch-project/opensearch-net/compare/v1.2.0...v1.3.0 \ No newline at end of file +[1.3.0]: https://github.com/opensearch-project/opensearch-net/compare/v1.2.0...v1.3.0 diff --git a/src/OpenSearch.Net/Connection/HttpConnection.cs b/src/OpenSearch.Net/Connection/HttpConnection.cs index 57c63a34af..dfb8506fd9 100644 --- a/src/OpenSearch.Net/Connection/HttpConnection.cs +++ b/src/OpenSearch.Net/Connection/HttpConnection.cs @@ -27,7 +27,6 @@ */ using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; @@ -70,6 +69,8 @@ public class HttpConnection : IConnection + $" please set {nameof(ConnectionConfiguration.ConnectionLimit)} to -1 on your connection configuration/settings." + $" this will cause the {nameof(HttpClientHandler.MaxConnectionsPerServer)} not to be set on {nameof(HttpClientHandler)}"; + private static readonly System.Net.Http.HttpMethod Patch = new System.Net.Http.HttpMethod("PATCH"); + private RequestDataHttpClientFactory HttpClientFactory { get; } public int InUseHandlers => HttpClientFactory.InUseHandlers; @@ -430,19 +431,17 @@ private static async Task SetContentAsync(HttpRequestMessage message, RequestDat } } - private static System.Net.Http.HttpMethod ConvertHttpMethod(HttpMethod httpMethod) - { - switch (httpMethod) + private static System.Net.Http.HttpMethod ConvertHttpMethod(HttpMethod httpMethod) => + httpMethod switch { - case HttpMethod.GET: return System.Net.Http.HttpMethod.Get; - case HttpMethod.POST: return System.Net.Http.HttpMethod.Post; - case HttpMethod.PUT: return System.Net.Http.HttpMethod.Put; - case HttpMethod.DELETE: return System.Net.Http.HttpMethod.Delete; - case HttpMethod.HEAD: return System.Net.Http.HttpMethod.Head; - default: - throw new ArgumentException("Invalid value for HttpMethod", nameof(httpMethod)); - } - } + HttpMethod.GET => System.Net.Http.HttpMethod.Get, + HttpMethod.POST => System.Net.Http.HttpMethod.Post, + HttpMethod.PUT => System.Net.Http.HttpMethod.Put, + HttpMethod.DELETE => System.Net.Http.HttpMethod.Delete, + HttpMethod.HEAD => System.Net.Http.HttpMethod.Head, + HttpMethod.PATCH => Patch, + _ => throw new ArgumentException("Invalid value for HttpMethod", nameof(httpMethod)) + }; internal static int GetClientKey(RequestData requestData) { diff --git a/tests/Tests/Connection/Http/HttpConnectionTests.cs b/tests/Tests/Connection/Http/HttpConnectionTests.cs new file mode 100644 index 0000000000..cdcca5a359 --- /dev/null +++ b/tests/Tests/Connection/Http/HttpConnectionTests.cs @@ -0,0 +1,61 @@ +using System; +using System.Net.Http; +using FluentAssertions; +using OpenSearch.Client; +using OpenSearch.Net; +using OpenSearch.OpenSearch.Xunit.XunitPlumbing; +using Xunit; +using HttpMethod = OpenSearch.Net.HttpMethod; + +namespace Tests.Connection.Http; + +public class HttpConnectionTests +{ + private static readonly System.Net.Http.HttpMethod Patch = new System.Net.Http.HttpMethod("PATCH"); + + private class MockHttpConnection : HttpConnection + { + public HttpRequestMessage LastRequest { get; private set; } + + protected override HttpRequestMessage CreateHttpRequestMessage(RequestData requestData) + { + LastRequest = base.CreateHttpRequestMessage(requestData); + return LastRequest; + } + + public override TResponse Request(RequestData requestData) + { + CreateHttpRequestMessage(requestData); + return new TResponse(); + } + } + + public static TheoryData HttpMethods() + { + var data = new TheoryData(); + foreach (var httpMethod in Enum.GetValues()) data.Add(httpMethod); + return data; + } + + [TU] + [MemberData(nameof(HttpMethods))] + public void UsesCorrectHttpMethod(HttpMethod method) + { + var mockHttpConnection = new MockHttpConnection(); + mockHttpConnection.Request(new RequestData(method, "", null, null, null, null)); + mockHttpConnection.LastRequest.Method.Should().Be(ConvertHttpMethod(method)); + } + + private static System.Net.Http.HttpMethod ConvertHttpMethod(HttpMethod httpMethod) => + httpMethod switch + { + HttpMethod.GET => System.Net.Http.HttpMethod.Get, + HttpMethod.POST => System.Net.Http.HttpMethod.Post, + HttpMethod.PUT => System.Net.Http.HttpMethod.Put, + HttpMethod.DELETE => System.Net.Http.HttpMethod.Delete, + HttpMethod.HEAD => System.Net.Http.HttpMethod.Head, + HttpMethod.PATCH => Patch, + _ => throw new ArgumentException("Invalid value for HttpMethod", nameof(httpMethod)) + }; + +}