Skip to content

Commit 16609e9

Browse files
authored
Small refactor to HttpPipelineBuilder.BuildInternal for clarity (Azure#27234)
* Small refactor to HttpPipelineBuilder.BuildInternal for clarity
1 parent 9238dd8 commit 16609e9

File tree

2 files changed

+23
-7
lines changed

2 files changed

+23
-7
lines changed

sdk/core/Azure.Core/src/Pipeline/HttpPipelineBuilder.cs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,29 @@ void AddCustomerPolicies(HttpPipelinePosition position)
8888
{
8989
foreach (var policy in options.Policies)
9090
{
91-
if (policy.Position == position)
91+
// skip null policies to ensure that calculations for perCallIndex and perRetryIndex are accurate
92+
if (policy.Position == position && policy.Policy != null)
9293
{
9394
policies.Add(policy.Policy);
9495
}
9596
}
9697
}
9798
}
9899

100+
// A helper to ensure that we only add non-null policies to the policies list
101+
// This ensures that calculations for perCallIndex and perRetryIndex are accurate
102+
void AddNonNullPolicies(HttpPipelinePolicy[] policiesToAdd)
103+
{
104+
for (int i = 0; i < policiesToAdd.Length; i++)
105+
{
106+
var policy = policiesToAdd[i];
107+
if (policy != null)
108+
{
109+
policies.Add(policy);
110+
}
111+
}
112+
}
113+
99114
DiagnosticsOptions diagnostics = options.Diagnostics;
100115

101116
var sanitizer = new HttpMessageSanitizer(diagnostics.LoggedQueryParameters.ToArray(), diagnostics.LoggedHeaderNames.ToArray());
@@ -104,11 +119,10 @@ void AddCustomerPolicies(HttpPipelinePosition position)
104119

105120
policies.Add(ReadClientRequestIdPolicy.Shared);
106121

107-
policies.AddRange(perCallPolicies);
122+
AddNonNullPolicies(perCallPolicies);
108123

109124
AddCustomerPolicies(HttpPipelinePosition.PerCall);
110125

111-
policies.RemoveAll(static policy => policy == null);
112126
var perCallIndex = policies.Count;
113127

114128
policies.Add(ClientRequestIdPolicy.Shared);
@@ -123,12 +137,10 @@ void AddCustomerPolicies(HttpPipelinePosition position)
123137

124138
policies.Add(RedirectPolicy.Shared);
125139

126-
policies.AddRange(perRetryPolicies);
140+
AddNonNullPolicies(perRetryPolicies);
127141

128142
AddCustomerPolicies(HttpPipelinePosition.PerRetry);
129143

130-
policies.RemoveAll(static policy => policy == null);
131-
132144
var perRetryIndex = policies.Count;
133145

134146
if (diagnostics.IsLoggingEnabled)
@@ -143,7 +155,6 @@ void AddCustomerPolicies(HttpPipelinePosition position)
143155
policies.Add(new RequestActivityPolicy(isDistributedTracingEnabled, ClientDiagnostics.GetResourceProviderNamespace(options.GetType().Assembly), sanitizer));
144156

145157
AddCustomerPolicies(HttpPipelinePosition.BeforeTransport);
146-
policies.RemoveAll(static policy => policy == null);
147158

148159
// Override the provided Transport with the provided transport options if the transport has not been set after default construction and options are not null.
149160
HttpPipelineTransport transport = options.Transport;

sdk/core/Azure.Core/tests/HttpPipelineBuilderTest.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ public async Task CustomPolicyOrdering()
7070
Assert.False(beforeTransportRan);
7171
}), HttpPipelinePosition.PerRetry);
7272

73+
// Intentionally add some null policies to ensure it does not break indexing
74+
options.AddPolicy(null, HttpPipelinePosition.PerCall);
75+
options.AddPolicy(null, HttpPipelinePosition.PerRetry);
76+
options.AddPolicy(null, HttpPipelinePosition.BeforeTransport);
77+
7378
options.AddPolicy(new CallbackPolicy(m =>
7479
{
7580
beforeTransportRan = true;

0 commit comments

Comments
 (0)