|
8 | 8 | import com.azure.core.http.HttpClient; |
9 | 9 | import com.azure.core.http.HttpPipeline; |
10 | 10 | import com.azure.core.http.HttpPipelineBuilder; |
| 11 | +import com.azure.core.http.HttpPipelineCallContext; |
| 12 | +import com.azure.core.http.HttpPipelineNextPolicy; |
| 13 | +import com.azure.core.http.HttpPipelineNextSyncPolicy; |
| 14 | +import com.azure.core.http.HttpPipelinePosition; |
11 | 15 | import com.azure.core.http.HttpRequest; |
12 | 16 | import com.azure.core.http.HttpResponse; |
13 | 17 | import com.azure.core.http.ProxyOptions; |
|
31 | 35 | import java.util.List; |
32 | 36 | import java.util.concurrent.CountDownLatch; |
33 | 37 | import java.util.concurrent.TimeUnit; |
| 38 | +import java.util.function.Supplier; |
34 | 39 | import javax.annotation.Nullable; |
35 | 40 | import reactor.core.publisher.Mono; |
36 | 41 | import reactor.netty.resources.LoopResources; |
@@ -110,18 +115,21 @@ private static HttpClient init() { |
110 | 115 | } |
111 | 116 |
|
112 | 117 | public static HttpPipeline newHttpPipeLineWithDefaultRedirect( |
113 | | - @Nullable Configuration.AadAuthentication aadConfiguration, String aadAudienceWithScope) { |
| 118 | + @Nullable Configuration.AadAuthentication aadConfiguration, |
| 119 | + Supplier<String> aadAudienceWithScope) { |
114 | 120 | return newHttpPipeLine( |
115 | 121 | aadConfiguration, aadAudienceWithScope, new RedirectPolicy(new DefaultRedirectStrategy())); |
116 | 122 | } |
117 | 123 |
|
118 | 124 | public static HttpPipeline newHttpPipeLine( |
119 | 125 | @Nullable Configuration.AadAuthentication aadConfiguration, |
120 | | - String aadAudienceWithScope, |
| 126 | + Supplier<String> aadAudienceWithScope, |
121 | 127 | HttpPipelinePolicy... additionalPolicies) { |
122 | 128 | List<HttpPipelinePolicy> policies = new ArrayList<>(); |
123 | 129 | if (aadConfiguration != null && aadConfiguration.enabled) { |
124 | | - policies.add(getAuthenticationPolicy(aadConfiguration, aadAudienceWithScope)); |
| 130 | + policies.add( |
| 131 | + new LazyHttpPipelinePolicy( |
| 132 | + () -> getAuthenticationPolicy(aadConfiguration, aadAudienceWithScope.get()))); |
125 | 133 | } |
126 | 134 | policies.addAll(asList(additionalPolicies)); |
127 | 135 | // Add Logging Policy. Can be enabled using AZURE_LOG_LEVEL. |
@@ -190,4 +198,40 @@ private static HttpPipelinePolicy getAuthenticationPolicyWithSami(String aadAudi |
190 | 198 | new ManagedIdentityCredentialBuilder().build(); |
191 | 199 | return new BearerTokenAuthenticationPolicy(managedIdentityCredential, aadAudienceWithScope); |
192 | 200 | } |
| 201 | + |
| 202 | + private static class LazyHttpPipelinePolicy implements HttpPipelinePolicy { |
| 203 | + |
| 204 | + private final Supplier<HttpPipelinePolicy> supplier; |
| 205 | + private volatile HttpPipelinePolicy delegate; |
| 206 | + |
| 207 | + LazyHttpPipelinePolicy(Supplier<HttpPipelinePolicy> supplier) { |
| 208 | + this.supplier = supplier; |
| 209 | + } |
| 210 | + |
| 211 | + @Override |
| 212 | + public Mono<HttpResponse> process( |
| 213 | + HttpPipelineCallContext context, HttpPipelineNextPolicy next) { |
| 214 | + createDelegateFirstTime(); |
| 215 | + return delegate.process(context, next); |
| 216 | + } |
| 217 | + |
| 218 | + @Override |
| 219 | + public HttpResponse processSync( |
| 220 | + HttpPipelineCallContext context, HttpPipelineNextSyncPolicy next) { |
| 221 | + createDelegateFirstTime(); |
| 222 | + return delegate.processSync(context, next); |
| 223 | + } |
| 224 | + |
| 225 | + @Override |
| 226 | + public HttpPipelinePosition getPipelinePosition() { |
| 227 | + createDelegateFirstTime(); |
| 228 | + return delegate.getPipelinePosition(); |
| 229 | + } |
| 230 | + |
| 231 | + private void createDelegateFirstTime() { |
| 232 | + if (delegate == null) { |
| 233 | + delegate = supplier.get(); |
| 234 | + } |
| 235 | + } |
| 236 | + } |
193 | 237 | } |
0 commit comments