diff --git a/app/logical/downloads/file.rb b/app/logical/downloads/file.rb index e77e6d0a7..85bdd529b 100644 --- a/app/logical/downloads/file.rb +++ b/app/logical/downloads/file.rb @@ -41,8 +41,8 @@ module Downloads limit = 4 while true - unless url.is_a?(URI::HTTP) - raise Error.new("URL must be HTTP") + unless url.is_a?(URI::HTTP) || url.is_a?(URI::HTTPS) + raise Error.new("URL must be HTTP or HTTPS") end headers = { @@ -50,7 +50,7 @@ module Downloads } @source, headers = before_download(source, headers) - Net::HTTP.start(url.host, url.port) do |http| + Net::HTTP.start(url.host, url.port, :use_ssl => url.is_a?(URI::HTTPS)) do |http| http.read_timeout = 10 http.request_get(url.request_uri, headers) do |res| case res diff --git a/app/models/upload.rb b/app/models/upload.rb index 919edcb42..cd2523601 100644 --- a/app/models/upload.rb +++ b/app/models/upload.rb @@ -247,7 +247,7 @@ class Upload < ActiveRecord::Base module DownloaderMethods # Determines whether the source is downloadable def is_downloadable? - source =~ /^http:\/\// && file_path.blank? + source =~ /^https?:\/\// && file_path.blank? end # Downloads the file to destination_path diff --git a/test/unit/downloads/file_test.rb b/test/unit/downloads/file_test.rb index efac1cee2..24fd99a29 100644 --- a/test/unit/downloads/file_test.rb +++ b/test/unit/downloads/file_test.rb @@ -39,5 +39,24 @@ module Downloads assert_match(/image\/gif/, @download.content_type) end end + + context "A post download with an HTTPS source" do + setup do + @source = "https://www.google.com/intl/en_ALL/images/logo.gif" + @tempfile = Tempfile.new("danbooru-test") + @download = Downloads::File.new(@source, @tempfile.path) + end + + teardown do + @tempfile.close + end + + should "stream a file from an HTTPS source" do + @download.http_get_streaming do |resp| + assert_equal("200", resp.code) + assert(resp["Content-Length"].to_i > 0, "File should be larger than 0 bytes") + end + end + end end end diff --git a/test/unit/upload_test.rb b/test/unit/upload_test.rb index d4b0a249d..44518811c 100644 --- a/test/unit/upload_test.rb +++ b/test/unit/upload_test.rb @@ -79,6 +79,23 @@ class UploadTest < ActiveSupport::TestCase end end + context "determining if a file is downloadable" do + should "classify HTTP sources as downloadable" do + @upload = FactoryGirl.create(:source_upload, source: "http://www.example.com/1.jpg") + assert_not_nil(@upload.is_downloadable?) + end + + should "classify HTTPS sources as downloadable" do + @upload = FactoryGirl.create(:source_upload, source: "https://www.example.com/1.jpg") + assert_not_nil(@upload.is_downloadable?) + end + + should "classify non-HTTP/HTTPS sources as not downloadable" do + @upload = FactoryGirl.create(:source_upload, source: "ftp://www.example.com/1.jpg") + assert_nil(@upload.is_downloadable?) + end + end + context "file processor" do should "parse and process a cgi file representation" do FileUtils.cp("#{Rails.root}/test/files/test.jpg", "#{Rails.root}/tmp")