Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
64e66cf1
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,体验更适合开发者的 AI 搜索 >>
提交
64e66cf1
编写于
4月 30, 2009
作者:
J
Joshua Peek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Vendor new Rack::Mock changes
上级
9bac470c
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
335 addition
and
155 deletion
+335
-155
actionpack/lib/action_controller/testing/integration.rb
actionpack/lib/action_controller/testing/integration.rb
+1
-1
actionpack/lib/action_controller/testing/process.rb
actionpack/lib/action_controller/testing/process.rb
+1
-1
actionpack/lib/action_dispatch.rb
actionpack/lib/action_dispatch.rb
+1
-5
actionpack/lib/action_dispatch/extensions/rack.rb
actionpack/lib/action_dispatch/extensions/rack.rb
+5
-0
actionpack/lib/action_dispatch/extensions/rack/mock.rb
actionpack/lib/action_dispatch/extensions/rack/mock.rb
+65
-0
actionpack/lib/action_dispatch/extensions/rack/utils.rb
actionpack/lib/action_dispatch/extensions/rack/utils.rb
+262
-0
actionpack/lib/action_dispatch/test/mock.rb
actionpack/lib/action_dispatch/test/mock.rb
+0
-115
actionpack/lib/action_dispatch/test/uploaded_file.rb
actionpack/lib/action_dispatch/test/uploaded_file.rb
+0
-33
未找到文件。
actionpack/lib/action_controller/testing/integration.rb
浏览文件 @
64e66cf1
...
...
@@ -263,7 +263,7 @@ def process(method, path, parameters = nil, headers = nil)
string
<<
"
#{
name
}
=
#{
value
}
; "
}
}
env
=
ActionDispatch
::
Test
::
MockRequest
.
env_for
(
path
,
opts
)
env
=
Rack
::
MockRequest
.
env_for
(
path
,
opts
)
(
headers
||
{}).
each
do
|
key
,
value
|
key
=
key
.
to_s
.
upcase
.
gsub
(
/-/
,
"_"
)
...
...
actionpack/lib/action_controller/testing/process.rb
浏览文件 @
64e66cf1
...
...
@@ -250,7 +250,7 @@ def initialize(session = {})
#
# Pass a true third parameter to ensure the uploaded file is opened in binary mode (only required for Windows):
# post :change_avatar, :avatar => ActionController::TestUploadedFile.new(ActionController::TestCase.fixture_path + '/files/spongebob.png', 'image/png', :binary)
TestUploadedFile
=
ActionDispatch
::
Tes
t
::
UploadedFile
TestUploadedFile
=
Rack
::
Utils
::
Multipar
t
::
UploadedFile
module
TestProcess
def
self
.
included
(
base
)
...
...
actionpack/lib/action_dispatch.rb
浏览文件 @
64e66cf1
...
...
@@ -34,6 +34,7 @@
gem
'rack'
,
'~> 1.0.0'
require
'rack'
require
'action_dispatch/extensions/rack'
module
ActionDispatch
autoload
:Request
,
'action_dispatch/http/request'
...
...
@@ -56,11 +57,6 @@ module Session
autoload
:CookieStore
,
'action_dispatch/middleware/session/cookie_store'
autoload
:MemCacheStore
,
'action_dispatch/middleware/session/mem_cache_store'
end
module
Test
autoload
:UploadedFile
,
'action_dispatch/test/uploaded_file'
autoload
:MockRequest
,
'action_dispatch/test/mock'
end
end
autoload
:Mime
,
'action_dispatch/http/mime_type'
actionpack/lib/action_dispatch/extensions/rack.rb
0 → 100644
浏览文件 @
64e66cf1
# Monkey patch in new test helper methods
unless
Rack
::
Utils
.
respond_to?
(
:build_nested_query
)
require
'action_dispatch/extensions/rack/mock'
require
'action_dispatch/extensions/rack/utils'
end
actionpack/lib/action_dispatch/extensions/rack/mock.rb
0 → 100644
浏览文件 @
64e66cf1
require
'rack/mock'
module
Rack
class
MockRequest
# Return the Rack environment used for a request to +uri+.
def
self
.
env_for
(
uri
=
""
,
opts
=
{})
uri
=
URI
(
uri
)
uri
.
path
=
"/
#{
uri
.
path
}
"
unless
uri
.
path
[
0
]
==
?/
env
=
DEFAULT_ENV
.
dup
env
[
"REQUEST_METHOD"
]
=
opts
[
:method
]
?
opts
[
:method
].
to_s
.
upcase
:
"GET"
env
[
"SERVER_NAME"
]
=
uri
.
host
||
"example.org"
env
[
"SERVER_PORT"
]
=
uri
.
port
?
uri
.
port
.
to_s
:
"80"
env
[
"QUERY_STRING"
]
=
uri
.
query
.
to_s
env
[
"PATH_INFO"
]
=
(
!
uri
.
path
||
uri
.
path
.
empty?
)
?
"/"
:
uri
.
path
env
[
"rack.url_scheme"
]
=
uri
.
scheme
||
"http"
env
[
"HTTPS"
]
=
env
[
"rack.url_scheme"
]
==
"https"
?
"on"
:
"off"
env
[
"SCRIPT_NAME"
]
=
opts
[
:script_name
]
||
""
if
opts
[
:fatal
]
env
[
"rack.errors"
]
=
FatalWarner
.
new
else
env
[
"rack.errors"
]
=
StringIO
.
new
end
if
params
=
opts
[
:params
]
if
env
[
"REQUEST_METHOD"
]
==
"GET"
params
=
Utils
.
parse_nested_query
(
params
)
if
params
.
is_a?
(
String
)
params
.
update
(
Utils
.
parse_nested_query
(
env
[
"QUERY_STRING"
]))
env
[
"QUERY_STRING"
]
=
Utils
.
build_nested_query
(
params
)
elsif
!
opts
.
has_key?
(
:input
)
opts
[
"CONTENT_TYPE"
]
=
"application/x-www-form-urlencoded"
if
params
.
is_a?
(
Hash
)
if
data
=
Utils
::
Multipart
.
build_multipart
(
params
)
opts
[
:input
]
=
data
opts
[
"CONTENT_LENGTH"
]
||=
data
.
length
.
to_s
opts
[
"CONTENT_TYPE"
]
=
"multipart/form-data; boundary=
#{
Utils
::
Multipart
::
MULTIPART_BOUNDARY
}
"
else
opts
[
:input
]
=
Utils
.
build_nested_query
(
params
)
end
else
opts
[
:input
]
=
params
end
end
end
opts
[
:input
]
||=
""
if
String
===
opts
[
:input
]
env
[
"rack.input"
]
=
StringIO
.
new
(
opts
[
:input
])
else
env
[
"rack.input"
]
=
opts
[
:input
]
end
env
[
"CONTENT_LENGTH"
]
||=
env
[
"rack.input"
].
length
.
to_s
opts
.
each
{
|
field
,
value
|
env
[
field
]
=
value
if
String
===
field
}
env
end
end
end
actionpack/lib/action_dispatch/extensions/rack/utils.rb
0 → 100644
浏览文件 @
64e66cf1
# -*- encoding: binary -*-
require
'rack/utils'
module
Rack
module
Utils
def
normalize_params
(
params
,
name
,
v
=
nil
)
name
=~
%r(
\A
[
\[\]
]*([^
\[\]
]+)
\]
*)
k
=
$1
||
''
after
=
$'
||
''
return
if
k
.
empty?
if
after
==
""
params
[
k
]
=
v
elsif
after
==
"[]"
params
[
k
]
||=
[]
raise
TypeError
,
"expected Array (got
#{
params
[
k
].
class
.
name
}
) for param `
#{
k
}
'"
unless
params
[
k
].
is_a?
(
Array
)
params
[
k
]
<<
v
elsif
after
=~
%r(^
\[\]\[
([^
\[\]
]+)
\]
$)
||
after
=~
%r(^
\[\]
(.+)$)
child_key
=
$1
params
[
k
]
||=
[]
raise
TypeError
,
"expected Array (got
#{
params
[
k
].
class
.
name
}
) for param `
#{
k
}
'"
unless
params
[
k
].
is_a?
(
Array
)
if
params
[
k
].
last
.
is_a?
(
Hash
)
&&
!
params
[
k
].
last
.
key?
(
child_key
)
normalize_params
(
params
[
k
].
last
,
child_key
,
v
)
else
params
[
k
]
<<
normalize_params
({},
child_key
,
v
)
end
else
params
[
k
]
||=
{}
raise
TypeError
,
"expected Hash (got
#{
params
[
k
].
class
.
name
}
) for param `
#{
k
}
'"
unless
params
[
k
].
is_a?
(
Hash
)
params
[
k
]
=
normalize_params
(
params
[
k
],
after
,
v
)
end
return
params
end
module_function
:normalize_params
def
build_nested_query
(
value
,
prefix
=
nil
)
case
value
when
Array
value
.
map
{
|
v
|
build_nested_query
(
v
,
"
#{
prefix
}
[]"
)
}.
join
(
"&"
)
when
Hash
value
.
map
{
|
k
,
v
|
build_nested_query
(
v
,
prefix
?
"
#{
prefix
}
[
#{
escape
(
k
)
}
]"
:
escape
(
k
))
}.
join
(
"&"
)
when
String
raise
ArgumentError
,
"value must be a Hash"
if
prefix
.
nil?
"
#{
prefix
}
=
#{
escape
(
value
)
}
"
else
prefix
end
end
module_function
:build_nested_query
module
Multipart
class
UploadedFile
# The filename, *not* including the path, of the "uploaded" file
attr_reader
:original_filename
# The content type of the "uploaded" file
attr_accessor
:content_type
def
initialize
(
path
,
content_type
=
"text/plain"
,
binary
=
false
)
raise
"
#{
path
}
file does not exist"
unless
::
File
.
exist?
(
path
)
@content_type
=
content_type
@original_filename
=
::
File
.
basename
(
path
)
@tempfile
=
Tempfile
.
new
(
@original_filename
)
@tempfile
.
set_encoding
(
Encoding
::
BINARY
)
if
@tempfile
.
respond_to?
(
:set_encoding
)
@tempfile
.
binmode
if
binary
FileUtils
.
copy_file
(
path
,
@tempfile
.
path
)
end
def
path
@tempfile
.
path
end
alias_method
:local_path
,
:path
def
method_missing
(
method_name
,
*
args
,
&
block
)
#:nodoc:
@tempfile
.
__send__
(
method_name
,
*
args
,
&
block
)
end
end
EOL
=
"
\r\n
"
MULTIPART_BOUNDARY
=
"AaB03x"
def
self
.
parse_multipart
(
env
)
unless
env
[
'CONTENT_TYPE'
]
=~
%r|
\A
multipart/.*boundary=
\"
?([^
\"
;,]+)
\"
?|n
nil
else
boundary
=
"--
#{
$1
}
"
params
=
{}
buf
=
""
content_length
=
env
[
'CONTENT_LENGTH'
].
to_i
input
=
env
[
'rack.input'
]
input
.
rewind
boundary_size
=
Utils
.
bytesize
(
boundary
)
+
EOL
.
size
bufsize
=
16384
content_length
-=
boundary_size
read_buffer
=
''
status
=
input
.
read
(
boundary_size
,
read_buffer
)
raise
EOFError
,
"bad content body"
unless
status
==
boundary
+
EOL
rx
=
/(?:
#{
EOL
}
)?
#{
Regexp
.
quote
boundary
}
(
#{
EOL
}
|--)/n
loop
{
head
=
nil
body
=
''
filename
=
content_type
=
name
=
nil
until
head
&&
buf
=~
rx
if
!
head
&&
i
=
buf
.
index
(
EOL
+
EOL
)
head
=
buf
.
slice!
(
0
,
i
+
2
)
# First \r\n
buf
.
slice!
(
0
,
2
)
# Second \r\n
filename
=
head
[
/Content-Disposition:.* filename="?([^\";]*)"?/ni
,
1
]
content_type
=
head
[
/Content-Type: (.*)
#{
EOL
}
/ni
,
1
]
name
=
head
[
/Content-Disposition:.*\s+name="?([^\";]*)"?/ni
,
1
]
||
head
[
/Content-ID:\s*([^
#{
EOL
}
]*)/ni
,
1
]
if
content_type
||
filename
body
=
Tempfile
.
new
(
"RackMultipart"
)
body
.
binmode
if
body
.
respond_to?
(
:binmode
)
end
next
end
# Save the read body part.
if
head
&&
(
boundary_size
+
4
<
buf
.
size
)
body
<<
buf
.
slice!
(
0
,
buf
.
size
-
(
boundary_size
+
4
))
end
c
=
input
.
read
(
bufsize
<
content_length
?
bufsize
:
content_length
,
read_buffer
)
raise
EOFError
,
"bad content body"
if
c
.
nil?
||
c
.
empty?
buf
<<
c
content_length
-=
c
.
size
end
# Save the rest.
if
i
=
buf
.
index
(
rx
)
body
<<
buf
.
slice!
(
0
,
i
)
buf
.
slice!
(
0
,
boundary_size
+
2
)
content_length
=
-
1
if
$1
==
"--"
end
if
filename
==
""
# filename is blank which means no file has been selected
data
=
nil
elsif
filename
body
.
rewind
# Take the basename of the upload's original filename.
# This handles the full Windows paths given by Internet Explorer
# (and perhaps other broken user agents) without affecting
# those which give the lone filename.
filename
=~
/^(?:.*[:\\\/])?(.*)/m
filename
=
$1
data
=
{
:filename
=>
filename
,
:type
=>
content_type
,
:name
=>
name
,
:tempfile
=>
body
,
:head
=>
head
}
elsif
!
filename
&&
content_type
body
.
rewind
# Generic multipart cases, not coming from a form
data
=
{
:type
=>
content_type
,
:name
=>
name
,
:tempfile
=>
body
,
:head
=>
head
}
else
data
=
body
end
Utils
.
normalize_params
(
params
,
name
,
data
)
unless
data
.
nil?
break
if
buf
.
empty?
||
content_length
==
-
1
}
input
.
rewind
params
end
end
def
self
.
build_multipart
(
params
,
first
=
true
)
if
first
unless
params
.
is_a?
(
Hash
)
raise
ArgumentError
,
"value must be a Hash"
end
multipart
=
false
query
=
lambda
{
|
value
|
case
value
when
Array
value
.
each
(
&
query
)
when
Hash
value
.
values
.
each
(
&
query
)
when
UploadedFile
multipart
=
true
end
}
params
.
values
.
each
(
&
query
)
return
nil
unless
multipart
end
flattened_params
=
Hash
.
new
params
.
each
do
|
key
,
value
|
k
=
first
?
key
.
to_s
:
"[
#{
key
}
]"
case
value
when
Array
value
.
map
{
|
v
|
build_multipart
(
v
,
false
).
each
{
|
subkey
,
subvalue
|
flattened_params
[
"
#{
k
}
[]
#{
subkey
}
"
]
=
subvalue
}
}
when
Hash
build_multipart
(
value
,
false
).
each
{
|
subkey
,
subvalue
|
flattened_params
[
k
+
subkey
]
=
subvalue
}
else
flattened_params
[
k
]
=
value
end
end
if
first
flattened_params
.
map
{
|
name
,
file
|
if
file
.
respond_to?
(
:original_filename
)
::
File
.
open
(
file
.
path
,
"rb"
)
do
|
f
|
f
.
set_encoding
(
Encoding
::
BINARY
)
if
f
.
respond_to?
(
:set_encoding
)
<<-
EOF
--
#{
MULTIPART_BOUNDARY
}
\r
Content-Disposition: form-data; name="
#{
name
}
"; filename="
#{
Utils
.
escape
(
file
.
original_filename
)
}
"
\r
Content-Type:
#{
file
.
content_type
}
\r
Content-Length:
#{
::
File
.
stat
(
file
.
path
).
size
}
\r
\r
#{
f
.
read
}
\r
EOF
end
else
<<-
EOF
--
#{
MULTIPART_BOUNDARY
}
\r
Content-Disposition: form-data; name="
#{
name
}
"
\r
\r
#{
file
}
\r
EOF
end
}.
join
+
"--
#{
MULTIPART_BOUNDARY
}
--
\r
"
else
flattened_params
end
end
end
end
end
actionpack/lib/action_dispatch/test/mock.rb
已删除
100644 → 0
浏览文件 @
9bac470c
module
ActionDispatch
module
Test
class
MockRequest
<
Rack
::
MockRequest
MULTIPART_BOUNDARY
=
"----------XnJLe9ZIbbGUYtzPQJ16u1"
class
<<
self
def
env_for
(
path
,
opts
)
method
=
(
opts
[
:method
]
||
opts
[
"REQUEST_METHOD"
]).
to_s
.
upcase
opts
[
:method
]
=
opts
[
"REQUEST_METHOD"
]
=
method
path
=
"/
#{
path
}
"
unless
path
[
0
]
==
?/
uri
=
URI
.
parse
(
path
)
uri
.
host
||=
"example.org"
if
URI
::
HTTPS
===
uri
opts
.
update
(
"SERVER_PORT"
=>
"443"
,
"HTTPS"
=>
"on"
)
end
if
method
==
"POST"
&&
!
opts
.
has_key?
(
:input
)
opts
[
"CONTENT_TYPE"
]
=
"application/x-www-form-urlencoded"
multipart
=
opts
[
:params
].
respond_to?
(
:any?
)
&&
opts
[
:params
].
any?
{
|
k
,
v
|
UploadedFile
===
v
}
if
multipart
opts
[
:input
]
=
multipart_body
(
opts
.
delete
(
:params
))
opts
[
"CONTENT_LENGTH"
]
||=
opts
[
:input
].
length
.
to_s
opts
[
"CONTENT_TYPE"
]
=
"multipart/form-data; boundary=
#{
MULTIPART_BOUNDARY
}
"
else
params
=
opts
.
delete
(
:params
)
opts
[
:input
]
=
case
params
when
Hash
then
requestify
(
params
)
when
nil
then
""
else
params
end
end
end
params
=
opts
[
:params
]
||
{}
if
params
.
is_a?
(
String
)
if
method
==
"GET"
uri
.
query
=
params
else
opts
[
:input
]
=
params
end
else
params
.
stringify_keys!
params
.
update
(
::
Rack
::
Utils
.
parse_query
(
uri
.
query
))
uri
.
query
=
requestify
(
params
)
end
::
Rack
::
MockRequest
.
env_for
(
uri
.
to_s
,
opts
)
end
private
def
requestify
(
value
,
prefix
=
nil
)
case
value
when
Array
value
.
map
do
|
v
|
requestify
(
v
,
"
#{
prefix
}
[]"
)
end
.
join
(
"&"
)
when
Hash
value
.
map
do
|
k
,
v
|
requestify
(
v
,
prefix
?
"
#{
prefix
}
[
#{
::
Rack
::
Utils
.
escape
(
k
)
}
]"
:
::
Rack
::
Utils
.
escape
(
k
))
end
.
join
(
"&"
)
else
"
#{
prefix
}
=
#{
::
Rack
::
Utils
.
escape
(
value
)
}
"
end
end
def
multipart_requestify
(
params
,
first
=
true
)
p
=
Hash
.
new
params
.
each
do
|
key
,
value
|
k
=
first
?
key
.
to_s
:
"[
#{
key
}
]"
if
Hash
===
value
multipart_requestify
(
value
,
false
).
each
do
|
subkey
,
subvalue
|
p
[
k
+
subkey
]
=
subvalue
end
else
p
[
k
]
=
value
end
end
return
p
end
def
multipart_body
(
params
)
multipart_requestify
(
params
).
map
do
|
key
,
value
|
if
value
.
respond_to?
(
:original_filename
)
::
File
.
open
(
value
.
path
,
"rb"
)
do
|
f
|
f
.
set_encoding
(
Encoding
::
BINARY
)
if
f
.
respond_to?
(
:set_encoding
)
<<-
EOF
--
#{
MULTIPART_BOUNDARY
}
\r
Content-Disposition: form-data; name="
#{
key
}
"; filename="
#{
::
Rack
::
Utils
.
escape
(
value
.
original_filename
)
}
"
\r
Content-Type:
#{
value
.
content_type
}
\r
Content-Length:
#{
::
File
.
stat
(
value
.
path
).
size
}
\r
\r
#{
f
.
read
}
\r
EOF
end
else
<<-
EOF
--
#{
MULTIPART_BOUNDARY
}
\r
Content-Disposition: form-data; name="
#{
key
}
"
\r
\r
#{
value
}
\r
EOF
end
end
.
join
(
""
)
+
"--
#{
MULTIPART_BOUNDARY
}
--
\r
"
end
end
end
end
end
actionpack/lib/action_dispatch/test/uploaded_file.rb
已删除
100644 → 0
浏览文件 @
9bac470c
require
"tempfile"
module
ActionDispatch
module
Test
class
UploadedFile
# The filename, *not* including the path, of the "uploaded" file
attr_reader
:original_filename
# The content type of the "uploaded" file
attr_accessor
:content_type
def
initialize
(
path
,
content_type
=
"text/plain"
,
binary
=
false
)
raise
"
#{
path
}
file does not exist"
unless
::
File
.
exist?
(
path
)
@content_type
=
content_type
@original_filename
=
::
File
.
basename
(
path
)
@tempfile
=
Tempfile
.
new
(
@original_filename
)
@tempfile
.
set_encoding
(
Encoding
::
BINARY
)
if
@tempfile
.
respond_to?
(
:set_encoding
)
@tempfile
.
binmode
if
binary
FileUtils
.
copy_file
(
path
,
@tempfile
.
path
)
end
def
path
@tempfile
.
path
end
alias_method
:local_path
,
:path
def
method_missing
(
method_name
,
*
args
,
&
block
)
#:nodoc:
@tempfile
.
__send__
(
method_name
,
*
args
,
&
block
)
end
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录