88import com .azure .core .http .HttpClient ;
99import com .azure .core .http .HttpPipeline ;
1010import 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 ;
1115import com .azure .core .http .HttpRequest ;
1216import com .azure .core .http .HttpResponse ;
1317import com .azure .core .http .ProxyOptions ;
3135import java .util .List ;
3236import java .util .concurrent .CountDownLatch ;
3337import java .util .concurrent .TimeUnit ;
38+ import java .util .function .Supplier ;
3439import javax .annotation .Nullable ;
3540import reactor .core .publisher .Mono ;
3641import reactor .netty .resources .LoopResources ;
3742
3843public class LazyHttpClient implements HttpClient {
3944
40- private static final String APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE =
41- "https://monitor.azure.com//.default" ;
42-
4345 private static final HttpClient INSTANCE = new LazyHttpClient ();
4446
4547 public static final CountDownLatch safeToInitLatch = new CountDownLatch (1 );
@@ -113,16 +115,21 @@ private static HttpClient init() {
113115 }
114116
115117 public static HttpPipeline newHttpPipeLineWithDefaultRedirect (
116- @ Nullable Configuration .AadAuthentication aadConfiguration ) {
117- return newHttpPipeLine (aadConfiguration , new RedirectPolicy (new DefaultRedirectStrategy ()));
118+ @ Nullable Configuration .AadAuthentication aadConfiguration ,
119+ Supplier <String > aadAudienceWithScope ) {
120+ return newHttpPipeLine (
121+ aadConfiguration , aadAudienceWithScope , new RedirectPolicy (new DefaultRedirectStrategy ()));
118122 }
119123
120124 public static HttpPipeline newHttpPipeLine (
121125 @ Nullable Configuration .AadAuthentication aadConfiguration ,
126+ Supplier <String > aadAudienceWithScope ,
122127 HttpPipelinePolicy ... additionalPolicies ) {
123128 List <HttpPipelinePolicy > policies = new ArrayList <>();
124129 if (aadConfiguration != null && aadConfiguration .enabled ) {
125- policies .add (getAuthenticationPolicy (aadConfiguration ));
130+ policies .add (
131+ new LazyHttpPipelinePolicy (
132+ () -> getAuthenticationPolicy (aadConfiguration , aadAudienceWithScope .get ())));
126133 }
127134 policies .addAll (asList (additionalPolicies ));
128135 // Add Logging Policy. Can be enabled using AZURE_LOG_LEVEL.
@@ -144,31 +151,31 @@ public Mono<HttpResponse> send(HttpRequest request, Context context) {
144151 }
145152
146153 private static HttpPipelinePolicy getAuthenticationPolicy (
147- Configuration .AadAuthentication configuration ) {
154+ Configuration .AadAuthentication configuration , String aadAudienceWithScope ) {
148155 switch (configuration .type ) {
149156 case UAMI :
150- return getAuthenticationPolicyWithUami (configuration );
157+ return getAuthenticationPolicyWithUami (configuration , aadAudienceWithScope );
151158 case SAMI :
152- return getAuthenticationPolicyWithSami ();
159+ return getAuthenticationPolicyWithSami (aadAudienceWithScope );
153160 case VSCODE :
154- return getAuthenticationPolicyWithVsCode ();
161+ return getAuthenticationPolicyWithVsCode (aadAudienceWithScope );
155162 case CLIENTSECRET :
156- return getAuthenticationPolicyWithClientSecret (configuration );
163+ return getAuthenticationPolicyWithClientSecret (configuration , aadAudienceWithScope );
157164 }
158165 throw new IllegalStateException (
159166 "Invalid Authentication Type used in AAD Authentication: " + configuration .type );
160167 }
161168
162169 private static HttpPipelinePolicy getAuthenticationPolicyWithUami (
163- Configuration .AadAuthentication configuration ) {
170+ Configuration .AadAuthentication configuration , String aadAudienceWithScope ) {
164171 ManagedIdentityCredentialBuilder managedIdentityCredential =
165172 new ManagedIdentityCredentialBuilder ().clientId (configuration .clientId );
166173 return new BearerTokenAuthenticationPolicy (
167- managedIdentityCredential .build (), APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE );
174+ managedIdentityCredential .build (), aadAudienceWithScope );
168175 }
169176
170177 private static HttpPipelinePolicy getAuthenticationPolicyWithClientSecret (
171- Configuration .AadAuthentication configuration ) {
178+ Configuration .AadAuthentication configuration , String aadAudienceWithScope ) {
172179 ClientSecretCredentialBuilder credential =
173180 new ClientSecretCredentialBuilder ()
174181 .tenantId (configuration .tenantId )
@@ -177,21 +184,54 @@ private static HttpPipelinePolicy getAuthenticationPolicyWithClientSecret(
177184 if (configuration .authorityHost != null ) {
178185 credential .authorityHost (configuration .authorityHost );
179186 }
180- return new BearerTokenAuthenticationPolicy (
181- credential .build (), APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE );
187+ return new BearerTokenAuthenticationPolicy (credential .build (), aadAudienceWithScope );
182188 }
183189
184- private static HttpPipelinePolicy getAuthenticationPolicyWithVsCode () {
190+ private static HttpPipelinePolicy getAuthenticationPolicyWithVsCode (String aadAudienceWithScope ) {
185191 VisualStudioCodeCredential visualStudioCodeCredential =
186192 new VisualStudioCodeCredentialBuilder ().build ();
187- return new BearerTokenAuthenticationPolicy (
188- visualStudioCodeCredential , APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE );
193+ return new BearerTokenAuthenticationPolicy (visualStudioCodeCredential , aadAudienceWithScope );
189194 }
190195
191- private static HttpPipelinePolicy getAuthenticationPolicyWithSami () {
196+ private static HttpPipelinePolicy getAuthenticationPolicyWithSami (String aadAudienceWithScope ) {
192197 ManagedIdentityCredential managedIdentityCredential =
193198 new ManagedIdentityCredentialBuilder ().build ();
194- return new BearerTokenAuthenticationPolicy (
195- managedIdentityCredential , APPLICATIONINSIGHTS_AUTHENTICATION_SCOPE );
199+ return new BearerTokenAuthenticationPolicy (managedIdentityCredential , aadAudienceWithScope );
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+ }
196236 }
197237}
0 commit comments