public static void ApplyHeaders(Request request, ConditionalRequestOptions options) { if (options.IfMatch.HasValue) { string value = options.IfMatch.Value == ETag.All ? options.IfMatch.Value.ToString() : $"\"{options.IfMatch.Value.ToString()}\""; request.Headers.Add(HttpHeader.Names.IfMatch, value); } if (options.IfNoneMatch.HasValue) { string value = options.IfNoneMatch.Value == ETag.All ? options.IfNoneMatch.Value.ToString() : $"\"{options.IfNoneMatch.Value.ToString()}\""; request.Headers.Add(HttpHeader.Names.IfNoneMatch, value); } if (options is DateConditionalRequestOptions dateOptions) { if (dateOptions.IfModifiedSince.HasValue) { request.Headers.Add(HttpHeader.Names.IfModifiedSince, dateOptions.IfModifiedSince.Value.UtcDateTime.ToString("R", CultureInfo.InvariantCulture)); } if (dateOptions.IfUnmodifiedSince.HasValue) { request.Headers.Add(HttpHeader.Names.IfUnmodifiedSince, dateOptions.IfUnmodifiedSince.Value.UtcDateTime.ToString("R", CultureInfo.InvariantCulture)); } } }
private Request CreateAddRequest(ConfigurationSetting setting) { if (setting == null) { throw new ArgumentNullException(nameof(setting)); } if (string.IsNullOrEmpty(setting.Key)) { throw new ArgumentNullException($"{nameof(setting)}.{nameof(setting.Key)}"); } Request request = _pipeline.CreateRequest(); ReadOnlyMemory <byte> content = Serialize(setting); request.Method = RequestMethod.Put; BuildUriForKvRoute(request.Uri, setting); ConditionalRequestOptions requestOptions = new ConditionalRequestOptions(); requestOptions.SetIfNotExistsCondition(); ConditionalRequestOptionsExtensions.ApplyHeaders(request, requestOptions); request.Headers.Add(s_mediaTypeKeyValueApplicationHeader); request.Headers.Add(HttpHeader.Common.JsonContentType); request.Content = HttpPipelineRequestContent.Create(content); return(request); }
/// <summary> /// Creates a <see cref="ConfigurationSetting"/> if it doesn't exist or overrides an existing setting in the configuration store. /// </summary> /// <param name="setting"><see cref="ConfigurationSetting"/> to create.</param> /// <param name="onlyIfUnchanged"></param> /// <param name="cancellationToken">A <see cref="CancellationToken"/> controlling the request lifetime.</param> public virtual Response <ConfigurationSetting> Set(ConfigurationSetting setting, bool onlyIfUnchanged = false, CancellationToken cancellationToken = default) { if (setting == null) { throw new ArgumentNullException($"{nameof(setting)}"); } ConditionalRequestOptions requestOptions = default; if (onlyIfUnchanged) { requestOptions = new ConditionalRequestOptions(); requestOptions.SetIfUnmodifiedCondition(setting.ETag); } return(Set(setting, requestOptions, cancellationToken)); }
public async Task GetWithRequestOptions() { // Get If-Match is not an expected use case, but enabled for completeness. var testSetting = s_testSetting.Clone(); testSetting.ETag = new ETag("v1"); var mockResponse = new MockResponse(200); mockResponse.SetContent(SerializationHelpers.Serialize(testSetting, SerializeSetting)); var mockTransport = new MockTransport(mockResponse); ConfigurationClient service = CreateTestService(mockTransport); var requestOptions = new ConditionalRequestOptions { IfMatch = new ETag("v1") }; ConfigurationSetting setting = await service.GetAsync(testSetting.Key, testSetting.Label, default, requestOptions);
/// <summary> /// Creates a <see cref="ConfigurationSetting"/> if it doesn't exist or overrides an existing setting in the configuration store. /// </summary> /// <param name="setting"><see cref="ConfigurationSetting"/> to create.</param> /// <param name="requestOptions"></param> /// <param name="cancellationToken">A <see cref="CancellationToken"/> controlling the request lifetime.</param> public virtual async Task <Response <ConfigurationSetting> > SetAsync(ConfigurationSetting setting, ConditionalRequestOptions requestOptions, CancellationToken cancellationToken = default) { using DiagnosticScope scope = _pipeline.Diagnostics.CreateScope("Azure.Data.AppConfiguration.ConfigurationClient.Set"); scope.AddAttribute("key", setting?.Key); scope.Start(); try { using Request request = CreateSetRequest(setting, requestOptions); Response response = await _pipeline.SendRequestAsync(request, cancellationToken).ConfigureAwait(false); return(response.Status switch { 200 => await CreateResponseAsync(response, cancellationToken).ConfigureAwait(false), 409 => throw await response.CreateRequestFailedExceptionAsync("The setting is read only").ConfigureAwait(false), // Throws on 412 if resource was modified. _ => throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false), }); }