12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- # 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
|