Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create HttpClientTransportOptions and utilize it in Confidential Ledger #23420

Merged
merged 56 commits into from
Nov 12, 2021
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
4abdfaa
HttpClientTransportOptions
christothes Aug 19, 2021
179eeee
tweak
christothes Aug 19, 2021
4aa5ff4
regen snippets
christothes Aug 20, 2021
2711332
Add functional test
christothes Aug 23, 2021
0a6db33
export
christothes Aug 23, 2021
5c53e8c
test tweak
christothes Aug 23, 2021
2110f08
fb
christothes Aug 23, 2021
7155b79
fb
christothes Aug 23, 2021
7260a97
design tweaks
christothes Aug 24, 2021
3142978
fb
christothes Aug 24, 2021
28421f4
re-record CL tests
christothes Aug 24, 2021
931a6e8
test improvements
christothes Aug 25, 2021
9b49d23
teardown
christothes Aug 25, 2021
9ff2a4a
modify cert exception assert
christothes Aug 26, 2021
052a1ea
tweak callback definition
christothes Aug 26, 2021
8fd41e4
Merge branch 'chriss/HttpHandlerCustomization' of https://github.com/…
christothes Aug 26, 2021
f687dfb
fix CL - temporary changes
christothes Aug 26, 2021
d0ee2b5
refactor wip - null messages for SocketsHttpHandler
christothes Aug 27, 2021
e37ea42
Merge branch 'chriss/HttpHandlerCustomization' of https://github.com/…
christothes Aug 27, 2021
162b80c
exclude request callback arg
christothes Aug 27, 2021
aaaac86
CL changes
christothes Aug 27, 2021
e96e193
ci experiment
christothes Aug 27, 2021
5937de6
dev-certs https --trust
christothes Aug 27, 2021
3fd991d
scipt tweak
christothes Aug 27, 2021
5265c59
merge
christothes Sep 14, 2021
18b8d2c
wip
christothes Oct 6, 2021
184540f
merge
christothes Oct 20, 2021
8e11223
dispose
christothes Oct 21, 2021
7ffee49
finalizer
christothes Oct 21, 2021
2c5f59e
remove finalizer
christothes Oct 25, 2021
e1318f9
Merge remote-tracking branch 'upstream/main' into chriss/HttpHandlerC…
christothes Oct 25, 2021
32cbbb4
re-record
christothes Oct 25, 2021
3e39885
export
christothes Oct 25, 2021
201c303
trust cert for mac
christothes Oct 25, 2021
5d84b2a
validate cert trust
christothes Oct 26, 2021
5f1bb27
test with macOS-11
christothes Oct 26, 2021
c87d4cb
disable callback test for MacOS
christothes Oct 27, 2021
3495ddb
fb
christothes Oct 29, 2021
ff0b791
fix merge
christothes Oct 29, 2021
582311b
Merge remote-tracking branch 'upstream/main' into chriss/HttpHandlerC…
christothes Oct 29, 2021
fdb3fdc
merge
christothes Oct 29, 2021
bb76a9e
revert ci
christothes Oct 29, 2021
094cf7d
fb
christothes Oct 29, 2021
d9e7ff3
fb
christothes Oct 29, 2021
bfdafcc
fix test using reflection to look at base type for DisposableTransport
christothes Oct 29, 2021
783a226
fix reflection test
christothes Nov 1, 2021
00a4544
reflection tests
christothes Nov 1, 2021
5046630
spelling fixups
christothes Nov 1, 2021
a6d54ce
test fix
christothes Nov 1, 2021
b2520fa
merge
christothes Nov 3, 2021
748b1a1
handle disposal of Shared instance
christothes Nov 11, 2021
c486b04
merge
christothes Nov 11, 2021
0301024
re-record
christothes Nov 11, 2021
e91bcee
IDisposable
christothes Nov 11, 2021
fe4d7fd
export
christothes Nov 11, 2021
d488129
update snippets
christothes Nov 11, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,22 @@ public ConfidentialLedgerClient(Uri ledgerUri, TokenCredential credential, Confi
throw new ArgumentNullException(nameof(credential));
}

