@@ -20,6 +20,7 @@ namespace Steeltoe.Discovery.Eureka;
2020public static class EurekaServiceCollectionExtensions
2121{
2222 private const string SpringDiscoveryEnabled = "spring:cloud:discovery:enabled" ;
23+ private const string ResolvingHttpDelegatingHandlerName = "Microsoft.Extensions.ServiceDiscovery.Http.ResolvingHttpDelegatingHandler" ;
2324
2425 /// <summary>
2526 /// Configures to use <see cref="EurekaDiscoveryClient" /> for service discovery.
@@ -108,7 +109,7 @@ private static void AddEurekaClient(IServiceCollection services)
108109 services . ConfigureCertificateOptions ( "Eureka" ) ;
109110
110111 IHttpClientBuilder eurekaHttpClientBuilder = services . AddHttpClient ( "Eureka" ) ;
111- eurekaHttpClientBuilder . ConfigureAdditionalHttpMessageHandlers ( ( defaultHandlers , _ ) => RemoveDiscoveryHttpDelegatingHandler ( defaultHandlers ) ) ;
112+ eurekaHttpClientBuilder . ConfigureAdditionalHttpMessageHandlers ( ( defaultHandlers , _ ) => RemoveDiscoveryHttpHandlers ( defaultHandlers ) ) ;
112113
113114 eurekaHttpClientBuilder . ConfigurePrimaryHttpMessageHandler ( serviceProvider =>
114115 {
@@ -122,7 +123,7 @@ private static void AddEurekaClient(IServiceCollection services)
122123 } ) ;
123124
124125 IHttpClientBuilder eurekaTokenHttpClientBuilder = services . AddHttpClient ( "AccessTokenForEureka" ) ;
125- eurekaTokenHttpClientBuilder . ConfigureAdditionalHttpMessageHandlers ( ( defaultHandlers , _ ) => RemoveDiscoveryHttpDelegatingHandler ( defaultHandlers ) ) ;
126+ eurekaTokenHttpClientBuilder . ConfigureAdditionalHttpMessageHandlers ( ( defaultHandlers , _ ) => RemoveDiscoveryHttpHandlers ( defaultHandlers ) ) ;
126127
127128 eurekaTokenHttpClientBuilder . ConfigurePrimaryHttpMessageHandler ( serviceProvider =>
128129 {
@@ -139,12 +140,19 @@ private static void AddEurekaClient(IServiceCollection services)
139140 services . AddSingleton < EurekaClient > ( ) ;
140141 }
141142
142- private static void RemoveDiscoveryHttpDelegatingHandler ( ICollection < DelegatingHandler > defaultHandlers )
143+ private static void RemoveDiscoveryHttpHandlers ( ICollection < DelegatingHandler > defaultHandlers )
143144 {
145+ // Prevent infinite recursion: The inner HttClient used by EurekaDiscoveryClient must not use service discovery.
146+
144147 DelegatingHandler [ ] discoveryHandlers = defaultHandlers . Where ( handler =>
145148 {
146149 Type handlerType = handler . GetType ( ) ;
147150
151+ if ( handlerType . FullName == ResolvingHttpDelegatingHandlerName )
152+ {
153+ return true ;
154+ }
155+
148156 if ( handlerType . IsConstructedGenericType )
149157 {
150158 Type handlerOpenType = handlerType . GetGenericTypeDefinition ( ) ;
@@ -160,7 +168,6 @@ private static void RemoveDiscoveryHttpDelegatingHandler(ICollection<DelegatingH
160168
161169 foreach ( DelegatingHandler discoveryHandler in discoveryHandlers )
162170 {
163- // Prevent infinite recursion: DiscoveryHttpDelegatingHandler depends on EurekaDiscoveryClient.
164171 defaultHandlers . Remove ( discoveryHandler ) ;
165172 }
166173 }
0 commit comments