From ee6581ab7f40fe8d94cce3e8224f6e50b4542809 Mon Sep 17 00:00:00 2001 From: r888888888 Date: Thu, 13 Jul 2017 15:30:35 -0700 Subject: [PATCH] restore streaming behavior for Downloads::File#http_get_streaming --- app/logical/downloads/file.rb | 16 +++++++++------- test/unit/downloads/file_test.rb | 8 +++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/logical/downloads/file.rb b/app/logical/downloads/file.rb index 8de1c2dea..21b72d265 100644 --- a/app/logical/downloads/file.rb +++ b/app/logical/downloads/file.rb @@ -36,10 +36,9 @@ module Downloads end def download! - @source, @data = http_get_streaming(@source, @data) do |response| - self.content_type = response["Content-Type"] - ::File.open(@file_path, "wb") do |out| - out.write(response.body) + ::File.open(@file_path, "wb") do |out| + @source, @data = http_get_streaming(@source, @data) do |response| + out.write(response) end end @downloaded_source = @source @@ -69,7 +68,7 @@ module Downloads end end - def http_get_streaming(src, datums = {}, options = {}) + def http_get_streaming(src, datums = {}, options = {}, &block) max_size = options[:max_size] || Danbooru.config.max_file_size max_size = nil if max_size == 0 # unlimited limit = 4 @@ -90,13 +89,16 @@ module Downloads validate_local_hosts(url) begin - res = HTTParty.get(url, Danbooru.config.httparty_options.reverse_merge(timeout: 10, headers: headers)) + res = HTTParty.get(url, Danbooru.config.httparty_options.reverse_merge(stream_body: true, timeout: 10, headers: headers), &block) + if res.success? if max_size len = res["Content-Length"] raise Error.new("File is too large (#{len} bytes)") if len && len.to_i > max_size end - yield(res) + + @content_type = res["Content-Type"] + return [src, datums] else raise Error.new("HTTP error code: #{res.code} #{res.message}") diff --git a/test/unit/downloads/file_test.rb b/test/unit/downloads/file_test.rb index f037ff9a1..65718c753 100644 --- a/test/unit/downloads/file_test.rb +++ b/test/unit/downloads/file_test.rb @@ -15,7 +15,7 @@ module Downloads context "that fails" do setup do - Net::HTTP.stubs(:start).raises(Errno::ETIMEDOUT) + HTTParty.stubs(:get).raises(Errno::ETIMEDOUT) end should "retry three times" do @@ -27,8 +27,7 @@ module Downloads should "stream a file from an HTTP source" do @download.http_get_streaming(@source) do |resp| - assert_equal("200", resp.code) - assert(resp["Content-Length"].to_i > 0, "File should be larger than 0 bytes") + assert(resp.size > 0) end end @@ -65,8 +64,7 @@ module Downloads should "stream a file from an HTTPS source" do @download.http_get_streaming(@source) do |resp| - assert_equal("200", resp.code) - assert(resp["Content-Length"].to_i > 0, "File should be larger than 0 bytes") + assert(resp.size > 0) end end end