package Ġg q . kir man ak . meal ient . data . network Ċ Ċ import Ġg q . kir man ak . meal ient . data . auth . Auth Repo Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġokhttp 3 . Interceptor Ċ import Ġokhttp 3 . Response Ċ import Ġjavax . inject . Inject Ċ import Ġjavax . inject . Singleton Ċ Ċ @ Singleton Ċ class ĠAuthentication Interceptor Ġ@ Inject Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġauth Repo : ĠAuth Repo , Ċ ) Ġ: ĠInter ceptor Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġauth Header : ĠString ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġrun Blocking Ġ{ Ġauth Repo . get Auth Header () Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Header Ġ= Ġauth Header Ġ?: Ġreturn Ġchain . proceed ( chain . request ()) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Ġ= Ġproceed With Auth Header ( chain , Ġcurrent Header ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( listOf ( 4 0 1 , Ġ 4 0 3 ). contains ( response . code )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġauth Repo . invalidate Auth Header () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġagain Ġwith Ġnew Ġauth Ġheader Ġ( if Ġany ) Ġor Ġreturn Ġprevious Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Header ?. let Ġ{ Ġproceed With Auth Header ( chain , Ġit ) Ġ} Ġ?: Ġresponse ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġproceed With Auth Header ( ĊĠĠĠĠĠĠĠ Ġchain : ĠInter ceptor . Chain , ĊĠĠĠĠĠĠĠ Ġauth Header : ĠString , ĊĠĠĠ Ġ) Ġ= Ġchain . proceed ( ĊĠĠĠĠĠĠĠ Ġchain . request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. header ( HEADER _ NAME , Ġauth Header ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠHEADER _ NAME Ġ= Ġ" Authorization " ĊĠĠĠ Ġ} Ċ }