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

Response is mostly a Ruby on Rails framework implementation detail, and should never be used directly in controllers. Controllers should use the methods defined in ActionController::Base instead. For example, if you want to set the HTTP response's content MIME type, then use ActionControllerBase#headers instead of Response#headers.

Nevertheless, integration tests may want to inspect controller responses in more detail, and that's when Response can be useful for application developers. Integration test methods such as ActionDispatch::Integration::Session#get and ActionDispatch::Integration::Session#post return objects of type TestResponse (which are of course also of type Response).

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".freeze
ContentTypeHeader = Struct.new :mime_type, :charset
LOCATION = "Location".freeze
NO_CONTENT_CODES = [100, 101, 102, 204, 205, 304]
NullContentTypeHeader = ContentTypeHeader.new nil, nil
SET_COOKIE = "Set-Cookie".freeze

Attributes

[R] header

Get headers for this response.

[R] headers

Get headers for this response.

[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, header = {}, body = [], default_headers: self.default_headers)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 151
    def self.create(status = 200, header = {}, body = [], default_headers: self.default_headers)
      header = merge_default_headers(header, default_headers)
      new status, header, body
    end
🔎 See on GitHub

merge_default_headers(original, default)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 156
    def self.merge_default_headers(original, default)
      default.respond_to?(:merge) ? default.merge(original) : original
    end
🔎 See on GitHub

new(status = 200, header = {}, body = [])

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 163
    def initialize(status = 200, header = {}, body = [])
      super()

      @header = Header.new(self, header)

      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 368
    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 185
    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 191
    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 302
    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 311
    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 355
    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 272
    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 261
    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 364
    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 283
    def code
      @status.to_s
    end
🔎 See on GitHub

commit!()

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 195
    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 219
    def committed?; synchronize { @committed }; end
🔎 See on GitHub

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 246
    def content_type
      parsed_content_type_header.mime_type
    end
🔎 See on GitHub

content_type=(content_type)

Sets the HTTP content type.

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 228
    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 392
    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 183
    def delete_header(key); headers.delete key; end
🔎 See on GitHub

each(&block)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 74
    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 181
    def get_header(key);    headers[key];       end
🔎 See on GitHub

has_header?(key)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 180
    def has_header?(key);   headers.key? key;   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 295
    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 351
    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 278
    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 346
    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 203
    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 218
    def sending?;   synchronize { @sending };   end
🔎 See on GitHub

sending_file=(v)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 250
    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 211
    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 220
    def sent?;      synchronize { @sent };      end
🔎 See on GitHub

set_header(key, v)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 182
    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 223
    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 383
    def to_a
      commit!
      rack_response @status, @header.to_hash
    end
🔎 See on GitHub

write(string)

📝 Source code
# File actionpack/lib/action_dispatch/http/response.rb, line 306
    def write(string)
      @stream.write string
    end
🔎 See on GitHub