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)); } }