aboutsummaryrefslogblamecommitdiffstats
path: root/activestorage/app/models/active_storage/identification.rb
blob: bf1d8f562417f9d29ec09d3f93674e6b439d8584 (plain) (tree)
1
2
3
4

                             

                  



































                                                                                                    
# frozen_string_literal: true

require "net/http"

class ActiveStorage::Identification
  attr_reader :blob

  def initialize(blob)
    @blob = blob
  end

  def apply
    blob.update!(content_type: content_type, identified: true) unless blob.identified?
  end

  private
    def content_type
      Marcel::MimeType.for(identifiable_chunk, name: filename, declared_type: declared_content_type)
    end


    def identifiable_chunk
      Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") do |client|
        client.get(uri, "Range" => "0-4096").body
      end
    end

    def uri
      @uri ||= URI.parse(blob.service_url)
    end


    def filename
      blob.filename.to_s
    end

    def declared_content_type
      blob.content_type
    end
end