提交 4185881d 编写于 作者: R Ryuta Kamizono

Merge pull request #35549 from r7kamura/feature/response-charset

Support other optional parameters and quoted-strings on Content-Type parser
上级 ecadd935
......@@ -82,6 +82,7 @@ def each(&block)
SET_COOKIE = "Set-Cookie".freeze
LOCATION = "Location".freeze
NO_CONTENT_CODES = [100, 101, 102, 204, 205, 304]
CONTENT_TYPE_PARSER = /\A(?<type>[^;\s]+)?(?:.*;\s*charset=(?<quote>"?)(?<charset>[^;\s]+)\k<quote>)?/ # :nodoc:
cattr_accessor :default_charset, default: "utf-8"
cattr_accessor :default_headers
......@@ -409,10 +410,8 @@ def cookies
NullContentTypeHeader = ContentTypeHeader.new nil, nil
def parse_content_type(content_type)
if content_type
type, charset = content_type.split(/;\s*charset=/)
type = nil if type && type.empty?
ContentTypeHeader.new(type, charset)
if content_type && match = CONTENT_TYPE_PARSER.match(content_type)
ContentTypeHeader.new(match[:type], match[:charset])
else
NullContentTypeHeader
end
......
......@@ -539,4 +539,38 @@ class ResponseIntegrationTest < ActionDispatch::IntegrationTest
assert_equal('"202cb962ac59075b964b07152d234b70"', @response.headers["ETag"])
assert_equal('"202cb962ac59075b964b07152d234b70"', @response.etag)
end
test "response Content-Type with optional parameters" do
@app = lambda { |env|
[
200,
{ "Content-Type" => "text/csv; charset=utf-16; header=present" },
["Hello"]
]
}
get "/"
assert_response :success
assert_equal("text/csv; charset=utf-16; header=present", @response.headers["Content-Type"])
assert_equal("text/csv", @response.content_type)
assert_equal("utf-16", @response.charset)
end
test "response Content-Type with quoted-string" do
@app = lambda { |env|
[
200,
{ "Content-Type" => 'text/csv; header=present; charset="utf-16"' },
["Hello"]
]
}
get "/"
assert_response :success
assert_equal('text/csv; header=present; charset="utf-16"', @response.headers["Content-Type"])
assert_equal("text/csv", @response.content_type)
assert_equal("utf-16", @response.charset)
end
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册