private async Task CreateOrUpdateRegistrationImplAsync()

in src/Microsoft.Azure.NotificationHubs/NotificationHubClient.cs [3240:3287]


        private async Task<TRegistration> CreateOrUpdateRegistrationImplAsync<TRegistration>(TRegistration registration, EntityOperatonType operationType, CancellationToken cancellationToken) where TRegistration : RegistrationDescription
        {
            registration = (TRegistration)registration.Clone();
            registration.NotificationHubPath = _notificationHubPath;
            registration.ExpirationTime = null;

            RegistrationSDKHelper.ValidateRegistration(registration);

            var requestUri = GetGenericRequestUriBuilder();
            requestUri.Path += "registrations";

            switch (operationType)
            {
                case EntityOperatonType.Create:
                    registration.ETag = null;
                    break;
                case EntityOperatonType.CreateOrUpdate:
                    registration.ETag = null;
                    requestUri.Path += $"/{registration.RegistrationId}";
                    break;
                case EntityOperatonType.Update:
                    requestUri.Path += $"/{registration.RegistrationId}";
                    break;
            }

            registration.RegistrationId = null;

            return await _retryPolicy.RunOperation(async (ct) =>
            {
                using (var request = CreateHttpRequest(operationType == EntityOperatonType.Create ? HttpMethod.Post : HttpMethod.Put, requestUri.Uri, out var trackingId))
                {
                    if (operationType == EntityOperatonType.Update)
                    {
                        request.Headers.Add(ManagementStrings.IfMatch, string.IsNullOrEmpty(registration.ETag) ? "*" : $"\"{registration.ETag}\"");
                    }

                    AddEntityToRequestContent(request, registration);

                    using (var response = await SendRequestAsync(request, trackingId, new[] { HttpStatusCode.OK, HttpStatusCode.Created }, ct).ConfigureAwait(false))
                    {
                        using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                        {
                            return await ReadEntityAsync<TRegistration>(responseStream).ConfigureAwait(false);
                        }
                    }
                }
            }, cancellationToken);
        }