示例#1
0
        private async Task <bool> CheckStatusAsync(long id, CancellationToken cancellationToken)
        {
            UploadStatusResponse uploadStatusResponse = null;
            string errorMessage;

            for (int i = 0; i < 30; i++)
            {
                HttpResponseMessage response = await _httpClient.GetAsync(new Uri($"api/v3/uploads/{id}", UriKind.Relative), cancellationToken);

                if (response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
                {
                    await PauseForStravaTimeoutAsync(cancellationToken);

                    response = await _httpClient.GetAsync(new Uri($"api/v3/uploads/{id}", UriKind.Relative), cancellationToken);
                }

                if (!CheckSuccessStatusCode(response))
                {
                    return(false);
                }

                string json = await response.Content.ReadAsStringAsync(cancellationToken);

                _logger.LogDebug(json);
                uploadStatusResponse = JsonConvert.DeserializeObject <UploadStatusResponse>(json);

                if (!string.IsNullOrEmpty(uploadStatusResponse.Error))
                {
                    errorMessage = "The API returned an error: " + uploadStatusResponse.Error;
                    Console.WriteLine(errorMessage);
                    _logger.LogError(errorMessage);
                    return(false);
                }

                if (uploadStatusResponse.ActivityId.HasValue || uploadStatusResponse.Status.Contains("Your activity is ready", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(true);
                }

                // From documentation: https://developers.strava.com/docs/uploads/
                // "Strava recommends polling no more than once a second. The mean processing time is around 8 seconds."
                await Task.Delay(TimeSpan.FromSeconds(2), cancellationToken);
            }

            errorMessage = "The API did not return success status for activity.The last response was:" + Environment.NewLine +
                           "Status=" + uploadStatusResponse.Status + Environment.NewLine +
                           "Error=" + uploadStatusResponse.Error;
            Console.WriteLine(errorMessage);
            _logger.LogError(errorMessage);

            return(false);
        }
 public List <UploadStatusResponse> GetAllUploadStatus()
 {
     return(UploadStatusResponse.fromSessionList(uploadService.getAllSessions()));
 }
 public UploadStatusResponse GetUploadStatus([FromRoute, Required] string sessionId)
 {
     return(UploadStatusResponse.fromSession(uploadService.getSession(sessionId)));
 }
示例#4
0
        public async Task <bool> ImportAsync(WorkoutModel workoutModel, bool dryRun, CancellationToken cancellationToken)
        {
            if (workoutModel == null)
            {
                throw new ArgumentNullException(nameof(workoutModel));
            }

            if (dryRun)
            {
                return(true);
            }

            string accessToken = await _authenticationService.GetAccessTokenAsync();

            if (string.IsNullOrEmpty(accessToken))
            {
                Console.WriteLine("Could not get access token, the operation is canceled.");
                _logger.LogWarning("Could not get access token, the operation is canceled.");
                return(false);
            }

            _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            UploadStatusResponse uploadStatusResponse = null;

            using (MultipartFormDataContent form = new MultipartFormDataContent())
            {
                form.Add(new StringContent(workoutModel.ActivityType), "activity_type");
                form.Add(new StringContent(workoutModel.Name), "name");
                form.Add(new StringContent(workoutModel.DataType), "data_type");

                byte[] fileContent = await File.ReadAllBytesAsync(workoutModel.FilePath, cancellationToken);

                form.Add(new ByteArrayContent(fileContent, 0, fileContent.Length), "file", new FileInfo(workoutModel.FilePath).Name);

                HttpResponseMessage response = await _httpClient.PostAsync(new Uri("/api/v3/uploads", UriKind.Relative), form, cancellationToken);

                if (response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
                {
                    await PauseForStravaTimeoutAsync(cancellationToken);

                    response = await _httpClient.PostAsync(new Uri("/api/v3/uploads", UriKind.Relative), form, cancellationToken);
                }

                if (!CheckSuccessStatusCode(response))
                {
                    return(false);
                }

                string json = await response.Content.ReadAsStringAsync(cancellationToken);

                _logger.LogDebug(json);
                uploadStatusResponse = JsonConvert.DeserializeObject <UploadStatusResponse>(json);

                if (!string.IsNullOrEmpty(uploadStatusResponse.Error))
                {
                    _logger.LogError($"The API returned an error: '{uploadStatusResponse.Error}'");
                    return(false);
                }
            }

            return(await CheckStatusAsync(uploadStatusResponse.Id, cancellationToken));
        }