Action Dispatch Response

Represents an HTTP response generated by a controller action. Use it to retrieve the current state of the response, or customize the response. It can either represent a real HTTP response (i.e. one that is meant to be sent back to the web browser) or a TestResponse (i.e. one that is generated from integration tests).

The Response object for the current request is exposed on controllers as ActionController::Metal#response. ActionController::Metal also provides a few additional methods that delegate to attributes of the Response such as ActionController::Metal#headers.

Integration tests will likely also want to inspect responses in more detail. Methods such as Integration::RequestHelpers#get and Integration::RequestHelpers#post return instances of TestResponse (which inherits from Response) for this purpose.

For example, the following demo integration test prints the body of the controller response to the console:

class DemoControllerTest < ActionDispatch::IntegrationTest
  def test_print_root_path_to_console
    get('/')
    puts response.body
  end
end

Namespace

Class

Methods

Included Modules

Constants

CONTENT_TYPE = "Content-Type"
ContentTypeHeader = Struct.new :mime_type, :charset
Header = Headers
 

To be deprecated:

Headers = ::Rack::Headers
NO_CONTENT_CODES = [100, 101, 102, 103, 204, 205, 304]
NullContentTypeHeader = ContentTypeHeader.new nil, nil
SET_COOKIE = "Set-Cookie"

Attributes

[R] header

The headers for the response.

header["Content-Type"] # => "text/plain"
header["Content-Type"] = "application/json"
header["Content-Type"] # => "application/json"

Also aliased as headers.

headers["Content-Type"] # => "text/plain"
headers["Content-Type"] = "application/json"
headers["Content-Type"] # => "application/json"

Also aliased as header for compatibility.

[R] headers

The headers for the response.

header["Content-Type"] # => "text/plain"
header["Content-Type"] = "application/json"
header["Content-Type"] # => "application/json"

Also aliased as headers.

headers["Content-Type"] # => "text/plain"
headers["Content-Type"] = "application/json"
headers["Content-Type"] # => "application/json"

Also aliased as header for compatibility.

[RW] request

The request that the response is responding to.

[R] status

The HTTP status code.

[R] stream

The underlying body, as a streamable object.

Class Public methods

create(status = 200, headers = {}, body = [], default_headers: self.default_headers)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 157
    def self.create(status = 200, headers = {}, body = [], default_headers: self.default_headers)
      headers = merge_default_headers(headers, default_headers)
      new status, headers, body
    end
πŸ”Ž See on GitHub

merge_default_headers(original, default)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 162
    def self.merge_default_headers(original, default)
      default.respond_to?(:merge) ? default.merge(original) : original
    end
πŸ”Ž See on GitHub

new(status = 200, headers = nil, body = [])

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 169
    def initialize(status = 200, headers = nil, body = [])
      super()

      @headers = Headers.new

      headers&.each do |key, value|
        @headers[key] = value
      end

      self.body, self.status = body, status

      @cv           = new_cond
      @committed    = false
      @sending      = false
      @sent         = false

      prepare_cache_control!

      yield self if block_given?
    end
πŸ”Ž See on GitHub

Instance Public methods

abort()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 382
    def abort
      if stream.respond_to?(:abort)
        stream.abort
      elsif stream.respond_to?(:close)
        # `stream.close` should really be reserved for a close from the
        # other direction, but we must fall back to it for
        # compatibility.
        stream.close
      end
    end
πŸ”Ž See on GitHub

await_commit()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 195
    def await_commit
      synchronize do
        @cv.wait_until { @committed }
      end
    end
πŸ”Ž See on GitHub

await_sent()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 201
    def await_sent
      synchronize { @cv.wait_until { @sent } }
    end
πŸ”Ž See on GitHub

body()

Returns the content of the response as a string. This contains the contents of any calls to render.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 316
    def body
      @stream.body
    end
πŸ”Ž See on GitHub

body=(body)

Allows you to manually set or override the response body.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 325
    def body=(body)
      if body.respond_to?(:to_path)
        @stream = body
      else
        synchronize do
          @stream = build_buffer self, munge_body_object(body)
        end
      end
    end
πŸ”Ž See on GitHub

body_parts()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 369
    def body_parts
      parts = []
      @stream.each { |x| parts << x }
      parts
    end
πŸ”Ž See on GitHub

charset()

The charset of the response. HTML wants to know the encoding of the content you’re giving them, so we need to send that along.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 286
    def charset
      header_info = parsed_content_type_header
      header_info.charset || self.class.default_charset
    end
πŸ”Ž See on GitHub

charset=(charset)

Sets the HTTP character set. In case of nil parameter it sets the charset to default_charset.

response.charset = 'utf-16' # => 'utf-16'
response.charset = nil      # => 'utf-8'
πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 275
    def charset=(charset)
      content_type = parsed_content_type_header.mime_type
      if false == charset
        set_content_type content_type, nil
      else
        set_content_type content_type, charset || self.class.default_charset
      end
    end
