private async Task <TraktResponse <ITraktAuthorization> > ExecuteAuthorizationRequestAsync <TRequestBodyType>(IPostRequest <ITraktAuthorization, TRequestBodyType> request, bool isRefreshRequest, CancellationToken cancellationToken = default) where TRequestBodyType : IRequestBody
        {
            try
            {
                request.Validate();

                ExtendedHttpRequestMessage requestMessage =
                    await _requestMessageBuilder.Reset(request)
                    .WithRequestBody(request.RequestBody)
                    .DisableAPIVersionHeader()
                    .DisableAPIClientIdHeader()
                    .Build().ConfigureAwait(false);

                HttpResponseMessage responseMessage = await _client.HttpClientProvider.GetHttpClient().SendAsync(requestMessage, cancellationToken).ConfigureAwait(false);

                HttpStatusCode responseCode = responseMessage.StatusCode;
                Stream         responseContentStream;

                if (responseCode == HttpStatusCode.OK)
                {
                    responseContentStream = await ResponseMessageHelper.GetResponseContentStreamAsync(responseMessage).ConfigureAwait(false);

                    IObjectJsonReader <ITraktAuthorization> objectJsonReader = JsonFactoryContainer.CreateObjectReader <ITraktAuthorization>();
                    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.Unauthorized) // Invalid code
                {
                    responseContentStream = await ResponseMessageHelper.GetResponseContentStreamAsync(responseMessage).ConfigureAwait(false);

                    IObjectJsonReader <ITraktError> objectJsonReader = JsonFactoryContainer.CreateObjectReader <ITraktError>();
                    ITraktError traktError = await objectJsonReader.ReadObjectAsync(responseContentStream, cancellationToken).ConfigureAwait(false);

                    var errorMessage = traktError != null ? ($"error on {(isRefreshRequest ? "refreshing" : "retrieving")} oauth access token\nerror: {traktError.Error}\ndescription: {traktError.Description}")
                                                          : "unknown error";

                    throw new TraktAuthenticationOAuthException(errorMessage)
                          {
                              StatusCode         = responseCode,
                              RequestUrl         = requestMessage.Url,
                              RequestBody        = requestMessage.RequestBodyJson,
                              ServerReasonPhrase = responseMessage.ReasonPhrase
                          };
                }

                await ResponseErrorHandler.HandleErrorsAsync(requestMessage, responseMessage, isAuthorizationRequest : true, cancellationToken : cancellationToken).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                if (_client.Configuration.ThrowResponseExceptions)
                {
                    throw;
                }

                return(new TraktResponse <ITraktAuthorization> {
                    IsSuccess = false, Exception = ex
                });
            }

            return(new TraktResponse <ITraktAuthorization>());
        }
Beispiel #2
0
        private static async Task HandleUnknownErrorAsync(ResponseErrorParameters errorParameters, CancellationToken cancellationToken = default)
        {
            string requestUrl   = errorParameters.Url;
            string requestBody  = errorParameters.RequestBody;
            string responseBody = errorParameters.ResponseBody;
            string reasonPhrase = errorParameters.ServerReasonPhrase;

            if (errorParameters.IsDeviceRequest || errorParameters.IsInAuthorizationPolling)
            {
                throw new TraktAuthenticationDeviceException("unknown exception")
                      {
                          StatusCode         = errorParameters.StatusCode,
                          RequestUrl         = requestUrl,
                          RequestBody        = requestBody,
                          Response           = responseBody,
                          ServerReasonPhrase = reasonPhrase
                      };
            }
            else if (errorParameters.IsAuthorizationRequest)
            {
                throw new TraktAuthenticationOAuthException("unknown exception")
                      {
                          StatusCode         = errorParameters.StatusCode,
                          RequestUrl         = requestUrl,
                          RequestBody        = requestBody,
                          Response           = responseBody,
                          ServerReasonPhrase = reasonPhrase
                      };
            }
            else if (errorParameters.IsAuthorizationRevoke)
            {
                throw new TraktAuthenticationException("unknown exception")
                      {
                          StatusCode         = errorParameters.StatusCode,
                          RequestUrl         = requestUrl,
                          RequestBody        = requestBody,
                          Response           = responseBody,
                          ServerReasonPhrase = reasonPhrase
                      };
            }

            ITraktError error = null;

            try
            {
                IObjectJsonReader <ITraktError> errorReader = JsonFactoryContainer.CreateObjectReader <ITraktError>();
                error = await errorReader.ReadObjectAsync(responseBody, cancellationToken).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                throw new TraktException("json convert exception", ex);
            }

            var errorMessage = (error == null || string.IsNullOrEmpty(error.Description))
                                    ? $"Trakt API error without content. Response status code was {(int)errorParameters.StatusCode}"
                                    : error.Description;

            throw new TraktException(errorMessage)
                  {
                      StatusCode         = errorParameters.StatusCode,
                      RequestUrl         = requestUrl,
                      RequestBody        = requestBody,
                      Response           = responseBody,
                      ServerReasonPhrase = reasonPhrase
                  };
        }