高専カンファレンス 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 の話も書いてあったとは…)