protected static async Task BuildException()

in src/JetBrains.Space.Common/BearerTokenConnection.cs [228:287]


    protected static async Task<ResourceException> BuildException(string? functionName, HttpRequestMessage? request, HttpResponseMessage response)
    {
        // 1. Determine Space error
        SpaceError? spaceError = null;
        try
        {
            spaceError = await JsonSerializer.DeserializeAsync<SpaceError>(await response.Content.ReadAsStreamAsync(), JsonSerializerOptions);
        }
        catch (JsonException)
        {
            // Intentional.
        }
            
        // 2. Build Exception
        ResourceException? exception = null;
        if (spaceError != null)
        {
            exception = spaceError.Error switch
            {
                ErrorCodes.ValidationError => new ValidationException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.AuthenticationRequired => !string.IsNullOrEmpty(spaceError.Description) && spaceError.Description.Equals("Refresh token associated with the access token is revoked", StringComparison.InvariantCulture)
                    ? new RefreshTokenRevokedException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase)
                    : new AuthenticationRequiredException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.PermissionDenied => new PermissionDeniedException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.DuplicatedEntity => new DuplicatedEntityException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.RequestError => new ResourceException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.NotFound => new NotFoundException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.RateLimited => new RateLimitedException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.PayloadTooLarge => new PayloadTooLargeException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                ErrorCodes.InternalServerError => new InternalServerErrorException(spaceError.Description, request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                _ => exception
            };
        }
        else
        {
            exception = response.StatusCode switch
            {
                HttpStatusCode.BadRequest => new ResourceException("Bad Request", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.Unauthorized => new AuthenticationRequiredException("Unauthorized", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.Forbidden => new PermissionDeniedException("Forbidden", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.NotFound => new NotFoundException("Not Found", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.TooManyRequests => new RateLimitedException("Too Many Requests", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.RequestEntityTooLarge => new PayloadTooLargeException("Bad Request", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.RequestHeaderFieldsTooLarge => new PayloadTooLargeException("Bad Request", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                HttpStatusCode.InternalServerError => new InternalServerErrorException("Internal Server Error", request?.RequestUri, functionName, response.StatusCode, response.ReasonPhrase),
                _ => exception
            };
        }

        exception ??= new ResourceException(
            "An error occurred while accessing the resource.",
            request?.RequestUri,
            functionName,
            response.StatusCode,
            response.ReasonPhrase);
            
        exception.Error = spaceError;
            
        return exception;
    }