Class: ActionDispatch::Response
Relationships & Source Files | |
Namespace Children | |
Classes:
| |
Extension / Inclusion / Inheritance Descendants | |
Subclasses:
ActionController::LiveTestResponse, ActionController::TestResponse, TestResponse, ActionController::Live::Response
|
|
Super Chains via Extension / Inclusion / Inheritance | |
Instance Chain:
self,
MonitorMixin,
Http::Cache::Response,
Http::FilterRedirect,
Rack::Response::Helpers
|
|
Inherits: | Object |
Defined in: | actionpack/lib/action_dispatch/http/response.rb |
Overview
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 #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
Constant Summary
-
CONTENT_TYPE =
# File 'actionpack/lib/action_dispatch/http/response.rb', line 68"Content-Type".freeze
-
EMPTY =
# File 'actionpack/lib/action_dispatch/http/response.rb', line 224" "
-
LOCATION =
# File 'actionpack/lib/action_dispatch/http/response.rb', line 70"Location".freeze
-
NO_CONTENT_CODES =
# File 'actionpack/lib/action_dispatch/http/response.rb', line 71[204, 304]
-
SET_COOKIE =
# File 'actionpack/lib/action_dispatch/http/response.rb', line 69"Set-Cookie".freeze
Http::Cache::Response - Included
CACHE_CONTROL, DATE, DEFAULT_CACHE_CONTROL, ETAG, LAST_MODIFIED, MUST_REVALIDATE, NO_CACHE, PRIVATE, PUBLIC, SPECIAL_KEYS
Class Attribute Summary
- .default_charset (also: #default_charset) rw
- .default_headers (also: #default_headers) rw
Class Method Summary
Instance Attribute Summary
-
#body
rw
Returns the content of the response as a string.
-
#body=(body)
rw
Allows you to manually set or override the response body.
-
#charset
rw
The charset of the response.
- #committed? ⇒ Boolean readonly
-
#content_type
rw
Sets the HTTP response's content MIME type.
-
#content_type=(content_type)
rw
Sets the HTTP content type.
- #default_charset rw
- #default_headers rw
- #each readonly
-
#header
(also: #headers)
rw
Get and set headers for this response.
-
#headers
rw
Alias for #header.
-
#location
(also: #redirect_url)
rw
The location header we'll be responding with.
-
#location=(url)
rw
Sets the location header we'll be responding with.
-
#request
rw
The request that the response is responding to.
- #sending? ⇒ Boolean readonly
- #sending_file=(value) writeonly
- #sent? ⇒ Boolean readonly
-
#status
rw
The HTTP status code.
-
#status=(status)
rw
Sets the HTTP status code.
-
#stream
readonly
The underlying body, as a streamable object.
Http::Cache::Response - Included
Instance Method Summary
- #[]
- #[]=
- #abort
- #await_commit
- #await_sent
- #body_parts
- #close
-
#code
Returns a string to ensure compatibility with
Net::HTTPResponse
. - #commit!
-
#cookies
Returns the response cookies, converted to a ::Hash of (name => value) pairs.
- #delete_cookie(key, value = {})
-
#message
(also: #status_message)
Returns the corresponding message for the current HTTP status code:
-
#prepare!
Alias for #to_a.
- #rack_response(status, header)
-
#redirect_url
Alias for #location.
-
#response_code
The response code of the request.
- #sending!
- #sent!
- #set_cookie(key, value)
-
#status_message
Alias for #message.
-
#to_a
(also: #prepare!)
Turns the
Response
into a Rack-compatible array of the status, headers, and body. -
#to_ary
Be super clear that a response object is not an ::Array.
Http::Cache::Response - Included
Http::FilterRedirect - Included
Constructor Details
.new(status = 200, header = {}, body = [], options = {}) {|_self| ... } ⇒ Response
# File 'actionpack/lib/action_dispatch/http/response.rb', line 118
def initialize(status = 200, header = {}, body = [], = {}) super() default_headers = .fetch(:default_headers, self.class.default_headers) header = merge_default_headers(header, default_headers) self.body, self.header, self.status = body, header, status @sending_file = false @blank = false @cv = new_cond @committed = false @sending = false @sent = false @content_type = nil @charset = nil if content_type = self[CONTENT_TYPE] type, charset = content_type.split(/;\s*charset=/) @content_type = Mime::Type.lookup(type) @charset = charset || self.class.default_charset end prepare_cache_control! yield self if block_given? end
Class Attribute Details
.default_charset (rw) Also known as: #default_charset
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 73
cattr_accessor(:default_charset) { "utf-8" }
.default_headers (rw) Also known as: #default_headers
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 74
cattr_accessor(:default_headers)
Instance Attribute Details
#body (rw)
Returns the content of the response as a string. This contains the contents of any calls to render
.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 218
def body strings = [] each { |part| strings << part.to_s } strings.join end
#body=(body) (rw)
Allows you to manually set or override the response body.
#charset (rw)
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.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 66
attr_accessor :charset
#committed? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/http/response.rb', line 180
def committed?; synchronize { @committed }; end
#content_type (rw)
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.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 62
attr_reader :content_type
#content_type=(content_type) (rw)
Sets the HTTP content type.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 189
def content_type=(content_type) @content_type = content_type.to_s end
#default_charset (rw)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 73
cattr_accessor(:default_charset) { "utf-8" }
#default_headers (rw)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 74
cattr_accessor(:default_headers)
#each (readonly)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 52
delegate :each, :to => :@stream
#header (rw) Also known as: #headers
Get and set headers for this response.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 46
attr_accessor :header
#headers (rw)
Alias for #header.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 49
alias_method :headers, :header
#location (rw) Also known as: #redirect_url
The location header we'll be responding with.
#location=(url) (rw)
Sets the location header we'll be responding with.
#request (rw)
The request that the response is responding to.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 38
attr_accessor :request
#sending? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/http/response.rb', line 179
def sending?; synchronize { @sending }; end
#sending_file=(value) (writeonly)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 43
attr_writer :sending_file
#sent? ⇒ Boolean
(readonly)
[ GitHub ]
# File 'actionpack/lib/action_dispatch/http/response.rb', line 181
def sent?; synchronize { @sent }; end
#status (rw)
The HTTP status code.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 41
attr_reader :status
#status=(status) (rw)
Sets the HTTP status code.
#stream (readonly)
The underlying body, as a streamable object.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 116
attr_reader :stream
Instance Method Details
#[]
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 51
delegate :[], :[]=, :to => :@header
#[]=
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 51
delegate :[], :[]=, :to => :@header
#abort
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 268
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
#await_commit
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 146
def await_commit synchronize do @cv.wait_until { @committed } end end
#await_sent
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 152
def await_sent synchronize { @cv.wait_until { @sent } } end
#body_parts
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 239
def body_parts parts = [] @stream.each { |x| parts << x } parts end
#close
[ GitHub ]#code
Returns a string to ensure compatibility with Net::HTTPResponse
.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 199
def code @status.to_s end
#commit!
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 156
def commit! synchronize do before_committed @committed = true @cv.broadcast end end
#cookies
Returns the response cookies, converted to a ::Hash of (name => value) pairs
assert_equal 'AuthorOfNewPage', r. ['author']
# File 'actionpack/lib/action_dispatch/http/response.rb', line 305
def = {} if header = self[SET_COOKIE] header = header.split("\n") if header.respond_to?(:to_str) header.each do || if pair = .split(';').first key, value = pair.split("=").map { |v| Rack::Utils.unescape(v) } [key] = value end end end end
#delete_cookie(key, value = {})
[ GitHub ]#message Also known as: #status_message
# File 'actionpack/lib/action_dispatch/http/response.rb', line 211
def Rack::Utils::HTTP_STATUS_CODES[@status] end
#prepare!
Alias for #to_a.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 286
alias prepare! to_a
#rack_response(status, header)
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 391
def rack_response(status, header) assign_default_content_type_and_charset!(header) handle_conditional_get! header[SET_COOKIE] = header[SET_COOKIE].join("\n") if header[SET_COOKIE].respond_to?(:join) if NO_CONTENT_CODES.include?(@status) header.delete CONTENT_TYPE [status, header, []] else [status, header, RackBody.new(self)] end end
#redirect_url
Alias for #location.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 257
alias_method :redirect_url, :location
#response_code
The response code of the request.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 194
def response_code @status end
#sending!
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 164
def sending! synchronize do before_sending @sending = true @cv.broadcast end end
#sent!
[ GitHub ]# File 'actionpack/lib/action_dispatch/http/response.rb', line 172
def sent! synchronize do @sent = true @cv.broadcast end end
#set_cookie(key, value)
[ GitHub ]#status_message
Alias for #message.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 214
alias_method :, :
#to_a Also known as: #prepare!
# File 'actionpack/lib/action_dispatch/http/response.rb', line 283
def to_a rack_response @status, @header.to_hash end
#to_ary
Be super clear that a response object is not an ::Array. Defining this would make implicit splatting work, but it also makes adding responses as arrays work, and “flattening” responses, cascading to the rack body! Not sensible behavior.
# File 'actionpack/lib/action_dispatch/http/response.rb', line 292
def to_ary ActiveSupport::Deprecation.warn(<<-MSG.squish) `ActionDispatch::Response#to_ary` no longer performs implicit conversion to an array. Please use `response.to_a` instead, or a splat like `status, headers, body = *response`. MSG to_a end