Beispiel #1
0
        public override Task <Device> UpdateDeviceAsync(Device device, bool forceUpdate, CancellationToken cancellationToken)
        {
            this.EnsureInstanceNotClosed();

            ValidateDeviceId(device);

            if (string.IsNullOrWhiteSpace(device.ETag) && !forceUpdate)
            {
                throw new ArgumentException(ApiResources.ETagNotSetWhileUpdatingDevice);
            }

            ValidateDeviceAuthentication(device.Authentication, device.Id);

            // auto generate keys if not specified
            if (device.Authentication == null)
            {
                device.Authentication = new AuthenticationMechanism();
            }

            var errorMappingOverrides = new Dictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > >()
            {
                { HttpStatusCode.PreconditionFailed, async(responseMessage) => new PreconditionFailedException(await ExceptionHandlingHelper.GetExceptionMessageAsync(responseMessage)) },
                { HttpStatusCode.NotFound, async responseMessage =>
                  {
                      string responseContent = await ExceptionHandlingHelper.GetExceptionMessageAsync(responseMessage);

                      return((Exception) new DeviceNotFoundException(responseContent, (Exception)null));
                  } }
            };

            PutOperationType operationType = forceUpdate ? PutOperationType.ForceUpdateEntity : PutOperationType.UpdateEntity;

            return(this.httpClientHelper.PutAsync(GetRequestUri(device.Id), device, operationType, errorMappingOverrides, cancellationToken));
        }
        public async Task <T> PutAsync <T>(
            Uri requestUri,
            T entity,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken) where T : IETagHolder
        {
#if WINDOWS_UWP || PCL
            throw new NotImplementedException();
#else
            T result = default(T);

            await this.ExecuteAsync(
                HttpMethod.Put,
                new Uri(this.baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, entity, operationType);
                requestMsg.Content = new ObjectContent <T>(entity, new JsonMediaTypeFormatter());
                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T>(httpClient, token),
                errorMappingOverrides,
                cancellationToken);

            return(result);
#endif
        }
Beispiel #3
0
        public async Task PutAsync <T>(
            Uri requestUri,
            T entity,
            string etag,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken)
        {
            await ExecuteAsync(
                HttpMethod.Put,
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, etag, operationType);
#if NET451
                requestMsg.Content = new ObjectContent <T>(entity, JsonFormatter);
#else
                string str         = Newtonsoft.Json.JsonConvert.SerializeObject(entity);
                requestMsg.Content = new StringContent(str, System.Text.Encoding.UTF8, ApplicationJson);
#endif
                return(Task.FromResult(0));
            },
                null,
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);
        }
Beispiel #4
0
        public async Task <T2> PatchAsync <T, T2>(Uri requestUri, T entity, string etag,
                                                  PutOperationType putOperationType,
                                                  IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
                                                  CancellationToken cancellationToken)
        {
            T2 result = default;

            await ExecuteAsync(
                new HttpMethod("PATCH"),
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, etag, putOperationType);
#if NET451
                requestMsg.Content = new ObjectContent <T>(entity, JsonFormatter);
#else
                string str         = JsonConvert.SerializeObject(entity);
                requestMsg.Content = new StringContent(str, System.Text.Encoding.UTF8, ApplicationJson);
#endif
                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T2>(httpClient, token).ConfigureAwait(false),
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);

            return(result);
        }
        public async Task <T2> PutAsync <T, T2>(
            Uri requestUri,
            T entity,
            string etag,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken)
        {
            T2 result = default;

            await ExecuteAsync(
                HttpMethod.Put,
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                // TODO: skintali: Use string etag when service side changes are ready
                InsertEtag(requestMsg, etag, operationType);
                SetHttpRequestMessageContent <T>(requestMsg, entity);

                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T2>(httpClient, token).ConfigureAwait(false),
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);

            return(result);
        }
        public async Task <T> PutAsync <T>(
            Uri requestUri,
            T entity,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken) where T : IETagHolder
        {
            T result = default;

            await ExecuteAsync(
                HttpMethod.Put,
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, entity, operationType);
                SetHttpRequestMessageContent(requestMsg, entity);

                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T>(httpClient, token).ConfigureAwait(false),
                errorMappingOverrides,
                cancellationToken)
            .ConfigureAwait(false);

            return(result);
        }
