Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
bd8c0b8a
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,发现更多精彩内容 >>
提交
bd8c0b8a
编写于
6月 11, 2012
作者:
S
Santiago Pastorino
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Return proper format on exceptions
上级
174f36a0
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
81 addition
and
14 deletion
+81
-14
actionpack/CHANGELOG.md
actionpack/CHANGELOG.md
+2
-0
actionpack/lib/action_dispatch/middleware/public_exceptions.rb
...npack/lib/action_dispatch/middleware/public_exceptions.rb
+36
-14
actionpack/test/controller/show_exceptions_test.rb
actionpack/test/controller/show_exceptions_test.rb
+43
-0
未找到文件。
actionpack/CHANGELOG.md
浏览文件 @
bd8c0b8a
## Rails 4.0.0 (unreleased) ##
## Rails 4.0.0 (unreleased) ##
*
Return proper format on exceptions.
*Santiago Pastorino*
*
Allow to use mounted_helpers (helpers for accessing mounted engines) in ActionView::TestCase.
*Piotr Sarnacki*
*
Allow to use mounted_helpers (helpers for accessing mounted engines) in ActionView::TestCase.
*Piotr Sarnacki*
*
Include mounted_helpers (helpers for accessing mounted engines) in ActionDispatch::IntegrationTest by default.
*Piotr Sarnacki*
*
Include mounted_helpers (helpers for accessing mounted engines) in ActionDispatch::IntegrationTest by default.
*Piotr Sarnacki*
...
...
actionpack/lib/action_dispatch/middleware/public_exceptions.rb
浏览文件 @
bd8c0b8a
...
@@ -3,28 +3,50 @@ module ActionDispatch
...
@@ -3,28 +3,50 @@ module ActionDispatch
class
PublicExceptions
class
PublicExceptions
attr_accessor
:public_path
attr_accessor
:public_path
def
initialize
(
public_path
)
def
initialize
(
public_path
,
consider_all_requests_local
=
false
)
@public_path
=
public_path
@public_path
=
public_path
@consider_all_requests_local
=
consider_all_requests_local
end
end
def
call
(
env
)
def
call
(
env
)
status
=
env
[
"PATH_INFO"
][
1
..-
1
]
exception
=
env
[
"action_dispatch.exception"
]
locale_path
=
"
#{
public_path
}
/
#{
status
}
.
#{
I18n
.
locale
}
.html"
if
I18n
.
locale
status
=
env
[
"PATH_INFO"
][
1
..-
1
]
path
=
"
#{
public_path
}
/
#{
status
}
.html"
request
=
ActionDispatch
::
Request
.
new
(
env
)
content_type
=
request
.
formats
.
first
if
locale_path
&&
File
.
exist?
(
locale_path
)
format
=
(
mime
=
Mime
[
content_type
])
&&
"to_
#{
mime
.
to_sym
}
"
render
(
status
,
File
.
read
(
locale_path
))
body
=
{
:status
=>
status
,
:error
=>
exception
.
message
}
elsif
File
.
exist?
(
path
)
render
(
status
,
File
.
read
(
path
))
render
(
status
,
body
,
:format
=>
format
,
:content_type
=>
content_type
)
end
private
def
render
(
status
,
body
,
options
)
format
=
options
[
:format
]
if
!
@consider_all_requests_local
&&
format
&&
body
.
respond_to?
(
format
)
render_format
(
status
,
body
.
public_send
(
format
),
options
)
else
else
[
404
,
{
"X-Cascade"
=>
"pass"
},
[]]
render_html
(
status
)
end
end
end
end
private
def
render_format
(
status
,
body
,
options
)
[
status
,
{
'Content-Type'
=>
"
#{
options
[
:content_type
]
}
; charset=
#{
ActionDispatch
::
Response
.
default_charset
}
"
,
'Content-Length'
=>
body
.
bytesize
.
to_s
},
[
body
]]
end
def
render_html
(
status
)
found
=
false
path
=
"
#{
public_path
}
/
#{
status
}
.
#{
I18n
.
locale
}
.html"
if
I18n
.
locale
path
=
"
#{
public_path
}
/
#{
status
}
.html"
unless
path
&&
(
found
=
File
.
exist?
(
path
))
def
render
(
status
,
body
)
if
found
||
File
.
exist?
(
path
)
[
status
,
{
'Content-Type'
=>
"text/html; charset=
#{
Response
.
default_charset
}
"
,
'Content-Length'
=>
body
.
bytesize
.
to_s
},
[
body
]]
body
=
File
.
read
(
path
)
[
status
,
{
'Content-Type'
=>
"text/html; charset=
#{
Response
.
default_charset
}
"
,
'Content-Length'
=>
body
.
bytesize
.
to_s
},
[
body
]]
else
[
404
,
{
"X-Cascade"
=>
"pass"
},
[]]
end
end
end
end
end
end
end
\ No newline at end of file
actionpack/test/controller/show_exceptions_test.rb
浏览文件 @
bd8c0b8a
...
@@ -22,6 +22,14 @@ def show_detailed_exceptions?
...
@@ -22,6 +22,14 @@ def show_detailed_exceptions?
end
end
end
end
class
ShowLocalExceptionsController
<
ActionController
::
Base
use
ActionDispatch
::
ShowExceptions
,
ActionDispatch
::
PublicExceptions
.
new
(
"
#{
FIXTURE_LOAD_PATH
}
/public"
,
true
)
def
boom
raise
'boom!'
end
end
class
ShowExceptionsTest
<
ActionDispatch
::
IntegrationTest
class
ShowExceptionsTest
<
ActionDispatch
::
IntegrationTest
test
'show error page from a remote ip'
do
test
'show error page from a remote ip'
do
@app
=
ShowExceptionsController
.
action
(
:boom
)
@app
=
ShowExceptionsController
.
action
(
:boom
)
...
@@ -68,4 +76,39 @@ class ShowExceptionsOverridenTest < ActionDispatch::IntegrationTest
...
@@ -68,4 +76,39 @@ class ShowExceptionsOverridenTest < ActionDispatch::IntegrationTest
assert_match
(
/boom/
,
body
)
assert_match
(
/boom/
,
body
)
end
end
end
end
class
ShowExceptionsFormatsTest
<
ActionDispatch
::
IntegrationTest
def
test_render_json_exception
@app
=
ShowExceptionsOverridenController
.
action
(
:boom
)
get
"/"
,
{},
'HTTP_ACCEPT'
=>
'application/json'
assert_response
:internal_server_error
assert_equal
'application/json'
,
response
.
content_type
.
to_s
assert_equal
({
:status
=>
'500'
,
:error
=>
'boom!'
}.
to_json
,
response
.
body
)
end
def
test_render_xml_exception
@app
=
ShowExceptionsOverridenController
.
action
(
:boom
)
get
"/"
,
{},
'HTTP_ACCEPT'
=>
'application/xml'
assert_response
:internal_server_error
assert_equal
'application/xml'
,
response
.
content_type
.
to_s
assert_equal
({
:status
=>
'500'
,
:error
=>
'boom!'
}.
to_xml
,
response
.
body
)
end
def
test_render_fallback_exception
@app
=
ShowExceptionsOverridenController
.
action
(
:boom
)
get
"/"
,
{},
'HTTP_ACCEPT'
=>
'text/csv'
assert_response
:internal_server_error
assert_equal
'text/html'
,
response
.
content_type
.
to_s
end
end
class
ShowExceptionsFormatsTest
<
ActionDispatch
::
IntegrationTest
def
test_render_formatted_exception_in_development
@app
=
ShowLocalExceptionsController
.
action
(
:boom
)
get
"/"
,
{},
'HTTP_ACCEPT'
=>
'application/xml'
assert_response
:internal_server_error
assert_equal
'text/html'
,
response
.
content_type
.
to_s
end
end
end
end
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录