123456789_123456789_123456789_123456789_123456789_

Module: ActionDispatch::Http::MimeNegotiation

Relationships & Source Files
Namespace Children
Exceptions:
Extension / Inclusion / Inheritance Descendants
Included In:
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Defined in: actionpack/lib/action_dispatch/http/mime_negotiation.rb

Constant Summary

Class Method Summary

::ActiveSupport::Concern - Extended

class_methods

Define class methods from given block.

included

Evaluate given block in context of base class, so that you can write class macros here.

prepended

Evaluate given block in context of base class, so that you can write class macros here.

Instance Attribute Summary

Instance Method Summary

DSL Calls

included

[ GitHub ]


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 17

included do
  mattr_accessor :ignore_accept_header, default: false

  def return_only_media_type_on_content_type=(value)
    ActionDispatch.deprecator.warn(
      "`config.action_dispatch.return_only_request_media_type_on_content_type` is deprecated and will" \
        " be removed in Rails 7.2."
    )
  end

  def return_only_media_type_on_content_type
    ActionDispatch.deprecator.warn(
      "`config.action_dispatch.return_only_request_media_type_on_content_type` is deprecated and will" \
      " be removed in Rails 7.2."
    )
  end
end

Instance Attribute Details

#formats (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 79

def formats
  fetch_header("action_dispatch.request.formats") do |k|
    v = if params_readable?
      Array(Mime[parameters[:format]])
    elsif use_accept_header && valid_accept_header
      accepts.dup
    elsif extension_format = format_from_path_extension
      [extension_format]
    elsif xhr?
      [Mime[:js]]
    else
      [Mime[:html]]
    end

    v.select! do |format|
      format.symbol || format.ref == "*/*"
    end

    set_header k, v
  end
end

#formats=(extensions) (rw)

Sets the formats by string extensions. This differs from #format= by allowing you to set multiple, ordered formats, which is useful when you want to have a fallback.

In this example, the :iphone format will be used if it’s available, otherwise it’ll fall back to the :html format.

class ApplicationController < ActionController::Base
  before_action :adjust_format_for_iphone_with_html_fallback

  private
    def adjust_format_for_iphone_with_html_fallback
      request.formats = [ :iphone, :html ] if request.env["HTTP_USER_AGENT"][/iPhone/]
    end
end
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 146

def formats=(extensions)
  parameters[:format] = extensions.first.to_s
  set_header "action_dispatch.request.formats", extensions.collect { |extension|
    Mime::Type.lookup_by_extension(extension)
  }
end

#should_apply_vary_header?Boolean (readonly)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 166

def should_apply_vary_header?
  !params_readable? && use_accept_header && valid_accept_header
end

#variant (rw)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 112

def variant
  @variant ||= ActiveSupport::ArrayInquirer.new
end

#variant=(variant) (rw)

Sets the variant for template.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 102

def variant=(variant)
  variant = Array(variant)

  if variant.all?(Symbol)
    @variant = ActiveSupport::ArrayInquirer.new(variant)
  else
    raise ArgumentError, "request.variant must be set to a Symbol or an Array of Symbols."
  end
end

Instance Method Details

#accepts

Returns the accepted MIME type for the request.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 54

def accepts
  fetch_header("action_dispatch.request.accepts") do |k|
    header = get_header("HTTP_ACCEPT").to_s.strip

    v = if header.empty?
      [content_mime_type]
    else
      Mime::Type.parse(header)
    end
    set_header k, v
  rescue ::Mime::Type::InvalidMimeType => e
    raise InvalidType, e.message
  end
end

#content_mime_type

The MIME type of the HTTP request, such as Mime.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 36

def content_mime_type
  fetch_header("action_dispatch.request.content_type") do |k|
    v = if get_header("CONTENT_TYPE") =~ /^([^,;]*)/
      Mime::Type.lookup($1.strip.downcase)
    else
      nil
    end
    set_header k, v
  rescue ::Mime::Type::InvalidMimeType => e
    raise InvalidType, e.message
  end
end

#format(_view_path = nil)

Returns the MIME type for the format used in the request.

GET /posts/5.xml   | request.format => Mime[:xml]
GET /posts/5.xhtml | request.format => Mime[:html]
GET /posts/5       | request.format => Mime[:html] or Mime[:js], or request.accepts.first
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 75

def format(_view_path = nil)
  formats.first || Mime::NullType.instance
end

#format=(extension)

Sets the format by string extension, which can be used to force custom formats that are not controlled by the extension.

class ApplicationController < ActionController::Base
  before_action :adjust_format_for_iphone

  private
    def adjust_format_for_iphone
      request.format = :iphone if request.env["HTTP_USER_AGENT"][/iPhone/]
    end
end
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 127

def format=(extension)
  parameters[:format] = extension.to_s
  set_header "action_dispatch.request.formats", [Mime::Type.lookup_by_extension(parameters[:format])]
end

#negotiate_mime(order)

Returns the first MIME type that matches the provided array of MIME types.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/http/mime_negotiation.rb', line 154

def negotiate_mime(order)
  formats.each do |priority|
    if priority == Mime::ALL
      return order.first
    elsif order.include?(priority)
      return priority
    end
  end

  order.include?(Mime::ALL) ? format : nil
end