2009-04-26 11:26:53 -04:00
|
|
|
require 'abstract_unit'
|
|
|
|
|
|
|
|
class ResponseTest < ActiveSupport::TestCase
|
|
|
|
def setup
|
|
|
|
@response = ActionDispatch::Response.new
|
|
|
|
end
|
|
|
|
|
2012-07-27 18:54:11 -04:00
|
|
|
def test_can_wait_until_commit
|
|
|
|
t = Thread.new {
|
2012-07-28 12:12:35 -04:00
|
|
|
@response.await_commit
|
2012-07-27 18:54:11 -04:00
|
|
|
}
|
|
|
|
@response.commit!
|
|
|
|
assert @response.committed?
|
2012-07-28 12:12:35 -04:00
|
|
|
assert t.join(0.5)
|
2012-07-27 18:54:11 -04:00
|
|
|
end
|
|
|
|
|
2012-07-29 18:51:21 -04:00
|
|
|
def test_stream_close
|
|
|
|
@response.stream.close
|
|
|
|
assert @response.stream.closed?
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_stream_write
|
|
|
|
@response.stream.write "foo"
|
|
|
|
@response.stream.close
|
|
|
|
assert_equal "foo", @response.body
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_write_after_close
|
|
|
|
@response.stream.close
|
|
|
|
|
|
|
|
e = assert_raises(IOError) do
|
|
|
|
@response.stream.write "omg"
|
|
|
|
end
|
|
|
|
assert_equal "closed stream", e.message
|
|
|
|
end
|
|
|
|
|
2011-12-12 22:45:16 -05:00
|
|
|
def test_response_body_encoding
|
2013-01-28 02:59:50 -05:00
|
|
|
body = ["hello".encode(Encoding::UTF_8)]
|
2011-12-12 22:45:16 -05:00
|
|
|
response = ActionDispatch::Response.new 200, {}, body
|
|
|
|
assert_equal Encoding::UTF_8, response.body.encoding
|
|
|
|
end
|
|
|
|
|
2009-04-26 11:26:53 -04:00
|
|
|
test "simple output" do
|
|
|
|
@response.body = "Hello, World!"
|
|
|
|
|
|
|
|
status, headers, body = @response.to_a
|
|
|
|
assert_equal 200, status
|
|
|
|
assert_equal({
|
2010-09-22 15:40:14 -04:00
|
|
|
"Content-Type" => "text/html; charset=utf-8"
|
2009-04-26 11:26:53 -04:00
|
|
|
}, headers)
|
|
|
|
|
|
|
|
parts = []
|
|
|
|
body.each { |part| parts << part }
|
|
|
|
assert_equal ["Hello, World!"], parts
|
|
|
|
end
|
2011-02-07 19:44:27 -05:00
|
|
|
|
2010-10-18 15:00:48 -04:00
|
|
|
test "status handled properly in initialize" do
|
|
|
|
assert_equal 200, ActionDispatch::Response.new('200 OK').status
|
|
|
|
end
|
2009-04-26 11:26:53 -04:00
|
|
|
|
|
|
|
test "utf8 output" do
|
|
|
|
@response.body = [1090, 1077, 1089, 1090].pack("U*")
|
|
|
|
|
2011-02-07 19:44:27 -05:00
|
|
|
status, headers, _ = @response.to_a
|
2009-04-26 11:26:53 -04:00
|
|
|
assert_equal 200, status
|
|
|
|
assert_equal({
|
2010-09-22 15:40:14 -04:00
|
|
|
"Content-Type" => "text/html; charset=utf-8"
|
2009-04-26 11:26:53 -04:00
|
|
|
}, headers)
|
|
|
|
end
|
|
|
|
|
|
|
|
test "content type" do
|
|
|
|
[204, 304].each do |c|
|
|
|
|
@response.status = c.to_s
|
2011-02-07 19:44:27 -05:00
|
|
|
_, headers, _ = @response.to_a
|
2009-04-26 11:26:53 -04:00
|
|
|
assert !headers.has_key?("Content-Type"), "#{c} should not have Content-Type header"
|
|
|
|
end
|
|
|
|
|
|
|
|
[200, 302, 404, 500].each do |c|
|
|
|
|
@response.status = c.to_s
|
2011-02-07 19:44:27 -05:00
|
|
|
_, headers, _ = @response.to_a
|
2009-04-26 11:26:53 -04:00
|
|
|
assert headers.has_key?("Content-Type"), "#{c} did not have Content-Type header"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
test "does not include Status header" do
|
|
|
|
@response.status = "200 OK"
|
2011-02-07 19:44:27 -05:00
|
|
|
_, headers, _ = @response.to_a
|
2009-04-26 11:26:53 -04:00
|
|
|
assert !headers.has_key?('Status')
|
|
|
|
end
|
2009-04-26 12:12:33 -04:00
|
|
|
|
|
|
|
test "response code" do
|
|
|
|
@response.status = "200 OK"
|
|
|
|
assert_equal 200, @response.response_code
|
|
|
|
|
|
|
|
@response.status = "200"
|
|
|
|
assert_equal 200, @response.response_code
|
|
|
|
|
|
|
|
@response.status = 200
|
|
|
|
assert_equal 200, @response.response_code
|
|
|
|
end
|
|
|
|
|
|
|
|
test "code" do
|
|
|
|
@response.status = "200 OK"
|
|
|
|
assert_equal "200", @response.code
|
|
|
|
|
|
|
|
@response.status = "200"
|
|
|
|
assert_equal "200", @response.code
|
|
|
|
|
|
|
|
@response.status = 200
|
|
|
|
assert_equal "200", @response.code
|
|
|
|
end
|
|
|
|
|
|
|
|
test "message" do
|
|
|
|
@response.status = "200 OK"
|
|
|
|
assert_equal "OK", @response.message
|
|
|
|
|
|
|
|
@response.status = "200"
|
|
|
|
assert_equal "OK", @response.message
|
|
|
|
|
|
|
|
@response.status = 200
|
|
|
|
assert_equal "OK", @response.message
|
|
|
|
end
|
|
|
|
|
|
|
|
test "cookies" do
|
|
|
|
@response.set_cookie("user_name", :value => "david", :path => "/")
|
|
|
|
status, headers, body = @response.to_a
|
|
|
|
assert_equal "user_name=david; path=/", headers["Set-Cookie"]
|
|
|
|
assert_equal({"user_name" => "david"}, @response.cookies)
|
|
|
|
|
|
|
|
@response.set_cookie("login", :value => "foo&bar", :path => "/", :expires => Time.utc(2005, 10, 10,5))
|
|
|
|
status, headers, body = @response.to_a
|
2013-01-10 22:34:52 -05:00
|
|
|
assert_equal "user_name=david; path=/\nlogin=foo%26bar; path=/; expires=Mon, 10 Oct 2005 05:00:00 -0000", headers["Set-Cookie"]
|
2009-04-26 12:12:33 -04:00
|
|
|
assert_equal({"login" => "foo&bar", "user_name" => "david"}, @response.cookies)
|
2010-05-17 19:42:35 -04:00
|
|
|
|
|
|
|
@response.delete_cookie("login")
|
|
|
|
status, headers, body = @response.to_a
|
|
|
|
assert_equal({"user_name" => "david", "login" => nil}, @response.cookies)
|
2009-04-26 12:12:33 -04:00
|
|
|
end
|
2009-12-17 23:10:06 -05:00
|
|
|
|
|
|
|
test "read cache control" do
|
2010-09-27 14:18:35 -04:00
|
|
|
resp = ActionDispatch::Response.new.tap { |response|
|
|
|
|
response.cache_control[:public] = true
|
|
|
|
response.etag = '123'
|
|
|
|
response.body = 'Hello'
|
2009-12-17 23:10:06 -05:00
|
|
|
}
|
|
|
|
resp.to_a
|
|
|
|
|
|
|
|
assert_equal('"202cb962ac59075b964b07152d234b70"', resp.etag)
|
|
|
|
assert_equal({:public => true}, resp.cache_control)
|
|
|
|
|
|
|
|
assert_equal('public', resp.headers['Cache-Control'])
|
|
|
|
assert_equal('"202cb962ac59075b964b07152d234b70"', resp.headers['ETag'])
|
|
|
|
end
|
|
|
|
|
|
|
|
test "read charset and content type" do
|
2010-09-27 14:18:35 -04:00
|
|
|
resp = ActionDispatch::Response.new.tap { |response|
|
|
|
|
response.charset = 'utf-16'
|
|
|
|
response.content_type = Mime::XML
|
|
|
|
response.body = 'Hello'
|
2009-12-17 23:10:06 -05:00
|
|
|
}
|
|
|
|
resp.to_a
|
|
|
|
|
|
|
|
assert_equal('utf-16', resp.charset)
|
|
|
|
assert_equal(Mime::XML, resp.content_type)
|
|
|
|
|
|
|
|
assert_equal('application/xml; charset=utf-16', resp.headers['Content-Type'])
|
|
|
|
end
|
2011-12-06 11:46:41 -05:00
|
|
|
|
|
|
|
test "read content type without charset" do
|
|
|
|
original = ActionDispatch::Response.default_charset
|
|
|
|
begin
|
|
|
|
ActionDispatch::Response.default_charset = 'utf-16'
|
|
|
|
resp = ActionDispatch::Response.new(200, { "Content-Type" => "text/xml" })
|
|
|
|
assert_equal('utf-16', resp.charset)
|
|
|
|
ensure
|
|
|
|
ActionDispatch::Response.default_charset = original
|
|
|
|
end
|
|
|
|
end
|
2012-08-09 10:12:11 -04:00
|
|
|
|
2012-08-18 18:29:58 -04:00
|
|
|
test "read x_frame_options, x_content_type_options and x_xss_protection" do
|
2012-09-08 15:51:22 -04:00
|
|
|
begin
|
|
|
|
ActionDispatch::Response.default_headers = {
|
|
|
|
'X-Frame-Options' => 'DENY',
|
|
|
|
'X-Content-Type-Options' => 'nosniff',
|
2013-06-13 15:56:02 -04:00
|
|
|
'X-XSS-Protection' => '1;'
|
2012-09-08 15:51:22 -04:00
|
|
|
}
|
|
|
|
resp = ActionDispatch::Response.new.tap { |response|
|
|
|
|
response.body = 'Hello'
|
|
|
|
}
|
|
|
|
resp.to_a
|
|
|
|
|
|
|
|
assert_equal('DENY', resp.headers['X-Frame-Options'])
|
|
|
|
assert_equal('nosniff', resp.headers['X-Content-Type-Options'])
|
|
|
|
assert_equal('1;', resp.headers['X-XSS-Protection'])
|
|
|
|
ensure
|
|
|
|
ActionDispatch::Response.default_headers = nil
|
|
|
|
end
|
|
|
|
end
|
2012-08-09 10:12:11 -04:00
|
|
|
|
|
|
|
test "read custom default_header" do
|
2012-09-08 15:51:22 -04:00
|
|
|
begin
|
|
|
|
ActionDispatch::Response.default_headers = {
|
|
|
|
'X-XX-XXXX' => 'Here is my phone number'
|
|
|
|
}
|
|
|
|
resp = ActionDispatch::Response.new.tap { |response|
|
|
|
|
response.body = 'Hello'
|
|
|
|
}
|
|
|
|
resp.to_a
|
|
|
|
|
|
|
|
assert_equal('Here is my phone number', resp.headers['X-XX-XXXX'])
|
|
|
|
ensure
|
|
|
|
ActionDispatch::Response.default_headers = nil
|
|
|
|
end
|
|
|
|
end
|
2009-12-17 23:10:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
class ResponseIntegrationTest < ActionDispatch::IntegrationTest
|
|
|
|
def app
|
|
|
|
@app
|
|
|
|
end
|
|
|
|
|
|
|
|
test "response cache control from railsish app" do
|
|
|
|
@app = lambda { |env|
|
|
|
|
ActionDispatch::Response.new.tap { |resp|
|
|
|
|
resp.cache_control[:public] = true
|
|
|
|
resp.etag = '123'
|
|
|
|
resp.body = 'Hello'
|
|
|
|
}.to_a
|
|
|
|
}
|
|
|
|
|
|
|
|
get '/'
|
|
|
|
assert_response :success
|
|
|
|
|
|
|
|
assert_equal('public', @response.headers['Cache-Control'])
|
|
|
|
assert_equal('"202cb962ac59075b964b07152d234b70"', @response.headers['ETag'])
|
|
|
|
|
2010-02-19 10:31:10 -05:00
|
|
|
assert_equal('"202cb962ac59075b964b07152d234b70"', @response.etag)
|
|
|
|
assert_equal({:public => true}, @response.cache_control)
|
2009-12-17 23:10:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
test "response cache control from rackish app" do
|
|
|
|
@app = lambda { |env|
|
|
|
|
[200,
|
|
|
|
{'ETag' => '"202cb962ac59075b964b07152d234b70"',
|
2009-12-23 16:06:53 -05:00
|
|
|
'Cache-Control' => 'public'}, ['Hello']]
|
2009-12-17 23:10:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
get '/'
|
|
|
|
assert_response :success
|
|
|
|
|
|
|
|
assert_equal('public', @response.headers['Cache-Control'])
|
|
|
|
assert_equal('"202cb962ac59075b964b07152d234b70"', @response.headers['ETag'])
|
|
|
|
|
2010-02-19 10:31:10 -05:00
|
|
|
assert_equal('"202cb962ac59075b964b07152d234b70"', @response.etag)
|
|
|
|
assert_equal({:public => true}, @response.cache_control)
|
2009-12-17 23:10:06 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
test "response charset and content type from railsish app" do
|
|
|
|
@app = lambda { |env|
|
|
|
|
ActionDispatch::Response.new.tap { |resp|
|
|
|
|
resp.charset = 'utf-16'
|
|
|
|
resp.content_type = Mime::XML
|
|
|
|
resp.body = 'Hello'
|
|
|
|
}.to_a
|
|
|
|
}
|
|
|
|
|
|
|
|
get '/'
|
|
|
|
assert_response :success
|
|
|
|
|
2010-02-19 10:31:10 -05:00
|
|
|
assert_equal('utf-16', @response.charset)
|
|
|
|
assert_equal(Mime::XML, @response.content_type)
|
2009-12-17 23:10:06 -05:00
|
|
|
|
|
|
|
assert_equal('application/xml; charset=utf-16', @response.headers['Content-Type'])
|
|
|
|
end
|
|
|
|
|
|
|
|
test "response charset and content type from rackish app" do
|
|
|
|
@app = lambda { |env|
|
|
|
|
[200,
|
|
|
|
{'Content-Type' => 'application/xml; charset=utf-16'},
|
2009-12-23 16:06:53 -05:00
|
|
|
['Hello']]
|
2009-12-17 23:10:06 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
get '/'
|
|
|
|
assert_response :success
|
|
|
|
|
2010-02-19 10:31:10 -05:00
|
|
|
assert_equal('utf-16', @response.charset)
|
|
|
|
assert_equal(Mime::XML, @response.content_type)
|
2009-12-17 23:10:06 -05:00
|
|
|
|
|
|
|
assert_equal('application/xml; charset=utf-16', @response.headers['Content-Type'])
|
|
|
|
end
|
2009-04-26 11:26:53 -04:00
|
|
|
end
|