package Ġno . nav . f amil ie . http . client Ċ Ċ import Ġno . nav . security . token . support . client . core . http . OAuth 2 HttpRequest Ċ import Ġno . nav . security . token . support . client . core . oauth 2 . OAuth 2 AccessToken Response Ċ import Ġno . nav . security . token . support . client . spring . oauth 2 . Default OAuth 2 HttpClient Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . boot . web . client . Rest Template Builder Ċ import Ġorg . springframework . core . Nested Exception Utils Ċ import Ġorg . springframework . web . client . Http ServerError Exception Ċ import Ġjava . net . Socket Exception Ċ import Ġjava . net . Socket TimeoutException Ċ Ċ class ĠRetry OAuth 2 HttpClient ( rest Template Builder : ĠRest Template Builder , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġmax Retries : ĠInt Ġ= Ġ 2 ) Ġ: ĠDefault OAuth 2 HttpClient ( rest Template Builder ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( java Class ) ĊĠĠĠ Ġprivate Ġval Ġsecure Logger Ġ= ĠLoggerFactory . getLogger (" secure Logger ") ĊĊĠĠĠ Ġprivate Ġval Ġretry Exceptions Ġ= Ġset Of ( Socket Exception :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSocket TimeoutException :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp ServerError Exception . Service Unavailable :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp ServerError Exception . Gateway Timeout :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp ServerError Exception . Bad Gateway :: class ) ĊĊĠĠĠ Ġoverride Ġfun Ġpost ( o Auth 2 HttpRequest : ĠOAuth 2 HttpRequest ): ĠOAuth 2 AccessToken Response Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġretries Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġsuper . post ( o Auth 2 HttpRequest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Exception ( e , Ġretries ++, Ġo Auth 2 HttpRequest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Exception ( e : ĠException , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġretries : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġo Auth 2 HttpRequest : ĠOAuth 2 HttpRequest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( should Retry ( e ) Ġ&& Ġretries Ġ< Ġmax Retries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" K all Ġmot Ġurl =${ o Auth 2 HttpRequest . token Endpoint Url } Ġfe ilet , Ġcause =${ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNested Exception Utils . get Most Specific Cause ( e ):: class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecure Logger . warn (" K all Ġmot Ġurl =${ o Auth 2 HttpRequest . token Endpoint Url } Ġfe ilet Ġmed Ġfe il =${ e . message }") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġshould Retry ( e : ĠException ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġretry Exceptions . contains ( e . cause ?. let Ġ{ Ġit :: class Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