πŸ”Ž See on GitHub

close()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 378
    def close
      stream.close if stream.respond_to?(:close)
    end
πŸ”Ž See on GitHub

code()

Returns a string to ensure compatibility with Net::HTTPResponse.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 297
    def code
      @status.to_s
    end
πŸ”Ž See on GitHub

commit!()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 205
    def commit!
      synchronize do
        before_committed
        @committed = true
        @cv.broadcast
      end
    end
πŸ”Ž See on GitHub

committed?()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 229
    def committed?; synchronize { @committed }; end
πŸ”Ž See on GitHub

content_type()

Content type of response.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 255
    def content_type
      super.presence
    end
πŸ”Ž See on GitHub

content_type=(content_type)

Sets the HTTP response’s content MIME type. For example, in the controller you could write this:

response.content_type = "text/plain"

If a character set has been defined for this response (see charset=) then the character set information will also be included in the content type information.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 245
    def content_type=(content_type)
      return unless content_type
      new_header_info = parse_content_type(content_type.to_s)
      prev_header_info = parsed_content_type_header
      charset = new_header_info.charset || prev_header_info.charset
      charset ||= self.class.default_charset unless prev_header_info.mime_type
      set_content_type new_header_info.mime_type, charset
    end
πŸ”Ž See on GitHub

cookies()

Returns the response cookies, converted to a Hash of (name => value) pairs

assert_equal 'AuthorOfNewPage', r.cookies['author']
πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 406
    def cookies
      cookies = {}
      if header = get_header(SET_COOKIE)
        header = header.split("\n") if header.respond_to?(:to_str)
        header.each do |cookie|
          if pair = cookie.split(";").first
            key, value = pair.split("=").map { |v| Rack::Utils.unescape(v) }
            cookies[key] = value
          end
        end
      end
      cookies
    end
πŸ”Ž See on GitHub

delete_header(key)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 193
    def delete_header(key); @headers.delete key; end
πŸ”Ž See on GitHub

each(&block)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 75
    def each(&block)
      sending!
      x = @stream.each(&block)
      sent!
      x
    end
πŸ”Ž See on GitHub

get_header(key)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 191
    def get_header(key);    @headers[key];       end
πŸ”Ž See on GitHub

has_header?(key)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 190
    def has_header?(key);   @headers.key? key;   end
πŸ”Ž See on GitHub

media_type()

Media type of response.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 260
    def media_type
      parsed_content_type_header.mime_type
    end
πŸ”Ž See on GitHub

message()

Returns the corresponding message for the current HTTP status code:

response.status = 200
response.message # => "OK"

response.status = 404
response.message # => "Not Found"
Also aliased as: status_message
πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 309
    def message
      Rack::Utils::HTTP_STATUS_CODES[@status]
    end
πŸ”Ž See on GitHub

prepare!()

Alias for: to_a

reset_body!()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 365
    def reset_body!
      @stream = build_buffer(self, [])
    end
πŸ”Ž See on GitHub

response_code()

The response code of the request.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 292
    def response_code
      @status
    end
πŸ”Ž See on GitHub

send_file(path)

Send the file stored at path as the response body.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 360
    def send_file(path)
      commit!
      @stream = FileBody.new(path)
    end
πŸ”Ž See on GitHub

sending!()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 213
    def sending!
      synchronize do
        before_sending
        @sending = true
        @cv.broadcast
      end
    end
πŸ”Ž See on GitHub

sending?()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 228
    def sending?;   synchronize { @sending };   end
πŸ”Ž See on GitHub

sending_file=(v)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 264
    def sending_file=(v)
      if true == v
        self.charset = false
      end
    end
πŸ”Ž See on GitHub

sent!()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 221
    def sent!
      synchronize do
        @sent = true
        @cv.broadcast
      end
    end
πŸ”Ž See on GitHub

sent?()

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 230
    def sent?;      synchronize { @sent };      end
πŸ”Ž See on GitHub

set_header(key, v)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 192
    def set_header(key, v); @headers[key] = v;   end
πŸ”Ž See on GitHub

status=(status)

Sets the HTTP status code.

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 233
    def status=(status)
      @status = Rack::Utils.status_code(status)
    end
πŸ”Ž See on GitHub

status_message()

Alias for: message

to_a()

Turns the Response into a Rack-compatible array of the status, headers, and body. Allows explicit splatting:

status, headers, body = *response
Also aliased as: prepare!
πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 397
    def to_a
      commit!
      rack_response @status, @headers.to_hash
    end
πŸ”Ž See on GitHub

write(string)

πŸ“ Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 320
    def write(string)
      @stream.write string
    end
πŸ”Ž See on GitHub