Beispiel #7
0
        public async Task <T2> PatchAsync <T, T2>(Uri requestUri, T entity, string etag,
                                                  PutOperationType putOperationType,
                                                  IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
                                                  CancellationToken cancellationToken)
        {
            T2 result = default(T2);

            await this.ExecuteAsync(
                new HttpMethod("PATCH"),
                new Uri(this.baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, etag, putOperationType);
#if WINDOWS_UWP || NETSTANDARD1_3
                var str            = Newtonsoft.Json.JsonConvert.SerializeObject(entity);
                requestMsg.Content = new StringContent(str, System.Text.Encoding.UTF8, "application/json");
#else
                requestMsg.Content = new ObjectContent <T>(entity, JsonFormatter);
#endif
                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T2>(httpClient, token),
                errorMappingOverrides,
                cancellationToken);

            return(result);
        }
        public async Task <T2> PutAsync <T, T2>(
            Uri requestUri,
            T entity,
            string etag,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken)
        {
            T2 result = default(T2);

            await this.ExecuteAsync(
                HttpMethod.Put,
                new Uri(this.baseAddress, requestUri),
                (requestMsg, token) =>
            {
                // TODO: skintali: Use string etag when service side changes are ready
                InsertEtag(requestMsg, etag, operationType);
#if NETSTANDARD1_3 || NETSTANDARD2_0
                var str            = Newtonsoft.Json.JsonConvert.SerializeObject(entity);
                requestMsg.Content = new StringContent(str, System.Text.Encoding.UTF8, "application/json");
#else
                requestMsg.Content = new ObjectContent <T>(entity, JsonFormatter);
#endif
                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T2>(httpClient, token).ConfigureAwait(false),
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);

            return(result);
        }
        public override Task <EnrollmentGroup> UpdateEnrollmentGroupAsync(EnrollmentGroup enrollmentGroup, bool forceUpdate, CancellationToken cancellationToken)
        {
            ThrowIfClosed();
            ValidateEnrollmentGroup(enrollmentGroup);

            if (string.IsNullOrWhiteSpace(enrollmentGroup.ETag) && !forceUpdate)
            {
                throw new ArgumentException(ApiResources.ETagNotSetWhileUpdatingEnrollmentGroup);
            }

            var errorMappingOverrides = new Dictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > >
            {
                {
                    HttpStatusCode.Conflict,
                    responseMessage => Task.FromResult((Exception) new EnrollmentGroupAlreadyExistsException(enrollmentGroup.EnrollmentGroupId))
                },
                {
                    HttpStatusCode.PreconditionFailed,
                    async(responseMessage) => new PreconditionFailedException(await ExceptionHandlingHelper.GetExceptionMessageAsync(responseMessage))
                }
            };

            PutOperationType operationType = forceUpdate ? PutOperationType.ForceUpdateEntity : PutOperationType.UpdateEntity;

            return(this.httpClientHelper.PutAsync(GetEnrollmentGroupUri(enrollmentGroup.EnrollmentGroupId), enrollmentGroup, operationType, errorMappingOverrides, cancellationToken));
        }
        public async Task <T> PutAsync <T>(
            Uri requestUri,
            T entity,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken) where T : IETagHolder
        {
            T result = default(T);

            await ExecuteAsync(
                HttpMethod.Put,
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, entity, operationType);
#if NET451
                requestMsg.Content = new ObjectContent <T>(entity, JsonFormatter);
#else
                var str            = Newtonsoft.Json.JsonConvert.SerializeObject(entity);
                requestMsg.Content = new StringContent(str, System.Text.Encoding.UTF8, "application/json");
#endif
                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T>(httpClient, token).ConfigureAwait(false),
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);

            return(result);
        }
        static void InsertEtag(HttpWebRequest requestMessage, IETagHolder entity, PutOperationType operationType)
        {
            if (operationType == PutOperationType.CreateEntity)
            {
                return;
            }

            if (operationType == PutOperationType.ForceUpdateEntity)
            {
                const string etag = "\"*\"";
                requestMessage.Headers.Add("IfMatch", etag);
            }
            else
            {
                InsertEtag(requestMessage, entity);
            }
        }
        static void InsertEtag(HttpWebRequest requestMessage, IETagHolder entity, PutOperationType operationType)
        {
            if (operationType == PutOperationType.CreateEntity)
            {
                return;
            }

            if (operationType == PutOperationType.ForceUpdateEntity)
            {
                const string etag = "\"*\"";
                requestMessage.Headers.Add("IfMatch", etag);
            }
            else
            {
                InsertEtag(requestMessage, entity);
            }
        }
Beispiel #13
0
        static void InsertEtag(HttpRequestMessage requestMessage, string etag, PutOperationType operationType)
        {
            if (operationType == PutOperationType.CreateEntity)
            {
                return;
            }

            string etagString = "\"*\"";

            if (operationType == PutOperationType.ForceUpdateEntity)
            {
                requestMessage.Headers.IfMatch.Add(new EntityTagHeaderValue(etagString));
            }
            else
            {
                InsertEtag(requestMessage, etag);
            }
        }
        public async Task PutAsync <T>(
            Uri requestUri,
            T entity,
            string etag,
            PutOperationType operationType,
            IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
            CancellationToken cancellationToken)
        {
            await ExecuteAsync(
                HttpMethod.Put,
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, etag, operationType);
                SetHttpRequestMessageContent <T>(requestMsg, entity);

                return(Task.FromResult(0));
            },
                null,
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);
        }
        public async Task <T2> PatchAsync <T, T2>(Uri requestUri, T entity, string etag,
                                                  PutOperationType putOperationType,
                                                  IDictionary <HttpStatusCode, Func <HttpResponseMessage, Task <Exception> > > errorMappingOverrides,
                                                  CancellationToken cancellationToken)
        {
            T2 result = default;

            await ExecuteAsync(
                new HttpMethod("PATCH"),
                new Uri(_baseAddress, requestUri),
                (requestMsg, token) =>
            {
                InsertEtag(requestMsg, etag, putOperationType);
                SetHttpRequestMessageContent <T>(requestMsg, entity);

                return(Task.FromResult(0));
            },
                async (httpClient, token) => result = await ReadResponseMessageAsync <T2>(httpClient, token).ConfigureAwait(false),
                errorMappingOverrides,
                cancellationToken).ConfigureAwait(false);

            return(result);
        }
Beispiel #16
0
        private static void InsertEtag(HttpRequestMessage requestMessage, IETagHolder entity, PutOperationType operationType)
        {
            if (operationType == PutOperationType.CreateEntity)
            {
                return;
            }

            if (operationType == PutOperationType.ForceUpdateEntity)
            {
                const string etag = "\"*\"";
                requestMessage.Headers.IfMatch.Add(new EntityTagHeaderValue(etag));
            }
            else
            {
                InsertEtag(requestMessage, entity);
            }
        }