Service
はまずリクエストをsalvoのResponse
に変換し、その後ルーティングマッチング段階に入ります。
ルーティングマッチングは追加順序に従い、外から内へ、上から下へ順にフィルターを実行します。いずれかのフィルターが失敗すると、マッチング失敗と見なされます。
マッチング過程では、リクエストのパス情報が存在します。マッチングが進むにつれ、パスフィルターがマッチングに成功すると、そのマッチしたパス部分が消費されます。全てのパスが消費され、かつマッチングチェーン上でフィルターのマッチング失敗がなく、現在のチェーンの最後のRouter
にgoal
のHandler
が存在する場合、マッチング成功となり、マッチング段階が終了します。マッチングチェーン上の全てのHandler
を収集し、実行段階に進みます。
パスが消費し尽くされていない状態で、チェーン上のフィルターがエラーを起こさず、かつ続けてマッチング可能な子ルートがなくなった場合、現在のチェーンはマッチング失敗と見なし、次のルートマッチングに進みます。
全てのルートのマッチングが終了し、成功しなかった場合、エラーキャプチャ段階に入ります。
マッチング段階で収集されたHandler
リストに従い、順次Handler
を実行します。実行過程で、前段のミドルウェアはctrl::call_next()
を呼び出して後続のミドルウェアを先に実行させ、その後自身のロジックを実行できます。実行過程でステータスコードエラーやリダイレクトが発生した場合、後続のHandler
は実行されません。この時、ステータスコードがエラーかつResponse
のBody
が未設定またはResBody::Error
の場合、エラーキャプチャ段階に入ります。そうでない場合はキャプチャ段階をスキップします。
Catcher
はエラー処理を行うための型で、ミドルウェア(hoops)を追加することもできます。エラーはCatcher
内の全てのHandler
を順次通過します。あるHandler
がエラーを処理し、後続のHandler
の実行を継続したくない場合、ctrl.skip_rest()
を呼び出して後続のHandler
をスキップし、直接キャプチャ段階を終了させることができます。
Catcher
はデフォルトで、デフォルトエラー処理として機能する1つのHandler
を含む必要があります。デフォルトはDeaultGoal
ですが、完全に独自のHandler
をエラー処理のデフォルト実装としてカスタマイズすることも可能です。これはリクエストヘッダーで要求されるcontent-type
に応じて対応する形式のエラーメッセージを表示し、json
、xml
、text
、html
の4つの表示形式をサポートしています。DeaultGoal
はまたいくつかの表示設定を提供しており、例えばデフォルトではhtml形式表示時にsalvo関連リンクを表示しますが、DefaultGoal::footer
またはDefaultGoal::with_footer
を呼び出して独自のカスタムフッターに設定することもできます。
Service
はsalvoのResponse
をhyperのResponse
型に変換し、最終的にブラウザなどのクライアントに返されます。
これはSalvo WebフレームワークがHTTPリクエストを処理するライフサイクルの視覚的表現と説明です。