# class Mime::Type

Encapsulates the notion of a mime type. Can be used at render time, for example, with:

    class PostsController < ActionController::Base
      def show
        @post = Post.find(params[:id])

        respond_to do |format|
          format.html
          format.ics { render :text => post.to_ics, :mime_type => Mime::Type["text/calendar"]  }
          format.xml { render :xml => @people.to_xml }
        end
      end
    end

### Constants

Q_SEPARATOR_REGEXP
TRAILING_STAR_REGEXP

### Attributes

symbol[R]

### Public Class Methods

new(string, symbol = nil, synonyms = []) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 207
    def initialize(string, symbol = nil, synonyms = [])
      @symbol, @synonyms = symbol, synonyms
      @string = string
    end

### Public Instance Methods

==(mime_type) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 236
    def ==(mime_type)
      return false if mime_type.blank?
      (@synonyms + [ self ]).any? do |synonym|
        synonym.to_s == mime_type.to_s || synonym.to_sym == mime_type.to_sym
      end
    end

===(list) click to toggle source
Calls superclass method

    # File lib/action_dispatch/http/mime_type.rb, line 228
    def ===(list)
      if list.is_a?(Array)
        (@synonyms + [ self ]).any? { |synonym| list.include?(synonym) }
      else
        super
      end
    end

=~(mime_type) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 243
    def =~(mime_type)
      return false if mime_type.blank?
      regexp = Regexp.new(Regexp.quote(mime_type.to_s))
      (@synonyms + [ self ]).any? do |synonym|
        synonym.to_s =~ regexp
      end
    end

html?() click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 257
    def html?
      @@html_types.include?(to_sym) || @string =~ /html/
    end

lookup(string) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 87
    def lookup(string)
      LOOKUP[string]
    end

lookup_by_extension(extension) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 91
    def lookup_by_extension(extension)
      EXTENSION_LOOKUP[extension.to_s]
    end

parse(accept_header) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 110
    def parse(accept_header)
      if accept_header !~ /,/
        accept_header = accept_header.split(Q_SEPARATOR_REGEXP).first
        if accept_header =~ TRAILING_STAR_REGEXP
          parse_data_with_trailing_star($1)
        else
          [Mime::Type.lookup(accept_header)]
        end
      else
        # keep track of creation order to keep the subsequent sort stable
        list, index = [], 0
        accept_header.split(/,/).each do |header|
          params, q = header.split(Q_SEPARATOR_REGEXP)
          if params.present?
            params.strip!

            if params =~ TRAILING_STAR_REGEXP
              parse_data_with_trailing_star($1).each do |m|
                list << AcceptItem.new(index, m.to_s, q)
                index += 1
              end
            else
              list << AcceptItem.new(index, params, q)
              index += 1
            end
          end
        end
        list.sort!

        # Take care of the broken text/xml entry by renaming or deleting it
        text_xml = list.index("text/xml")
        app_xml = list.index(Mime::XML.to_s)

        if text_xml && app_xml
          # set the q value to the max of the two
          list[app_xml].q = [list[text_xml].q, list[app_xml].q].max

          # make sure app_xml is ahead of text_xml in the list
          if app_xml > text_xml
            list[app_xml], list[text_xml] = list[text_xml], list[app_xml]
            app_xml, text_xml = text_xml, app_xml
          end

          # delete text_xml from the list
          list.delete_at(text_xml)

        elsif text_xml
          list[text_xml].name = Mime::XML.to_s
        end

        # Look for more specific XML-based types and sort them ahead of app/xml

        if app_xml
          idx = app_xml
          app_xml_type = list[app_xml]

          while(idx < list.length)
            type = list[idx]
            break if type.q < app_xml_type.q
            if type.name =~ /\+xml$/
              list[app_xml], list[idx] = list[idx], list[app_xml]
              app_xml = idx
            end
            idx += 1
          end
        end

        list.map! { |i| Mime::Type.lookup(i.name) }.uniq!
        list
      end
    end

parse_data_with_trailing_star(input) click to toggle source

input: ‘text’ returned value: [Mime::JSON, Mime::XML, Mime::ICS, Mime::HTML, Mime::CSS, Mime::CSV, Mime::JS, Mime::YAML, Mime::TEXT]

input: ‘application’ returned value: [Mime::HTML, Mime::JS, Mime::XML, Mime::YAML, Mime::ATOM, Mime::JSON, Mime::RSS, Mime::URL_ENCODED_FORM]

    # File lib/action_dispatch/http/mime_type.rb, line 187
    def parse_data_with_trailing_star(input)
      Mime::SET.select { |m| m =~ input }
    end

ref() click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 224
    def ref
      to_sym || to_s
    end

register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false) click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 101
    def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
      Mime.const_set(symbol.to_s.upcase, Type.new(string, symbol, mime_type_synonyms))

      SET << Mime.const_get(symbol.to_s.upcase)

      ([string] + mime_type_synonyms).each { |str| LOOKUP[str] = SET.last } unless skip_lookup
      ([symbol] + extension_synonyms).each { |ext| EXTENSION_LOOKUP[ext.to_s] = SET.last }
    end

register_alias(string, symbol, extension_synonyms = []) click to toggle source

Registers an alias that’s not used on mime type lookup, but can be referenced directly. Especially useful for rendering different HTML versions depending on the user agent, like an iPhone.

    # File lib/action_dispatch/http/mime_type.rb, line 97
    def register_alias(string, symbol, extension_synonyms = [])
      register(string, symbol, [], extension_synonyms, true)
    end

to_s() click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 212
    def to_s
      @string
    end

to_str() click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 216
    def to_str
      to_s
    end

to_sym() click to toggle source

    # File lib/action_dispatch/http/mime_type.rb, line 220
    def to_sym
      @symbol
    end

unregister(symbol) click to toggle source

This method is opposite of register method.

Usage:

#unregister(:mobile)

    # File lib/action_dispatch/http/mime_type.rb, line 196
    def unregister(symbol)
      symbol = symbol.to_s.upcase
      mime = Mime.const_get(symbol)
      Mime.instance_eval { remove_const(symbol) }

      SET.delete_if { |v| v.eql?(mime) }
      LOOKUP.delete_if { |k,v| v.eql?(mime) }
      EXTENSION_LOOKUP.delete_if { |k,v| v.eql?(mime) }
    end

verify_request?() click to toggle source

Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See ActionController::RequestForgeryProtection.

    # File lib/action_dispatch/http/mime_type.rb, line 253
    def verify_request?
      @@browser_generated_types.include?(to_sym)
    end