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