mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 15:15:50 +08:00
e0ff367b49
This doesn't cope well with gzipped, binary, or large responses. Ideally we would teach FinalDestination to safely retrieve and decode some of the response body. But for now, let's remove the broken implementation.
172 lines
4.3 KiB
Ruby
172 lines
4.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'file_helper'
|
|
|
|
describe FileHelper do
|
|
|
|
let(:url) { "https://eviltrout.com/trout.png" }
|
|
let(:png) { File.read("#{Rails.root}/spec/fixtures/images/cropped.png") }
|
|
|
|
before do
|
|
stub_request(:any, /https:\/\/eviltrout.com/)
|
|
stub_request(:get, url).to_return(body: png)
|
|
end
|
|
|
|
describe "download" do
|
|
it "correctly raises an OpenURI HTTP error if it gets a 404 even with redirect" do
|
|
url = "http://fourohfour.com/404"
|
|
stub_request(:get, url).to_return(status: 404, body: "404")
|
|
|
|
expect do
|
|
begin
|
|
FileHelper.download(
|
|
url,
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp',
|
|
follow_redirect: true
|
|
)
|
|
rescue => e
|
|
expect(e.io.status[0]).to eq("404")
|
|
raise
|
|
end
|
|
end.to raise_error(OpenURI::HTTPError, "404 Error")
|
|
end
|
|
|
|
it "does not follow redirects if instructed not to" do
|
|
url2 = "https://test.com/image.png"
|
|
stub_request(:get, url).to_return(status: 302, body: "", headers: { location: url2 })
|
|
|
|
missing = FileHelper.download(
|
|
url,
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp',
|
|
follow_redirect: false
|
|
)
|
|
|
|
expect(missing).to eq(nil)
|
|
end
|
|
|
|
it "does follow redirects if instructed to" do
|
|
url2 = "https://test.com/image.png"
|
|
stub_request(:get, url).to_return(status: 302, body: "", headers: { location: url2 })
|
|
stub_request(:get, url2).to_return(status: 200, body: "i am the body")
|
|
|
|
begin
|
|
found = FileHelper.download(
|
|
url,
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp',
|
|
follow_redirect: true
|
|
)
|
|
|
|
expect(found.read).to eq("i am the body")
|
|
ensure
|
|
found&.close
|
|
found&.unlink
|
|
end
|
|
end
|
|
|
|
it "correctly raises an OpenURI HTTP error if it gets a 404" do
|
|
url = "http://fourohfour.com/404"
|
|
|
|
stub_request(:get, url).to_return(status: 404, body: "404")
|
|
|
|
expect do
|
|
begin
|
|
FileHelper.download(
|
|
url,
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp',
|
|
follow_redirect: false
|
|
)
|
|
rescue => e
|
|
expect(e.io.status[0]).to eq("404")
|
|
raise
|
|
end
|
|
end.to raise_error(OpenURI::HTTPError)
|
|
end
|
|
|
|
it "returns a file with the image" do
|
|
begin
|
|
tmpfile = FileHelper.download(
|
|
url,
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp'
|
|
)
|
|
|
|
expect(Base64.encode64(tmpfile.read)).to eq(Base64.encode64(png))
|
|
ensure
|
|
tmpfile&.close
|
|
tmpfile&.unlink
|
|
end
|
|
end
|
|
|
|
it "works with a protocol relative url" do
|
|
begin
|
|
tmpfile = FileHelper.download(
|
|
"//eviltrout.com/trout.png",
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp'
|
|
)
|
|
|
|
expect(Base64.encode64(tmpfile.read)).to eq(Base64.encode64(png))
|
|
ensure
|
|
tmpfile&.close
|
|
tmpfile&.unlink
|
|
end
|
|
end
|
|
|
|
describe 'when max_file_size is exceeded' do
|
|
it 'should return nil' do
|
|
tmpfile = FileHelper.download(
|
|
"//eviltrout.com/trout.png",
|
|
max_file_size: 1,
|
|
tmp_file_name: 'trouttmp'
|
|
)
|
|
|
|
expect(tmpfile).to eq(nil)
|
|
end
|
|
|
|
it 'is able to retain the tmpfile' do
|
|
begin
|
|
tmpfile = FileHelper.download(
|
|
"//eviltrout.com/trout.png",
|
|
max_file_size: 1,
|
|
tmp_file_name: 'trouttmp',
|
|
retain_on_max_file_size_exceeded: true
|
|
)
|
|
|
|
expect(tmpfile.closed?).to eq(false)
|
|
ensure
|
|
tmpfile&.close
|
|
tmpfile&.unlink
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'when url is a jpeg' do
|
|
let(:url) { "https://eviltrout.com/trout.jpg" }
|
|
|
|
it "should prioritize the content type returned by the response" do
|
|
begin
|
|
stub_request(:get, url).to_return(body: png, headers: {
|
|
"content-type": "image/png"
|
|
})
|
|
|
|
tmpfile = FileHelper.download(
|
|
url,
|
|
max_file_size: 10000,
|
|
tmp_file_name: 'trouttmp'
|
|
)
|
|
|
|
expect(File.extname(tmpfile)).to eq('.png')
|
|
ensure
|
|
tmpfile&.close
|
|
tmpfile&.unlink
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|