普段はあんまり 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 再度例外発生。
が良いかなー。