diff --git a/app/models/zip_file.rb b/app/models/zip_file.rb index b2760c1c4..2f135fd8d 100644 --- a/app/models/zip_file.rb +++ b/app/models/zip_file.rb @@ -65,7 +65,7 @@ class ZipFile def read_from_s3(blob) url = blob.url(expires_in: 6.hour) - remote_io = ZipKit::RemoteIO.new(url) + remote_io = RemoteIO.new(url) reader = Reader.new(remote_io) yield reader end diff --git a/app/models/zip_file/remote_io.rb b/app/models/zip_file/remote_io.rb new file mode 100644 index 000000000..1cb00831a --- /dev/null +++ b/app/models/zip_file/remote_io.rb @@ -0,0 +1,44 @@ +class ZipFile::RemoteIO < ZipKit::RemoteIO + protected + def request_range(range) + with_http do |http| + request = Net::HTTP::Get.new(@uri) + request.range = range + response = http.request(request) + + case response.code + when "206", "200" + response.body + else + raise "Remote at #{@uri} replied with code #{response.code}" + end + end + end + + def request_object_size + with_http do |http| + request = Net::HTTP::Get.new(@uri) + request.range = 0..0 + response = http.request(request) + + case response.code + when "206" + content_range_header_value = response["Content-Range"] + content_range_header_value.split("/").last.to_i + when "200" + response["Content-Length"].to_i + else + raise "Remote at #{@uri} replied with code #{response.code}" + end + end + end + + private + def with_http + http = Net::HTTP.new(@uri.hostname, @uri.port) + http.use_ssl = @uri.scheme == "https" + # FIXME: Disable SSL verification for now to avoid issues with our self-signed certificates for PureStorage + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + http.start { yield http } + end +end