public Task <TraktResponse <ITraktAuthorization> > PollForAuthorizationAsync(ITraktDevice device, string clientId, string clientSecret, CancellationToken cancellationToken = default) { var request = new AuthorizationPollRequest { RequestBody = new AuthorizationPollRequestBody { ClientId = clientId, ClientSecret = clientSecret, Device = device } }; var requestHandler = new AuthenticationRequestHandler(Client); return(requestHandler.PollForAuthorizationAsync(request, cancellationToken)); }
public async Task <TraktResponse <ITraktAuthorization> > PollForAuthorizationAsync(AuthorizationPollRequest request, CancellationToken cancellationToken = default) { try { request.Validate(); ExtendedHttpRequestMessage requestMessage = await _requestMessageBuilder.Reset(request) .WithRequestBody(request.RequestBody) .DisableAPIVersionHeader() .DisableAPIClientIdHeader() .Build().ConfigureAwait(false); HttpResponseMessage responseMessage; Stream responseContentStream; HttpStatusCode responseCode; string reasonPhrase = string.Empty; uint totalExpiredSeconds = 0; ITraktDevice device = request.RequestBody.Device; IObjectJsonReader <ITraktAuthorization> objectJsonReader = JsonFactoryContainer.CreateObjectReader <ITraktAuthorization>(); while (totalExpiredSeconds < device.ExpiresInSeconds) { responseMessage = await _client.HttpClientProvider.GetHttpClient().SendAsync(requestMessage, cancellationToken).ConfigureAwait(false); responseCode = responseMessage.StatusCode; reasonPhrase = responseMessage.ReasonPhrase; if (responseCode == HttpStatusCode.OK) // Success { responseContentStream = await ResponseMessageHelper.GetResponseContentStreamAsync(responseMessage).ConfigureAwait(false); ITraktAuthorization traktAuthorization = await objectJsonReader.ReadObjectAsync(responseContentStream, cancellationToken).ConfigureAwait(false); var response = new TraktResponse <ITraktAuthorization>() { Value = traktAuthorization, HasValue = traktAuthorization != null, IsSuccess = traktAuthorization != null }; if (responseMessage.Headers != null) { ResponseHeaderParser.ParseResponseHeaderValues(response, responseMessage.Headers); } _client.Authentication.Authorization = traktAuthorization; return(response); } else if (responseCode == HttpStatusCode.BadRequest) // Pending { await Task.Delay((int)device.IntervalInMilliseconds).ConfigureAwait(false); totalExpiredSeconds += device.IntervalInSeconds; requestMessage = await _requestMessageBuilder.Reset(request).WithRequestBody(request.RequestBody).Build().ConfigureAwait(false); continue; } await ResponseErrorHandler.HandleErrorsAsync(requestMessage, responseMessage, isInAuthorizationPolling : true, cancellationToken : cancellationToken).ConfigureAwait(false); break; } throw new TraktAuthenticationDeviceException("unknown exception") { RequestUrl = requestMessage.Url, RequestBody = requestMessage.RequestBodyJson, ServerReasonPhrase = reasonPhrase }; } catch (Exception ex) { if (_client.Configuration.ThrowResponseExceptions) { throw; } return(new TraktResponse <ITraktAuthorization> { IsSuccess = false, Exception = ex }); } }