Class: Mime::Type
| Relationships & Source Files | |
| Namespace Children | |
|
Classes:
| |
|
Exceptions:
| |
| Extension / Inclusion / Inheritance Descendants | |
|
Subclasses:
|
|
| Inherits: | Object |
| Defined in: | actionpack/lib/action_dispatch/http/mime_type.rb |
Overview
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 body: @post.to_ics, mime_type: Mime::Type.lookup("text/calendar") }
format.xml { render xml: @post }
end
end
end
Constant Summary
-
ACCEPT_HEADER_REGEXP =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 226/[^,\s"](?:[^,"]|"[^"]*")*/ -
MIME_NAME =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 336"[a-zA-Z0-9][a-zA-Z0-9#{Regexp.escape('!#$&-^_.+')}]{0,126}".freeze
-
MIME_PARAMETER =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 338"\s*;\s*#{MIME_NAME}(?:=#{MIME_PARAMETER_VALUE})?".freeze
-
MIME_PARAMETER_VALUE =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 337"(?:#{MIME_NAME}|\"[^\"\r\\\\]*\")".freeze
-
MIME_REGEXP =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 339/\A(?:\*\/\*|#{MIME_NAME}\/(?:\*|#{MIME_NAME})(?>#{MIME_PARAMETER})*\s*)\z/ -
PARAMETER_SEPARATOR_REGEXP =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 225
all media-type parameters need to be before the q-parameter https://www.rfc-editor.org/rfc/rfc7231#section-5.3.2
/;\s*q="?/ -
TRAILING_STAR_REGEXP =
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 222/^(text|application)\/\*/ -
WILDCARD =
private
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 361
Returned when looking up
*/*, the Accept header of most non-browser clients, instead of building an equal instance on each request. Unlike ALL, it's a plain unregistered type.new("*/*")
Class Method Summary
- .lookup(string)
- .lookup_by_extension(extension)
- .new(string, symbol = nil, synonyms = nil) ⇒ Type constructor
- .parse(accept_header)
-
.parse_data_with_trailing_star(type)
For an input of
'text', returns[Mime[:json], Mime[:xml], Mime[:ics], Mime[:html], Mime[:css], Mime[:csv], Mime[:js], Mime[:yaml], Mime[:text]]. - .parse_trailing_star(accept_header)
- .register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
-
.register_alias(string, symbol, extension_synonyms = [])
Registers an alias that's not used on MIME type lookup, but can be referenced directly.
- .register_callback(&block)
-
.unregister(symbol)
This method is opposite of register method.
- .on_change(&block) Internal use only
Instance Attribute Summary
- #all? ⇒ Boolean readonly
- #hash readonly
- #html? ⇒ Boolean readonly
- #symbol readonly
- #string readonly protected
- #synonyms readonly protected
Instance Method Summary
Constructor Details
.new(string, symbol = nil, synonyms = nil) ⇒ Type
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 343
def initialize(string, symbol = nil, synonyms = nil) unless MIME_REGEXP.match?(string) raise InvalidMimeType, "#{string.inspect} is not a valid MIME type" end @symbol = symbol @synonyms = if synonyms&.any? synonyms.map { |synonym| synonym.dup.freeze }.freeze else [].freeze end @string = string.dup.freeze @hash = [@string, @synonyms, @symbol].hash freeze end
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method) (private)
[ GitHub ]Class Method Details
.lookup(string)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 237
def lookup(string) lookup = Mime.lookup_by_string return lookup[string] if lookup.key?(string) return WILDCARD if string == "*/*" # fallback to the media-type without parameters if it was not found string = string.split(";", 2)[0]&.rstrip lookup[string] || Type.new(string) end
.lookup_by_extension(extension)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 247
def lookup_by_extension(extension) Mime.lookup_by_extension[extension.to_s] end
.on_change(&block)
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 228
def on_change(&block) # :nodoc: @on_change_callbacks << block end
.parse(accept_header)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 273
def parse(accept_header) if !accept_header.include?(",") if (index = accept_header.index(PARAMETER_SEPARATOR_REGEXP)) accept_header = accept_header[0, index].strip end return [] if accept_header.blank? parse_trailing_star(accept_header) || Array(Mime::Type.lookup(accept_header)) else list, index = [], 0 accept_header.scan(ACCEPT_HEADER_REGEXP).each do |header| params, q = header.split(PARAMETER_SEPARATOR_REGEXP) next unless params params.strip! next if params.empty? params = parse_trailing_star(params) || [params] params.each do |m| list << AcceptItem.new(index, m.to_s, q) index += 1 end end AcceptList.sort! list end end
.parse_data_with_trailing_star(type)
For an input of 'text', returns [Mime[:json], Mime[:xml], Mime[:ics], Mime[:html], Mime[:css], Mime[:csv], Mime[:js], Mime[:yaml], Mime[:text]].
For an input of 'application', returns [Mime[:html], Mime[:js], Mime[:xml], Mime[:yaml], Mime[:atom], Mime[:json], Mime[:rss], Mime[:url_encoded_form]].
.parse_trailing_star(accept_header)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 300
def parse_trailing_star(accept_header) parse_data_with_trailing_star($1) if accept_header =~ TRAILING_STAR_REGEXP end
.register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 258
def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false) new_mime = Type.new(string, symbol, mime_type_synonyms) Mime.update do |registry, string_lookup, extension_lookup| registry << new_mime ([string] + mime_type_synonyms).each { |str| string_lookup[-str] = new_mime } unless skip_lookup ([symbol] + extension_synonyms).each { |ext| extension_lookup[-ext.to_s] = new_mime } end @on_change_callbacks.each do |callback| callback.call(new_mime, true) end new_mime end
.register_alias(string, symbol, extension_synonyms = [])
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.
.register_callback(&block)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 232
def register_callback(&block) on_change { |mime, registered| block.call(mime) if registered } end
.unregister(symbol)
This method is opposite of register method.
To unregister a MIME type:
Mime::Type.unregister(:mobile)
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 318
def unregister(symbol) symbol = symbol.downcase if mime = Mime[symbol] Mime.update do |registry, string_lookup, extension_lookup| registry.delete_if { |v| v.eql?(mime) } string_lookup.delete_if { |_, v| v.eql?(mime) } extension_lookup.delete_if { |_, v| v.eql?(mime) } end @on_change_callbacks.each do |callback| callback.call(mime, false) end end end
Instance Attribute Details
#all? ⇒ Boolean (readonly)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 418
def all?; false; end
#hash (readonly)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 334
attr_reader :hash
#html? ⇒ Boolean (readonly)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 414
def html? (symbol == :html) || @string.include?("html") end
#string (readonly, protected)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 421
attr_reader :string, :synonyms
#symbol (readonly)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 150
attr_reader :symbol
#synonyms (readonly, protected)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 421
attr_reader :string, :synonyms
Instance Method Details
#==(mime_type)
[ GitHub ]#===(list)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 380
def ===(list) if list.is_a?(Array) (@synonyms + [ self ]).any? { |synonym| list.include?(synonym) } else super end end
#=~(mime_type)
[ GitHub ]
#eql?(other) ⇒ Boolean
#match?(mime_type) ⇒ Boolean
#ref
[ GitHub ]
#respond_to_missing?(method, include_private = false) ⇒ Boolean (private)
# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 435
def respond_to_missing?(method, include_private = false) method.end_with?("?") || super end
#to_a (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 425
def to_a; end
#to_ary (private)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 424
def to_ary; end
#to_s
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 364
def to_s @string end
#to_str
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 368
def to_str to_s end
#to_sym
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/mime_type.rb', line 372
def to_sym @symbol end