Handle only specifically relevant Azure HTTPErrors

The Azure gem uses `Azure::Core::Http::HTTPError` for everything:
checksum mismatch, missing object, network unavailable, and many more.
(https://www.rubydoc.info/github/yaxia/azure-storage-ruby/Azure/Core/Http/HTTPError).
Rescuing that class obscures all sorts of  configuration errors. We
should check the type of error in those rescue  blocks, and reraise when
needed.
This commit is contained in:
Cameron Bothner 2018-08-23 23:36:43 -04:00
parent 3868648cae
commit aae56c3529
2 changed files with 14 additions and 5 deletions

@ -1,3 +1,10 @@
* `ActiveStorage::Service::AzureStorageService` only handles specifically
relevant types of `Azure::Core::Http::HTTPError`. It previously obscured
other types of `HTTPError`, which is the azure-storage gems catch-all
exception class.
*Cameron Bothner*
* `ActiveStorage::DiskController#show` generates a 404 Not Found response when
the requested file is missing from the disk service. It previously raised
`Errno::ENOENT`.

@ -19,10 +19,8 @@ def initialize(storage_account_name:, storage_access_key:, container:)
def upload(key, io, checksum: nil)
instrument :upload, key: key, checksum: checksum do
begin
handle_errors do
blobs.create_block_blob(container, key, IO.try_convert(io) || io, content_md5: checksum)
rescue Azure::Core::Http::HTTPError
raise ActiveStorage::IntegrityError
end
end
end
@ -55,7 +53,8 @@ def delete(key)
instrument :delete, key: key do
begin
blobs.delete_blob(container, key)
rescue Azure::Core::Http::HTTPError
rescue Azure::Core::Http::HTTPError => e
raise unless e.type == "BlobNotFound"
# Ignore files already deleted
end
end
@ -155,8 +154,11 @@ def stream(key)
def handle_errors
yield
rescue Azure::Core::Http::HTTPError => e
if e.type == "BlobNotFound"
case e.type
when "BlobNotFound"
raise ActiveStorage::FileNotFoundError
when "Md5Mismatch"
raise ActiveStorage::IntegrityError
else
raise
end