From 6ddcfe674c679972a0acbd87753b429692e75c38 Mon Sep 17 00:00:00 2001 From: Krzysztof Cwalina Date: Mon, 7 Jan 2019 16:17:01 -0800 Subject: [PATCH] Cleaned up context disposal (#7) --- Azure.Configuration/ConfigurationClient.cs | 133 +++++++----------- .../ConfigurationClient_private.cs | 6 +- 2 files changed, 50 insertions(+), 89 deletions(-) diff --git a/Azure.Configuration/ConfigurationClient.cs b/Azure.Configuration/ConfigurationClient.cs index 2ceae1b1edb7..dfc7b847b9b3 100644 --- a/Azure.Configuration/ConfigurationClient.cs +++ b/Azure.Configuration/ConfigurationClient.cs @@ -18,15 +18,15 @@ public partial class ConfigurationClient { const string SdkName = "Azure.Configuration"; const string SdkVersion = "1.0.0"; - + readonly Uri _baseUri; readonly string _credential; readonly byte[] _secret; PipelineOptions _options; ClientPipeline Pipeline; - public ConfigurationClient(string connectionString) - : this(connectionString, options : new PipelineOptions()) + public ConfigurationClient(string connectionString) + : this(connectionString, options: new PipelineOptions()) { } @@ -44,29 +44,24 @@ public async Task> AddAsync(ConfigurationSetting Uri uri = BuildUrlForKvRoute(setting); - PipelineCallContext context = null; - try + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) { - context = Pipeline.CreateContext(_options, cancellation); + ReadOnlyMemory content = Serialize(setting); context.AddRequestLine(ServiceMethod.Put, uri); - context.AddHeader(MediaTypeKeyValueApplicationHeader); - context.AddHeader(IfNoneMatchWildcard); - context.AddHeader(Header.Common.JsonContentType); - ReadOnlyMemory content = Serialize(setting); + context.AddHeader(IfNoneMatchWildcard); - AddAuthenticationHeaders(context, uri, ServiceMethod.Put, content, _secret, _credential); + context.AddHeader(MediaTypeKeyValueApplicationHeader); + context.AddHeader(Header.Common.JsonContentType); context.AddHeader(Header.Common.CreateContentLength(content.Length)); + AddAuthenticationHeaders(context, uri, ServiceMethod.Put, content, _secret, _credential); + context.AddContent(PipelineContent.Create(content)); await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); // TODO (pri 1) : should we always dispose given the content is eagerly deserialized? - throw; + return await CreateResponse(context); } } @@ -77,27 +72,22 @@ public async Task> SetAsync(ConfigurationSetting Uri uri = BuildUrlForKvRoute(setting); - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { + ReadOnlyMemory content = Serialize(setting); context.AddRequestLine(ServiceMethod.Put, uri); + context.AddHeader(MediaTypeKeyValueApplicationHeader); context.AddHeader(Header.Common.JsonContentType); - - ReadOnlyMemory content = Serialize(setting); - - AddAuthenticationHeaders(context, uri, ServiceMethod.Put, content, _secret, _credential); context.AddHeader(Header.Common.CreateContentLength(content.Length)); + AddAuthenticationHeaders(context, uri, ServiceMethod.Put, content, _secret, _credential); + context.AddContent(PipelineContent.Create(content)); await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); - throw; + return await CreateResponse(context); } } @@ -109,28 +99,24 @@ public async Task> UpdateAsync(ConfigurationSetti Uri uri = BuildUrlForKvRoute(setting); - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { + ReadOnlyMemory content = Serialize(setting); context.AddRequestLine(ServiceMethod.Put, uri); - context.AddHeader(MediaTypeKeyValueApplicationHeader); - context.AddHeader(IfMatchName, $"\"{setting.ETag}\""); - context.AddHeader(Header.Common.JsonContentType); - ReadOnlyMemory content = Serialize(setting); + context.AddHeader(IfMatchName, $"\"{setting.ETag}\""); - AddAuthenticationHeaders(context, uri, ServiceMethod.Put, content, _secret, _credential); + context.AddHeader(MediaTypeKeyValueApplicationHeader); + context.AddHeader(Header.Common.JsonContentType); context.AddHeader(Header.Common.CreateContentLength(content.Length)); + AddAuthenticationHeaders(context, uri, ServiceMethod.Put, content, _secret, _credential); + context.AddContent(PipelineContent.Create(content)); await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); - throw; + return await CreateResponse(context); } } @@ -140,9 +126,8 @@ public async Task> DeleteAsync(string key, Settin Uri uri = BuildUrlForKvRoute(key, filter); - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { context.AddRequestLine(ServiceMethod.Delete, uri); AddFilterHeaders(filter, context); @@ -150,11 +135,7 @@ public async Task> DeleteAsync(string key, Settin await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); - throw; + return await CreateResponse(context); } } @@ -164,20 +145,15 @@ public async Task> LockAsync(string key, SettingF Uri uri = BuildUriForLocksRoute(key, filter); - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { context.AddRequestLine(ServiceMethod.Put, uri); AddFilterHeaders(filter, context); await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); - throw; + return await CreateResponse(context); } } @@ -187,20 +163,15 @@ public async Task> UnlockAsync(string key, Settin Uri uri = BuildUriForLocksRoute(key, filter); - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { context.AddRequestLine(ServiceMethod.Delete, uri); AddFilterHeaders(filter, context); await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); - throw; + return await CreateResponse(context); } } @@ -209,10 +180,9 @@ public async Task> GetAsync(string key, SettingFi if (string.IsNullOrEmpty(key)) throw new ArgumentNullException($"{nameof(key)}"); Uri uri = BuildUrlForKvRoute(key, filter); - - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { context.AddRequestLine(ServiceMethod.Get, uri); context.AddHeader(MediaTypeKeyValueApplicationHeader); @@ -223,45 +193,40 @@ public async Task> GetAsync(string key, SettingFi await Pipeline.ProcessAsync(context).ConfigureAwait(false); - return await CreateKeyValueResponse(context); - } - catch { - if (context != null) context.Dispose(); - throw; + return await CreateResponse(context); } } public async Task> GetBatchAsync(BatchFilter filter, CancellationToken cancellation = default) { var uri = BuildUrlForGetBatch(filter); - PipelineCallContext context = null; - try { - context = Pipeline.CreateContext(_options, cancellation); + + using (PipelineCallContext context = Pipeline.CreateContext(_options, cancellation)) + { context.AddRequestLine(ServiceMethod.Get, uri); context.AddHeader(MediaTypeKeyValueApplicationHeader); - if (filter.Revision != null) { + if (filter.Revision != null) + { context.AddHeader(AcceptDatetimeHeader, filter.Revision.Value.UtcDateTime.ToString(AcceptDateTimeFormat)); } await Pipeline.ProcessAsync(context).ConfigureAwait(false); ServiceResponse response = context.Response; - if (!response.TryGetHeader(Header.Constants.ContentLength, out long contentLength)) { + if (!response.TryGetHeader(Header.Constants.ContentLength, out long contentLength)) + { throw new Exception("bad response: no content length header"); } - if (response.Status != 200) { + if (response.Status != 200) + { return new Response(response); } var batch = await ConfigurationServiceSerializer.ParseBatchAsync(response, cancellation); return new Response(response, batch); } - catch { - if (context != null) context.Dispose(); - throw; - } } } } diff --git a/Azure.Configuration/ConfigurationClient_private.cs b/Azure.Configuration/ConfigurationClient_private.cs index 272904503c9a..39bdbd56c287 100644 --- a/Azure.Configuration/ConfigurationClient_private.cs +++ b/Azure.Configuration/ConfigurationClient_private.cs @@ -1,14 +1,10 @@ using Azure.Core; using Azure.Core.Net; using System; -using System.Buffers; using System.ComponentModel; -using System.IO; using System.Security.Cryptography; using System.Text; -using System.Text.JsonLab; using System.Threading.Tasks; -using static System.Buffers.Text.Encodings; namespace Azure.Configuration { @@ -46,7 +42,7 @@ static void AddFilterHeaders(SettingFilter filter, PipelineCallContext context) } } - static async Task> CreateKeyValueResponse(PipelineCallContext context) + static async Task> CreateResponse(PipelineCallContext context) { ServiceResponse response = context.Response;