From 62916d07ee1c935bf7daa728621db2877db9f222 Mon Sep 17 00:00:00 2001 From: Kahbazi Date: Fri, 15 Jul 2022 13:16:11 +0430 Subject: [PATCH 1/3] Throw an exception in ConfigureHttpClient when custom IForwarderHttpClientFactory is added --- ...ReverseProxyServiceCollectionExtensions.cs | 10 ++++ .../ReverseProxyServiceCollectionTests.cs | 49 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs diff --git a/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs b/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs index 63ceccc6a..5a77e3a0e 100644 --- a/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs +++ b/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using System; +using System.Linq; using System.Net.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -143,6 +144,15 @@ public static IReverseProxyBuilder ConfigureHttpClient(this IReverseProxyBuilder throw new ArgumentNullException(nameof(configure)); } + var service = builder.Services.FirstOrDefault(service => service.ServiceType == typeof(IForwarderHttpClientFactory)); + if (service is not null) + { + if (service.ImplementationType != typeof(ForwarderHttpClientFactory)) + { + throw new InvalidOperationException($"ConfigureHttpClient will override the custom IForwarderHttpClientFactory type."); + } + } + builder.Services.AddSingleton(services => { var logger = services.GetRequiredService>(); diff --git a/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs b/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs new file mode 100644 index 000000000..980e88de1 --- /dev/null +++ b/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Moq; +using Xunit; +using Yarp.Tests.Common; +using Yarp.ReverseProxy.Configuration; +using Yarp.ReverseProxy.Model; +using Microsoft.Extensions.DependencyInjection; + +namespace Yarp.ReverseProxy.Forwarder; + +public class ReverseProxyServiceCollectionTests +{ + + [Fact] + public void ConfigureHttpClient_Works() + { + new ServiceCollection() + .AddReverseProxy() + .ConfigureHttpClient((_, _) => { }); + } + + [Fact] + public void ConfigureHttpClient_ThrowIfCustomServiceAdded() + { + Assert.Throws(() => + { + new ServiceCollection() + .AddSingleton() + .AddReverseProxy() + .ConfigureHttpClient((_, _) => { }); + }); + } + + private class CustomForwarderHttpClientFactory : IForwarderHttpClientFactory + { + public HttpMessageInvoker CreateClient(ForwarderHttpClientContext context) + { + throw new NotImplementedException(); + } + } +} From dd4275a0186cd96c2c537ea9c96281732e6f9539 Mon Sep 17 00:00:00 2001 From: Kahbazi Date: Fri, 15 Jul 2022 15:17:09 +0430 Subject: [PATCH 2/3] Remove unused usings --- .../Forwarder/ReverseProxyServiceCollectionTests.cs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs b/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs index 980e88de1..7e6c254fe 100644 --- a/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs +++ b/test/ReverseProxy.Tests/Forwarder/ReverseProxyServiceCollectionTests.cs @@ -2,17 +2,9 @@ // Licensed under the MIT License. using System; -using System.Collections.Generic; -using System.Net; using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; -using Moq; -using Xunit; -using Yarp.Tests.Common; -using Yarp.ReverseProxy.Configuration; -using Yarp.ReverseProxy.Model; using Microsoft.Extensions.DependencyInjection; +using Xunit; namespace Yarp.ReverseProxy.Forwarder; From 198768402a50f31516f438c18df76e9debb40546 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 18 Aug 2022 10:39:54 -0700 Subject: [PATCH 3/3] Update src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs --- .../Management/ReverseProxyServiceCollectionExtensions.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs b/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs index 5a77e3a0e..f4f233544 100644 --- a/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs +++ b/src/ReverseProxy/Management/ReverseProxyServiceCollectionExtensions.cs @@ -144,6 +144,8 @@ public static IReverseProxyBuilder ConfigureHttpClient(this IReverseProxyBuilder throw new ArgumentNullException(nameof(configure)); } + // Avoid overriding any other custom factories. This does not handle the case where a IForwarderHttpClientFactory + // is registered after this call. var service = builder.Services.FirstOrDefault(service => service.ServiceType == typeof(IForwarderHttpClientFactory)); if (service is not null) {