FIX: Improve error handling for `calculate_dominant_color!` (#18503)
These errors tend to indicate that the upload is missing on the remote store. This is bad, but we don't want it to block the dominant-color calculation process. This commit catches errors when there is an HTTP error, and fixes the `base_store.rb` implementation when `FileHelper.download` returns nil.
This commit is contained in:
parent
2d518b2895
commit
e83d35d6f3
|
@ -373,6 +373,10 @@ class Upload < ActiveRecord::Base
|
||||||
raise "Calculated dominant color but unable to parse output:\n#{data}" if color.nil?
|
raise "Calculated dominant color but unable to parse output:\n#{data}" if color.nil?
|
||||||
|
|
||||||
color
|
color
|
||||||
|
rescue OpenURI::HTTPError => e
|
||||||
|
# Some issue with downloading the image from a remote store.
|
||||||
|
# Assume the upload is broken and save an empty string to prevent re-evaluation
|
||||||
|
""
|
||||||
rescue Discourse::Utils::CommandError => e
|
rescue Discourse::Utils::CommandError => e
|
||||||
# Timeout or unable to parse image
|
# Timeout or unable to parse image
|
||||||
# This can happen due to bad user input - ignore and save
|
# This can happen due to bad user input - ignore and save
|
||||||
|
|
|
@ -116,6 +116,8 @@ module FileStore
|
||||||
follow_redirect: true
|
follow_redirect: true
|
||||||
)
|
)
|
||||||
|
|
||||||
|
return nil if file.nil?
|
||||||
|
|
||||||
cache_file(file, filename)
|
cache_file(file, filename)
|
||||||
file = get_from_cache(filename)
|
file = get_from_cache(filename)
|
||||||
end
|
end
|
||||||
|
|
|
@ -703,7 +703,7 @@ RSpec.describe Upload do
|
||||||
expect(invalid_image.dominant_color).to eq(nil)
|
expect(invalid_image.dominant_color).to eq(nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
it "correctly handles download failures" do
|
it "correctly handles error when file is too large to download" do
|
||||||
white_image.stubs(:local?).returns(true)
|
white_image.stubs(:local?).returns(true)
|
||||||
Discourse.store.stubs(:download).returns(nil)
|
Discourse.store.stubs(:download).returns(nil)
|
||||||
|
|
||||||
|
@ -712,6 +712,15 @@ RSpec.describe Upload do
|
||||||
expect(invalid_image.dominant_color).to eq("")
|
expect(invalid_image.dominant_color).to eq("")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "correctly handles error when file has HTTP error" do
|
||||||
|
white_image.stubs(:local?).returns(true)
|
||||||
|
Discourse.store.stubs(:download).raises(OpenURI::HTTPError)
|
||||||
|
|
||||||
|
expect(invalid_image.dominant_color).to eq(nil)
|
||||||
|
expect(invalid_image.dominant_color(calculate_if_missing: true)).to eq("")
|
||||||
|
expect(invalid_image.dominant_color).to eq("")
|
||||||
|
end
|
||||||
|
|
||||||
it "is validated for length" do
|
it "is validated for length" do
|
||||||
u = Fabricate(:upload)
|
u = Fabricate(:upload)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue