snaperro は request ごとに route と fingerprint を決定し、現在の mode に従って proxy、record、mock を組み合わせます。mode の切り替えは revision 付き command として全 client に同期されます。
各 request は受付時に一度だけ catalog を読み、その時点の mode と選択中 scenario を処理完了まで固定します。処理中に管理画面から mode や scenario が変更されても、一つの request が新旧状態を混在させることはありません。
| mode | upstream へ接続 | recording を参照 | response を保存 |
|---|---|---|---|
proxy |
常に | しない | しない |
record |
常に | しない | 選択中 scenario へ保存 |
mock |
miss 時は fallback に従う | 選択中 scenario | proxy&record fallback のときだけ保存 |
smart |
miss 時だけ | 選択中 scenario | miss response を保存 |
すべての matching route を upstream へ転送し、返ってきた status、header、body を client へ流します。store を読み書きしないため scenario の選択は不要です。
すべての matching route を upstream へ転送しながら response を選択中 scenario へ記録します。同じ request fingerprint がすでに存在する場合は、その scenario の recording を更新します。
scenario が選択されていない場合は記録先を推測せず失敗します。
選択中 scenario から fingerprint が一致する recording を探し、保存済み status、header、body を返します。見つからない場合は mock.fallback に従います。
404: not found を返すproxy: upstream response をそのまま返すproxy&record: upstream response を返し、選択中 scenario へ記録する
一致する recording があれば mock response を返します。見つからなければ upstream へ転送して response を記録します。通常利用では、既存 fixture を維持しながら未記録 request だけを補う mode です。
fingerprint は次の情報から決まります。
- HTTP method
- 設定で一致した route pattern
- path parameter
- key/value を正規化した query parameter
- request body の内容
host や表示用 filename では識別しません。同じ意味の query を安定して照合し、body が異なる request は別 recording として扱います。
request body が recording.maxRequestBodyBytes を超える場合、無制限に memory を消費して fingerprint を作りません。記録できない理由を typed error と request log に残します。
proxy と record の response は upstream から client へ chunk 単位で流します。record 時は同じ stream を blob writer にも渡し、backpressure を維持します。
blob書き込みやrecording commitだけが失敗した場合も、すでに得たupstream responseのstatus・header・bodyはclientへ最後まで返します。request logでは通信結果と保存結果を分け、保存失敗をrecording.outcomeとして通知します。不完全なrecordingはcatalogへ公開しません。
client 切断後の動作は recording.completeOnClientDisconnect で選びます。true は記録を完成させ、false は upstream と stage 中の保存を中止します。どちらの場合も、不完全な recording を catalog へ公開しません。