高専カンファレンス in 東京 2014 行ってきた。写真はまだ。
なんか asonas がコード書いてたので後ろから突っ込みを入れたり(依頼を受けてました、) CTF やってみようと言われたのでバイナリもらってう〜んといじってたら解けたとかやっていた。
たいした事はしてなくて手元で動かして strace しつつ探っていただけですね。実行ファイル無しでも解きたかったなあ
昼はじぐそうくんと asonas、mactkg と一緒にハングリーバーガーへ。
Rails 4 のエラーページ
Rails 4 において開発時の例外内容つきエラーページと production での素朴なエラーページ、さらに ActiveRecord::RecordNotFound
だったら 404 とかデフォルトでどこでやってるんだろうみたいなのを追っていた。
ActionDispatch::ExceptionWrapper
が例外を保持して@@resque_responses
を見て exception のクラス名をキーに何かが取れたらそれをステータスコードとして返したりしている (#status_code
,.status_code_for_exception
)- 例外の表示は
ActionDispatch::DebugExceptions
ミドルウェアが担当。config.action_dispatch.show_exceptions
が true でconfig.action_dispatch.show_detailed_exceptions
が true であればビューを render して返し、wrapper の返してきたステータスコードを採用ActiveRecord::RecordNotFound
であれば 404 で返しつつ例外ページが render されるconfig.action_dispatch.show_detailed_exceptions
はconfig.consider_all_requests_local
の値が採用されている事がある
- エラーページの表示は
ActionDispatch::ShowExceptions
ミドルウェアが担当。config.action_dispatch.show_exceptions
が true であればexceptions_app
を呼び出し、そのレスポンスをエラーページとして採用する。 exceptions_app
はデフォルトでActionDispatch::PublicExceptions
が利用されるRails::Application#default_middleware_stack
でRails::Application#show_exceptions_app
が呼ばれていて、そこではconfig.exceptions_app
がなければPublicExceptions
を作成して返しているexceptions_app
は rack env で例外オブジェクト、また PATH_INFO でExceptionWrapper
の返してきたステータスコードが渡される (例:/404
,/200
)
こんがらがったのは下記。
config.action_dispatch.show_exceptions
は例外ページを表示するのではなく Rails が例外のハンドリングをするかのフラグである- これが標準では test environment で無効になっているので、controller テストとかでは、例えば RecordNotFound エラーはテストコードまで届く
config.consider_all_requests_local
が例外ページを表示するかを指示する
(つか Configuring Rails Applications — Ruby on Rails Guides に書いてあるんだから読めという話ではあった… middleware の話も書いてあったとは…)