# frozen_string_literal: true module Paperclip class ResponseWithLimitAdapter < AbstractAdapter def self.register Paperclip.io_adapters.register self do |target| target.is_a?(ResponseWithLimit) end end def initialize(target, options = {}) super cache_current_values end private def cache_current_values @original_filename = filename_from_content_disposition.presence || filename_from_path.presence || 'data' @tempfile = copy_to_tempfile(@target) @content_type = ContentTypeDetector.new(@tempfile.path).detect @size = File.size(@tempfile) end def copy_to_tempfile(source) bytes_read = 0 source.response.body.each do |chunk| bytes_read += chunk.bytesize destination.write(chunk) chunk.clear raise Mastodon::LengthValidationError if bytes_read > source.limit end destination.rewind destination rescue Mastodon::LengthValidationError destination.close(true) raise ensure source.response.connection.close end def filename_from_content_disposition disposition = @target.response.headers['content-disposition'] disposition&.match(/filename="([^"]*)"/)&.captures&.first end def filename_from_path @target.response.uri.path.split('/').last end end end