var transport = GetIdentityServerTlsCertAndTrust(ledgerUri);
options ??= new ConfidentialLedgerClientOptions { Transport = transport };
_clientDiagnostics = new ClientDiagnostics(options);
var transportOptions = GetIdentityServerTlsCertAndTrust(ledgerUri);

_clientDiagnostics = new ClientDiagnostics(options ??= new ConfidentialLedgerClientOptions());
christothes marked this conversation as resolved.
Show resolved Hide resolved
_tokenCredential = credential;
var authPolicy = new BearerTokenAuthenticationPolicy(_tokenCredential, AuthorizationScopes);
Pipeline = HttpPipelineBuilder.Build(
options,
new HttpPipelinePolicy[] { new LowLevelCallbackPolicy() },
new HttpPipelinePolicy[] { authPolicy },
new ResponseClassifier());
new ResponseClassifier(),
transportOptions);
this.ledgerUri = ledgerUri;
apiVersion = options.Version;
}

internal HttpClientTransport GetIdentityServerTlsCertAndTrust(Uri ledgerUri)
internal HttpPipelineTransportOptions GetIdentityServerTlsCertAndTrust(Uri ledgerUri)
{
var identityClient = new ConfidentialLedgerIdentityServiceClient(new Uri("https://identity.accledger.azure.com"));
christothes marked this conversation as resolved.
Show resolved Hide resolved

Expand Down Expand Up @@ -87,10 +88,10 @@ bool CertValidationCheck(HttpRequestMessage httpRequestMessage, X509Certificate2
.Any(x => x.Certificate.Thumbprint == ledgerTlsCert.Thumbprint);
return isCertSignedByTheTlsCert;
}
return new HttpClientTransport(new HttpPipelineTransportOptions
return new HttpPipelineTransportOptions
{
ServerCertificateCustomValidationCallback = certificate2 => CertValidationCheck(null, certificate2, certificateChain, SslPolicyErrors.None)
});
};
}
}
}
3 changes: 1 addition & 2 deletions sdk/core/Azure.Core/api/Azure.Core.net461.cs
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,6 @@ public partial class HttpClientTransport : Azure.Core.Pipeline.HttpPipelineTrans
{
public static readonly Azure.Core.Pipeline.HttpClientTransport Shared;
public HttpClientTransport() { }
public HttpClientTransport(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { }
public HttpClientTransport(System.Net.Http.HttpClient client) { }
public HttpClientTransport(System.Net.Http.HttpMessageHandler messageHandler) { }
public sealed override Azure.Core.Request CreateRequest() { throw null; }
Expand All @@ -715,6 +714,7 @@ public static partial class HttpPipelineBuilder
{
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, params Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier, Azure.Core.Pipeline.HttpPipelineTransportOptions? pipelineTransportOptions = null) { throw null; }
}
public abstract partial class HttpPipelinePolicy
{
Expand All @@ -735,7 +735,6 @@ public override void Process(Azure.Core.HttpMessage message, System.ReadOnlyMemo
public abstract partial class HttpPipelineTransport
{
protected HttpPipelineTransport() { }
public static Azure.Core.Pipeline.HttpPipelineTransport Create(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { throw null; }
public abstract Azure.Core.Request CreateRequest();
public abstract void Process(Azure.Core.HttpMessage message);
public abstract System.Threading.Tasks.ValueTask ProcessAsync(Azure.Core.HttpMessage message);
Expand Down
3 changes: 1 addition & 2 deletions sdk/core/Azure.Core/api/Azure.Core.net5.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,6 @@ public partial class HttpClientTransport : Azure.Core.Pipeline.HttpPipelineTrans
{
public static readonly Azure.Core.Pipeline.HttpClientTransport Shared;
public HttpClientTransport() { }
public HttpClientTransport(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { }
public HttpClientTransport(System.Net.Http.HttpClient client) { }
public HttpClientTransport(System.Net.Http.HttpMessageHandler messageHandler) { }
public sealed override Azure.Core.Request CreateRequest() { throw null; }
Expand All @@ -715,6 +714,7 @@ public static partial class HttpPipelineBuilder
{
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, params Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier, Azure.Core.Pipeline.HttpPipelineTransportOptions? pipelineTransportOptions = null) { throw null; }
}
public abstract partial class HttpPipelinePolicy
{
Expand All @@ -735,7 +735,6 @@ public override void Process(Azure.Core.HttpMessage message, System.ReadOnlyMemo
public abstract partial class HttpPipelineTransport
{
protected HttpPipelineTransport() { }
public static Azure.Core.Pipeline.HttpPipelineTransport Create(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { throw null; }
public abstract Azure.Core.Request CreateRequest();
public abstract void Process(Azure.Core.HttpMessage message);
public abstract System.Threading.Tasks.ValueTask ProcessAsync(Azure.Core.HttpMessage message);
Expand Down
3 changes: 1 addition & 2 deletions sdk/core/Azure.Core/api/Azure.Core.netcoreapp2.1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,6 @@ public partial class HttpClientTransport : Azure.Core.Pipeline.HttpPipelineTrans
{
public static readonly Azure.Core.Pipeline.HttpClientTransport Shared;
public HttpClientTransport() { }
public HttpClientTransport(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { }
public HttpClientTransport(System.Net.Http.HttpClient client) { }
public HttpClientTransport(System.Net.Http.HttpMessageHandler messageHandler) { }
public sealed override Azure.Core.Request CreateRequest() { throw null; }
Expand All @@ -715,6 +714,7 @@ public static partial class HttpPipelineBuilder
{
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, params Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier, Azure.Core.Pipeline.HttpPipelineTransportOptions? pipelineTransportOptions = null) { throw null; }
}
public abstract partial class HttpPipelinePolicy
{
Expand All @@ -735,7 +735,6 @@ public override void Process(Azure.Core.HttpMessage message, System.ReadOnlyMemo
public abstract partial class HttpPipelineTransport
{
protected HttpPipelineTransport() { }
public static Azure.Core.Pipeline.HttpPipelineTransport Create(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { throw null; }
public abstract Azure.Core.Request CreateRequest();
public abstract void Process(Azure.Core.HttpMessage message);
public abstract System.Threading.Tasks.ValueTask ProcessAsync(Azure.Core.HttpMessage message);
Expand Down
3 changes: 1 addition & 2 deletions sdk/core/Azure.Core/api/Azure.Core.netstandard2.0.cs
Original file line number Diff line number Diff line change
Expand Up @@ -691,7 +691,6 @@ public partial class HttpClientTransport : Azure.Core.Pipeline.HttpPipelineTrans
{
public static readonly Azure.Core.Pipeline.HttpClientTransport Shared;
public HttpClientTransport() { }
public HttpClientTransport(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { }
public HttpClientTransport(System.Net.Http.HttpClient client) { }
public HttpClientTransport(System.Net.Http.HttpMessageHandler messageHandler) { }
public sealed override Azure.Core.Request CreateRequest() { throw null; }
Expand All @@ -715,6 +714,7 @@ public static partial class HttpPipelineBuilder
{
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, params Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier) { throw null; }
public static Azure.Core.Pipeline.HttpPipeline Build(Azure.Core.ClientOptions options, Azure.Core.Pipeline.HttpPipelinePolicy[] perCallPolicies, Azure.Core.Pipeline.HttpPipelinePolicy[] perRetryPolicies, Azure.Core.ResponseClassifier responseClassifier, Azure.Core.Pipeline.HttpPipelineTransportOptions? pipelineTransportOptions = null) { throw null; }
}
public abstract partial class HttpPipelinePolicy
{
Expand All @@ -735,7 +735,6 @@ public override void Process(Azure.Core.HttpMessage message, System.ReadOnlyMemo
public abstract partial class HttpPipelineTransport
{
protected HttpPipelineTransport() { }
public static Azure.Core.Pipeline.HttpPipelineTransport Create(Azure.Core.Pipeline.HttpPipelineTransportOptions? options = null) { throw null; }
public abstract Azure.Core.Request CreateRequest();
public abstract void Process(Azure.Core.HttpMessage message);
public abstract System.Threading.Tasks.ValueTask ProcessAsync(Azure.Core.HttpMessage message);
Expand Down
7 changes: 6 additions & 1 deletion sdk/core/Azure.Core/src/ClientOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace Azure.Core
public abstract class ClientOptions
{
private HttpPipelineTransport _transport;
internal bool IsCustomTransportSet { get; private set; }

/// <summary>
/// Gets the default set of <see cref="ClientOptions"/>. Changes to the <see cref="Default"/> options would be reflected
Expand Down Expand Up @@ -64,7 +65,11 @@ internal ClientOptions(ClientOptions? clientOptions)
public HttpPipelineTransport Transport
{
get => _transport;
set => _transport = value ?? throw new ArgumentNullException(nameof(value));
set
{
_transport = value ?? throw new ArgumentNullException(nameof(value));
IsCustomTransportSet = true;
}
}

/// <summary>
Expand Down
30 changes: 20 additions & 10 deletions sdk/core/Azure.Core/src/Diagnostics/AzureCoreEventSource.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

using System;
using System.Diagnostics.Tracing;

namespace Azure.Core.Diagnostics
Expand All @@ -10,26 +11,27 @@ internal sealed class AzureCoreEventSource : AzureEventSource
{
private const string EventSourceName = "Azure-Core";

private const int BackgroundRefreshFailedEvent = 19;
private const int RequestEvent = 1;
private const int RequestContentEvent = 2;
private const int RequestContentTextEvent = 17;
private const int RequestRedirectEvent = 20;
private const int RequestRedirectBlockedEvent = 21;
private const int RequestRedirectCountExceededEvent = 22;
private const int ResponseEvent = 5;
private const int ResponseContentEvent = 6;
private const int ResponseDelayEvent = 7;
private const int ResponseContentTextEvent = 13;
private const int ResponseContentBlockEvent = 11;
private const int ResponseContentTextBlockEvent = 15;
private const int ErrorResponseEvent = 8;
private const int ErrorResponseContentEvent = 9;
private const int ErrorResponseContentTextEvent = 14;
private const int RequestRetryingEvent = 10;
private const int ResponseContentBlockEvent = 11;
private const int ErrorResponseContentBlockEvent = 12;
private const int ResponseContentTextEvent = 13;
private const int ErrorResponseContentTextEvent = 14;
private const int ResponseContentTextBlockEvent = 15;
private const int ErrorResponseContentTextBlockEvent = 16;
private const int RequestRetryingEvent = 10;
private const int RequestContentTextEvent = 17;
private const int ExceptionResponseEvent = 18;
private const int BackgroundRefreshFailedEvent = 19;
private const int RequestRedirectEvent = 20;
private const int RequestRedirectBlockedEvent = 21;
private const int RequestRedirectCountExceededEvent = 22;
private const int PipelineTransportOptionsNotAppliedEvent = 23;

private AzureCoreEventSource() : base(EventSourceName) { }

Expand Down Expand Up @@ -154,5 +156,13 @@ public void RequestRedirectCountExceeded(string requestId, string from, string t
{
WriteEvent(RequestRedirectCountExceededEvent, requestId, from, to);
}

[Event(
PipelineTransportOptionsNotAppliedEvent,
Level = EventLevel.Warning, Message = "PipelineTransportOptions where provided for options type [{0}] but were not applied because a custom Transport has already been set.")]
christothes marked this conversation as resolved.
Show resolved Hide resolved
public void PipelineTransportOptionsNotApplied(Type optionsType)
{
WriteEvent(PipelineTransportOptionsNotAppliedEvent, optionsType.FullName);
}
}
}
2 changes: 1 addition & 1 deletion sdk/core/Azure.Core/src/Pipeline/HttpClientTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public HttpClientTransport() : this(CreateDefaultClient())
/// Creates a new <see cref="HttpClientTransport"/> instance using default configuration.
/// </summary>
/// <param name="options">The <see cref="HttpPipelineTransportOptions"/> that to configure the behavior of the transport.</param>
public HttpClientTransport(HttpPipelineTransportOptions? options = null) : this(CreateDefaultClient(options))
internal HttpClientTransport(HttpPipelineTransportOptions? options = null) : this(CreateDefaultClient(options))
{ }

/// <summary>
Expand Down
41 changes: 39 additions & 2 deletions sdk/core/Azure.Core/src/Pipeline/HttpPipelineBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Azure.Core.Diagnostics;

namespace Azure.Core.Pipeline
{
Expand Down Expand Up @@ -32,7 +33,25 @@ public static HttpPipeline Build(ClientOptions options, params HttpPipelinePolic
/// <param name="perRetryPolicies">Client provided per-retry policies.</param>
/// <param name="responseClassifier">The client provided response classifier.</param>
/// <returns>A new instance of <see cref="HttpPipeline"/></returns>
public static HttpPipeline Build(ClientOptions options, HttpPipelinePolicy[] perCallPolicies, HttpPipelinePolicy[] perRetryPolicies, ResponseClassifier responseClassifier)
public static HttpPipeline Build(
ClientOptions options,
HttpPipelinePolicy[] perCallPolicies,
HttpPipelinePolicy[] perRetryPolicies,
ResponseClassifier responseClassifier)
{
return Build(options, perCallPolicies, perRetryPolicies, responseClassifier, null);
}

/// <summary>
/// Creates an instance of <see cref="HttpPipeline"/> populated with default policies, customer provided policies from <paramref name="options"/> and client provided per call policies.
/// </summary>
/// <param name="options">The customer provided client options object.</param>
/// <param name="perCallPolicies">Client provided per-call policies.</param>
/// <param name="perRetryPolicies">Client provided per-retry policies.</param>
/// <param name="responseClassifier">The client provided response classifier.</param>
/// <param name="pipelineTransportOptions">The customer provided transport options.</param>
/// <returns>A new instance of <see cref="HttpPipeline"/></returns>
public static HttpPipeline Build(ClientOptions options, HttpPipelinePolicy[] perCallPolicies, HttpPipelinePolicy[] perRetryPolicies, ResponseClassifier responseClassifier, HttpPipelineTransportOptions? pipelineTransportOptions = null)
christothes marked this conversation as resolved.
Show resolved Hide resolved
{
if (perCallPolicies == null)
{
Expand Down Expand Up @@ -104,7 +123,25 @@ void AddCustomerPolicies(HttpPipelinePosition position)

policies.RemoveAll(static policy => policy == null);

return new HttpPipeline(options.Transport,
// Override the provided Transport with the provided transport options if the transport has not been set after default construction and options are not null.
HttpPipelineTransport transport = options.Transport;
if (pipelineTransportOptions != null)
{
if (options.IsCustomTransportSet)
{
if (AzureCoreEventSource.Singleton.IsEnabled())
{
// Log that we were unable to override the custom transport
AzureCoreEventSource.Singleton.PipelineTransportOptionsNotApplied(options.GetType());
}
}
else
{
transport = HttpPipelineTransport.Create(pipelineTransportOptions);
}
}

return new HttpPipeline(transport,
policies.ToArray(),
responseClassifier);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public abstract class HttpPipelineTransport
/// </summary>
/// <param name="options"><see cref="HttpPipelineTransportOptions"/> that affect how the transport is configured.</param>
/// <returns></returns>
public static HttpPipelineTransport Create(HttpPipelineTransportOptions? options = null)
internal static HttpPipelineTransport Create(HttpPipelineTransportOptions? options = null)
{
#if NETFRAMEWORK
if (!AppContextSwitchHelper.GetConfigValue(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public HttpWebRequestTransport() : this(_ => { })
{
}

public HttpWebRequestTransport(HttpPipelineTransportOptions options)
internal HttpWebRequestTransport(HttpPipelineTransportOptions options)
: this(req => ApplyOptionsToRequest(req, options))
{ }

Expand Down
Loading