|
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,20 @@ 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, Supplier<String> aadAudienceWithScope) { |
114 | 119 | return newHttpPipeLine( |
115 | 120 | aadConfiguration, aadAudienceWithScope, new RedirectPolicy(new DefaultRedirectStrategy())); |
116 | 121 | } |
117 | 122 |
|
118 | 123 | public static HttpPipeline newHttpPipeLine( |
119 | 124 | @Nullable Configuration.AadAuthentication aadConfiguration, |
120 | | - String aadAudienceWithScope, |
| 125 | + Supplier<String> aadAudienceWithScope, |
121 | 126 | HttpPipelinePolicy... additionalPolicies) { |
122 | 127 | List<HttpPipelinePolicy> policies = new ArrayList<>(); |
123 | 128 | if (aadConfiguration != null && aadConfiguration.enabled) { |
124 | | - policies.add(getAuthenticationPolicy(aadConfiguration, aadAudienceWithScope)); |
| 129 | + policies.add( |
| 130 | + new LazyHttpPipelinePolicy( |
| 131 | + () -> getAuthenticationPolicy(aadConfiguration, aadAudienceWithScope.get()))); |
125 | 132 | } |
126 | 133 | policies.addAll(asList(additionalPolicies)); |
127 | 134 | // Add Logging Policy. Can be enabled using AZURE_LOG_LEVEL. |
@@ -190,4 +197,41 @@ private static HttpPipelinePolicy getAuthenticationPolicyWithSami(String aadAudi |
190 | 197 | new ManagedIdentityCredentialBuilder().build(); |
191 | 198 | return new BearerTokenAuthenticationPolicy(managedIdentityCredential, aadAudienceWithScope); |
192 | 199 | } |
| 200 | + |
| 201 | + private static class LazyHttpPipelinePolicy implements HttpPipelinePolicy { |
| 202 | + |
| 203 | + private final Supplier<HttpPipelinePolicy> supplier; |
| 204 | + private volatile HttpPipelinePolicy delegate; |
| 205 | + |
| 206 | + LazyHttpPipelinePolicy(Supplier<HttpPipelinePolicy> supplier) { |
| 207 | + this.supplier = supplier; |
| 208 | + } |
| 209 | + |
| 210 | + @Override |
| 211 | + public Mono<HttpResponse> process( |
| 212 | + HttpPipelineCallContext context, HttpPipelineNextPolicy next) { |
| 213 | + createDelegateFirstTime(); |
| 214 | + return delegate.process(context, next); |
| 215 | + } |
| 216 | + |
| 217 | + @Override |
| 218 | + public HttpResponse processSync( |
| 219 | + HttpPipelineCallContext context, HttpPipelineNextSyncPolicy next) { |
| 220 | + createDelegateFirstTime(); |
| 221 | + return delegate.processSync(context, next); |
| 222 | + } |
| 223 | + |
| 224 | + @Override |
| 225 | + public HttpPipelinePosition getPipelinePosition() { |
| 226 | + createDelegateFirstTime(); |
| 227 | + return delegate.getPipelinePosition(); |
| 228 | + } |
| 229 | + |
| 230 | + private void createDelegateFirstTime() { |
| 231 | + if (delegate == null) { |
| 232 | + delegate = supplier.get(); |
| 233 | + } |
| 234 | + } |
| 235 | + } |
| 236 | + |
193 | 237 | } |
0 commit comments