Example #1
0
        public async Task <Error> ValidateHttpResponseAsync(HttpResponseMessage httpResponse)
        {
            if (httpResponse.IsSuccessStatusCode)
            {
                return(new Error(ErrorCode.None));
            }

            if (IsTimeoutError(httpResponse))
            {
                return(_errorBuilder.GetTimeoutError());
            }

            JsonElement errorObject = default;

            using (var responseStream = await httpResponse.Content.ReadAsStreamAsync().ConfigureAwait(false))
            {
                errorObject = await JsonSerializer.DeserializeAsync <JsonElement>(responseStream, _jsonSerializerOptions).ConfigureAwait(false);
            }

            if (errorObject.ValueKind != JsonValueKind.Object)
            {
                return(_errorBuilder.GetUnknownError());
            }

            if (ErrorHasServiceVersionProperty(errorObject))
            {
                var code    = int.Parse(errorObject.GetProperty("code").ToString());
                var message = errorObject.GetProperty("msg").ToString();

                switch (code)
                {
                case 400: return(_errorBuilder.GetBadRequestError(message));

                case 500: return(_errorBuilder.GetInternalServiceError(message));

                default:  return(_errorBuilder.GetUnknownError(message));
                }
            }

            var hasError = errorObject.TryGetProperty("error", out var error);

            if (!hasError)
            {
                return(_errorBuilder.GetUnknownError());
            }

            var errorCode     = error.GetProperty("code").ToString();
            var apodErrorCode = GetErrorCode(errorCode);

            var errorMessage = error.GetProperty("message").ToString();

            switch (apodErrorCode)
            {
            case ErrorCode.ApiKeyMissing: return(_errorBuilder.GetApiKeyMissingError());

            case ErrorCode.ApiKeyInvalid: return(_errorBuilder.GetApiKeyInvalidError());

            case ErrorCode.OverRateLimit: return(_errorBuilder.GetOverRateLimitError());

            default:                      return(_errorBuilder.GetUnknownError(errorMessage));
            }
        }