diary.sorah.jp

さんがつにじゅうににち: kosenconf-080tokyo

高専カンファレンス 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_exceptionsconfig.consider_all_requests_local の値が採用されている事がある
  • エラーページの表示は ActionDispatch::ShowExceptions ミドルウェアが担当。 config.action_dispatch.show_exceptions が true であれば exceptions_app を呼び出し、そのレスポンスをエラーページとして採用する。
  • exceptions_app はデフォルトで ActionDispatch::PublicExceptions が利用される
    • Rails::Application#default_middleware_stackRails::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 の話も書いてあったとは…)

Backfilled at , Published at