LoginSignup
2
2

More than 5 years have passed since last update.

OAuth2::Client#request と raise_error について

Posted at

普段はあんまり 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#responseOAuth2::Response が取得できる。
なので、一旦 OAuth2::Error で rescue した後にレスポンスの内容で分岐などは可能。

結論: 特定のステータス時のみリトライしたい場合

raise_error を true (デフォルト) にしておいて rescue で OAuth2::Error を捕捉、 rescue の中でステータスコードを見て retry or 再度例外発生。
が良いかなー。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2