示例#1
0
        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));
                }
            }
        }
示例#2
0
        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);
        }
示例#3
0
        /// <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));
        }
示例#4
0
        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);
示例#5
0
        /// <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),
                });
            }