普段はあんまり OAuth2::Client を直接操作することはないんですが。
ちょっと必要があって辿ったので、そのメモ。
やりたいこと
Net::HTTP レベルでの例外と、5XX系レスポンスについては、リトライしたい。
⇒ 5XX レスポンスを捕捉したい。
raise_error オプション
OAuth2::Client の初期化オプションで raise_error を渡せる。
この辺りとか見てください。
# @option opts [Boolean] :raise_errors (true) whether or not to raise an OAuth2::Error
そういうこと。
OAuth2::Client#request
この辺りね。
OAuth2::Client#request 呼び出しの時にも raise_error オプションを渡せる。
#request にオプションを渡さなければ、初期化時の値が使われる。
OAuth2::Client#request 内では OAuth2::Client#connection を経由して Faraday#run_request を呼び出す。
そのレスポンスは OAuth2::Response でラッピングされる。
さて、レスポンスのステータスが 301, 302, 303, 307 の場合は、リダイレクトを辿ってくれる。
それ以外の 2XX, 30XX ステータスは、何もせずに OAuth2::Response を返す。
4XX, 5XX ステータスの時には、先ほどの raise_error が true であれば OAuth2::Error 例外を返す。
false なら例外にはならない。
OAuth2::Response#error に Oauth2::Error をセットした上で、そのレスポンスを返す。
ちなみに、それ以外のステータスの時は raise_error の値に関わらず、必ず OAuth2::Error になる。
OAuth2::Error
StandardError を継承している。
message には OAuth2::Response#body が渡される。
OAuth2::Error#response で OAuth2::Response が取得できる。
なので、一旦 OAuth2::Error で rescue した後にレスポンスの内容で分岐などは可能。
結論: 特定のステータス時のみリトライしたい場合
raise_error を true (デフォルト) にしておいて rescue で OAuth2::Error を捕捉、 rescue の中でステータスコードを見て retry or 再度例外発生。
が良いかなー。