Class: Mime::Type

Inherits:
Object
  • Object
show all
Defined in:
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

Direct Known Subclasses

AllType

Defined Under Namespace

Classes: AcceptItem, AcceptList

Constant Summary collapse

TRAILING_STAR_REGEXP =
/^(text|application)\/\*/
PARAMETER_SEPARATOR_REGEXP =
/;\s*\w+="?\w+"?/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(string, symbol = nil, synonyms = []) ⇒ Type

Returns a new instance of Type.



251
252
253
254
255
# File 'lib/action_dispatch/http/mime_type.rb', line 251

def initialize(string, symbol = nil, synonyms = [])
  @symbol, @synonyms = symbol, synonyms
  @string = string
  @hash = [@string, @synonyms, @symbol].hash
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object (private)



316
317
318
319
320
321
322
# File 'lib/action_dispatch/http/mime_type.rb', line 316

def method_missing(method, *args)
  if method.to_s.ends_with? '?'
    method[0..-2].downcase.to_sym == to_sym
  else
    super
  end
end

Instance Attribute Details

#hashObject (readonly)

Returns the value of attribute hash.



249
250
251
# File 'lib/action_dispatch/http/mime_type.rb', line 249

def hash
  @hash
end

#symbolObject (readonly)

Returns the value of attribute symbol.



90
91
92
# File 'lib/action_dispatch/http/mime_type.rb', line 90

def symbol
  @symbol
end

Class Method Details

.lookup(string) ⇒ Object



169
170
171
# File 'lib/action_dispatch/http/mime_type.rb', line 169

def lookup(string)
  LOOKUP[string] || Type.new(string)
end

.lookup_by_extension(extension) ⇒ Object



173
174
175
# File 'lib/action_dispatch/http/mime_type.rb', line 173

def lookup_by_extension(extension)
  EXTENSION_LOOKUP[extension.to_s]
end

.parse(accept_header) ⇒ Object



197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/action_dispatch/http/mime_type.rb', line 197

def parse(accept_header)
  if !accept_header.include?(',')
    accept_header = accept_header.split(PARAMETER_SEPARATOR_REGEXP).first
    parse_trailing_star(accept_header) || [Mime::Type.lookup(accept_header)].compact
  else
    list, index = [], 0
    accept_header.split(',').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) ⇒ Object

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].



230
231
232
# File 'lib/action_dispatch/http/mime_type.rb', line 230

def parse_data_with_trailing_star(type)
  Mime::SET.select { |m| m =~ type }
end

.parse_trailing_star(accept_header) ⇒ Object



221
222
223
# File 'lib/action_dispatch/http/mime_type.rb', line 221

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) ⇒ Object



183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/action_dispatch/http/mime_type.rb', line 183

def register(string, symbol, mime_type_synonyms = [], extension_synonyms = [], skip_lookup = false)
  new_mime = Type.new(string, symbol, mime_type_synonyms)

  SET << new_mime

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

  @register_callbacks.each do |callback|
    callback.call(new_mime)
  end
  new_mime
end

.register_alias(string, symbol, extension_synonyms = []) ⇒ Object

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.



179
180
181
# File 'lib/action_dispatch/http/mime_type.rb', line 179

def register_alias(string, symbol, extension_synonyms = [])
  register(string, symbol, [], extension_synonyms, true)
end

.register_callback(&block) ⇒ Object



165
166
167
# File 'lib/action_dispatch/http/mime_type.rb', line 165

def register_callback(&block)
  @register_callbacks << block
end

.unregister(symbol) ⇒ Object

This method is opposite of register method.

To unregister a MIME type:

Mime::Type.unregister(:mobile)


239
240
241
242
243
244
245
246
# File 'lib/action_dispatch/http/mime_type.rb', line 239

def unregister(symbol)
  symbol = symbol.downcase
  if mime = Mime[symbol]
    SET.delete_if { |v| v.eql?(mime) }
    LOOKUP.delete_if { |_, v| v.eql?(mime) }
    EXTENSION_LOOKUP.delete_if { |_, v| v.eql?(mime) }
  end
end

Instance Method Details

#==(mime_type) ⇒ Object



281
282
283
284
285
286
# File 'lib/action_dispatch/http/mime_type.rb', line 281

def ==(mime_type)
  return false unless mime_type
  (@synonyms + [ self ]).any? do |synonym|
    synonym.to_s == mime_type.to_s || synonym.to_sym == mime_type.to_sym
  end
end

#===(list) ⇒ Object



273
274
275
276
277
278
279
# File 'lib/action_dispatch/http/mime_type.rb', line 273

def ===(list)
  if list.is_a?(Array)
    (@synonyms + [ self ]).any? { |synonym| list.include?(synonym) }
  else
    super
  end
end

#=~(mime_type) ⇒ Object



295
296
297
298
299
# File 'lib/action_dispatch/http/mime_type.rb', line 295

def =~(mime_type)
  return false unless mime_type
  regexp = Regexp.new(Regexp.quote(mime_type.to_s))
  @synonyms.any? { |synonym| synonym.to_s =~ regexp } || @string =~ regexp
end

#all?Boolean

Returns:

  • (Boolean)


305
# File 'lib/action_dispatch/http/mime_type.rb', line 305

def all?; false; end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


288
289
290
291
292
293
# File 'lib/action_dispatch/http/mime_type.rb', line 288

def eql?(other)
  super || (self.class == other.class &&
            @string    == other.string &&
            @synonyms  == other.synonyms &&
            @symbol    == other.symbol)
end

#html?Boolean

Returns:

  • (Boolean)


301
302
303
# File 'lib/action_dispatch/http/mime_type.rb', line 301

def html?
  symbol == :html || @string =~ /html/
end

#refObject



269
270
271
# File 'lib/action_dispatch/http/mime_type.rb', line 269

def ref
  symbol || to_s
end

#to_sObject



257
258
259
# File 'lib/action_dispatch/http/mime_type.rb', line 257

def to_s
  @string
end

#to_strObject



261
262
263
# File 'lib/action_dispatch/http/mime_type.rb', line 261

def to_str
  to_s
end

#to_symObject



265
266
267
# File 'lib/action_dispatch/http/mime_type.rb', line 265

def to_sym
  @symbol
end