Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
7336d0a2
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
7336d0a2
编写于
12月 21, 2016
作者:
A
Aaron Patterson
提交者:
GitHub
12月 21, 2016
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #27427 from rails/binary-params
Document and update API for `skip_parameter_encoding`
上级
85b2a3ea
87105622
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
56 addition
and
54 deletion
+56
-54
actionpack/lib/action_controller/metal.rb
actionpack/lib/action_controller/metal.rb
+2
-2
actionpack/lib/action_controller/metal/parameter_encoding.rb
actionpack/lib/action_controller/metal/parameter_encoding.rb
+29
-10
actionpack/lib/action_dispatch/http/parameters.rb
actionpack/lib/action_dispatch/http/parameters.rb
+5
-10
actionpack/lib/action_dispatch/http/request.rb
actionpack/lib/action_dispatch/http/request.rb
+1
-1
actionpack/lib/action_dispatch/request/utils.rb
actionpack/lib/action_dispatch/request/utils.rb
+11
-0
actionpack/test/controller/parameter_encoding_test.rb
actionpack/test/controller/parameter_encoding_test.rb
+8
-31
未找到文件。
actionpack/lib/action_controller/metal.rb
浏览文件 @
7336d0a2
...
...
@@ -139,8 +139,8 @@ def self.make_response!(request)
end
end
def
self
.
encoding_for_param
(
action
,
param
)
# :nodoc:
::
Encoding
::
UTF_8
def
self
.
binary_params_for?
(
action
)
# :nodoc:
false
end
# Delegates to the class' <tt>controller_name</tt>
...
...
actionpack/lib/action_controller/metal/parameter_encoding.rb
浏览文件 @
7336d0a2
module
ActionController
#
Allows encoding to be specified per parameter per
action.
#
Specify binary encoding for parameters for a given
action.
module
ParameterEncoding
extend
ActiveSupport
::
Concern
...
...
@@ -13,17 +13,36 @@ def setup_param_encode # :nodoc:
@_parameter_encodings
=
{}
end
def
encoding_for_param
(
action
,
param
)
# :nodoc:
if
@_parameter_encodings
[
action
.
to_s
]
&&
@_parameter_encodings
[
action
.
to_s
][
param
.
to_s
]
@_parameter_encodings
[
action
.
to_s
][
param
.
to_s
]
else
super
end
def
binary_params_for?
(
action
)
# :nodoc:
@_parameter_encodings
[
action
.
to_s
]
end
def
parameter_encoding
(
action
,
param_name
,
encoding
)
@_parameter_encodings
[
action
.
to_s
]
||=
{}
@_parameter_encodings
[
action
.
to_s
][
param_name
.
to_s
]
=
encoding
# Specify that a given action's parameters should all be encoded as
# ASCII-8BIT (it "skips" the encoding default of UTF-8).
#
# For example, a controller would use it like this:
#
# class RepositoryController < ActionController::Base
# skip_parameter_encoding :show
#
# def show
# @repo = Repository.find_by_filesystem_path params[:file_path]
#
# # `repo_name` is guaranteed to be UTF-8, but was ASCII-8BIT, so
# # tag it as such
# @repo_name = params[:repo_name].force_encoding 'UTF-8'
# end
#
# def index
# @repositories = Repository.all
# end
# end
#
# The show action in the above controller would have all parameter values
# encoded as ASCII-8BIT. This is useful in the case where an application
# must handle data but encoding of the data is unknown, like file system data.
def
skip_parameter_encoding
(
action
)
@_parameter_encodings
[
action
.
to_s
]
=
true
end
end
end
...
...
actionpack/lib/action_dispatch/http/parameters.rb
浏览文件 @
7336d0a2
...
...
@@ -45,7 +45,7 @@ def parameters
query_parameters
.
dup
end
params
.
merge!
(
path_parameters
)
params
=
set_
custom
_encoding
(
params
)
params
=
set_
binary
_encoding
(
params
)
set_header
(
"action_dispatch.request.parameters"
,
params
)
params
end
...
...
@@ -73,21 +73,16 @@ def path_parameters
private
def
set_
custom
_encoding
(
params
)
def
set_
binary
_encoding
(
params
)
action
=
params
[
:action
]
params
.
each
do
|
k
,
v
|
if
v
.
is_a?
(
String
)
&&
v
.
encoding
!=
encoding_template
(
action
,
k
)
param
s
[
k
]
=
v
.
force_encoding
(
encoding_template
(
action
,
k
))
if
controller_class
.
binary_params_for?
(
action
)
ActionDispatch
::
Request
::
Utils
.
each_param_value
(
params
)
do
|
param
|
param
.
force_encoding
::
Encoding
::
ASCII_8BIT
end
end
params
end
def
encoding_template
(
action
,
param
)
controller_class
.
encoding_for_param
(
action
,
param
)
end
def
parse_formatted_parameters
(
parsers
)
return
yield
if
content_length
.
zero?
||
content_mime_type
.
nil?
...
...
actionpack/lib/action_dispatch/http/request.rb
浏览文件 @
7336d0a2
...
...
@@ -69,7 +69,7 @@ def commit_cookie_jar! # :nodoc:
PASS_NOT_FOUND
=
Class
.
new
{
# :nodoc:
def
self
.
action
(
_
);
self
;
end
def
self
.
call
(
_
);
[
404
,
{
"X-Cascade"
=>
"pass"
},
[]];
end
def
self
.
encoding_for_param
(
action
,
param
);
::
Encoding
::
UTF_8
;
end
def
self
.
binary_params_for?
(
action
);
false
;
end
}
def
controller_class
...
...
actionpack/lib/action_dispatch/request/utils.rb
浏览文件 @
7336d0a2
...
...
@@ -4,6 +4,17 @@ class Utils # :nodoc:
mattr_accessor
:perform_deep_munge
self
.
perform_deep_munge
=
true
def
self
.
each_param_value
(
params
,
&
block
)
case
params
when
Array
params
.
each
{
|
element
|
each_param_value
(
element
,
&
block
)
}
when
Hash
params
.
each_value
{
|
value
|
each_param_value
(
value
,
&
block
)
}
when
String
block
.
call
params
end
end
def
self
.
normalize_encode_params
(
params
)
if
perform_deep_munge
NoNilParamEncoder
.
normalize_encode_params
params
...
...
actionpack/test/controller/parameter_encoding_test.rb
浏览文件 @
7336d0a2
require
"abstract_unit"
class
ParameterEncodingController
<
ActionController
::
Base
parameter_encoding
:test_bar
,
:bar
,
Encoding
::
ASCII_8BIT
parameter_encoding
:test_baz
,
:baz
,
Encoding
::
ISO_8859_1
parameter_encoding
:test_baz_to_ascii
,
:baz
,
Encoding
::
ASCII_8BIT
skip_parameter_encoding
:test_bar
skip_parameter_encoding
:test_all_values_encoding
def
test_foo
render
body:
params
[
:foo
].
encoding
...
...
@@ -13,16 +12,8 @@ def test_bar
render
body:
params
[
:bar
].
encoding
end
def
test_baz
render
body:
params
[
:baz
].
encoding
end
def
test_no_change_to_baz
render
body:
params
[
:baz
].
encoding
end
def
test_baz_to_ascii
render
body:
params
[
:baz
].
encoding
def
test_all_values_encoding
render
body:
::
JSON
.
dump
(
params
.
values
.
map
(
&
:encoding
).
map
(
&
:name
))
end
end
...
...
@@ -36,32 +27,18 @@ class ParameterEncodingTest < ActionController::TestCase
assert_equal
"UTF-8"
,
@response
.
body
end
test
"properly
transcodes ASCII_8BIT parameters into declared encodings
"
do
test
"properly
encodes ASCII_8BIT parameters into binary
"
do
post
:test_bar
,
params:
{
"foo"
=>
"foo"
,
"bar"
=>
"bar"
,
"baz"
=>
"baz"
}
assert_response
:success
assert_equal
"ASCII-8BIT"
,
@response
.
body
end
test
"properly transcodes ISO_8859_1 parameters into declared encodings"
do
post
:test_baz
,
params:
{
"foo"
=>
"foo"
,
"bar"
=>
"bar"
,
"baz"
=>
"baz"
}
assert_response
:success
assert_equal
"ISO-8859-1"
,
@response
.
body
end
test
"does not transcode parameters when not specified"
do
post
:test_no_change_to_baz
,
params:
{
"foo"
=>
"foo"
,
"bar"
=>
"bar"
,
"baz"
=>
"baz"
}
test
"properly encodes all ASCII_8BIT parameters into binary"
do
post
:test_all_values_encoding
,
params:
{
"foo"
=>
"foo"
,
"bar"
=>
"bar"
,
"baz"
=>
"baz"
}
assert_response
:success
assert_equal
"UTF-8"
,
@response
.
body
end
test
"respects different encoding declarations for a param per action"
do
post
:test_baz_to_ascii
,
params:
{
"foo"
=>
"foo"
,
"bar"
=>
"bar"
,
"baz"
=>
"baz"
}
assert_response
:success
assert_equal
"ASCII-8BIT"
,
@response
.
body
assert_equal
[
"ASCII-8BIT"
],
JSON
.
parse
(
@response
.
body
).
uniq
end
test
"does not raise an error when passed a param declared as ASCII-8BIT that contains invalid bytes"
do
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录