Skip to content

Commit 2c277aa

Browse files
committed
Fix streaming download double-read in Uploadcare ActiveStorage service
1 parent 17e0aee commit 2c277aa

File tree

1 file changed

+27
-6
lines changed
  • lib/active_storage/service/uploadcare_service

1 file changed

+27
-6
lines changed

lib/active_storage/service/uploadcare_service/helpers.rb

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,40 @@ def file_exists?(key)
2727
true
2828
end
2929

30-
def request(url, range: nil)
30+
def request(url, range: nil, &block)
3131
uri = URI.parse(url)
32-
request = Net::HTTP::Get.new(uri)
33-
request['Range'] = "bytes=#{range.begin}-#{range.end}" if range
32+
request = build_request(uri, range)
3433

3534
Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
36-
response = http.request(request)
37-
raise ActiveStorage::FileNotFoundError if response.is_a?(Net::HTTPNotFound)
35+
return request_streaming(http, request, &block) if block
3836

39-
yield response
37+
request_once(http, request)
4038
end
4139
end
4240

41+
def build_request(uri, range)
42+
request = Net::HTTP::Get.new(uri)
43+
request['Range'] = "bytes=#{range.begin}-#{range.end}" if range
44+
request
45+
end
46+
47+
def request_streaming(http, request, &block)
48+
http.request(request) do |response|
49+
raise_not_found!(response)
50+
block.call(response)
51+
end
52+
end
53+
54+
def request_once(http, request)
55+
response = http.request(request)
56+
raise_not_found!(response)
57+
response
58+
end
59+
60+
def raise_not_found!(response)
61+
raise ActiveStorage::FileNotFoundError if response.is_a?(Net::HTTPNotFound)
62+
end
63+
4364
def ensure_integrity(io, checksum)
4465
io.rewind
4566
actual_checksum = Base64.strict_encode64(Digest::MD5.digest(io.read))

0 commit comments

Comments
 (0)