package Ġcom . dc . ret ro api . interceptor Ċ Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġok io . Buffer Ċ import Ġjava . io . IOException Ċ import Ġjava . util . regex . Pattern Ċ Ċ class ĠRequest Interceptor ( private Ġval Ġon Request Interceptor : ĠOn Request Interceptor ) Ġ: ĠInter ceptor Ġ{ ĊĊĠĠĠ Ġinterface ĠOn Request Interceptor Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġprovide Body Map (): ĠHashMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġfun Ġprovide Header Map (): ĠHashMap < String , ĠString > ĊĠĠĠĠĠĠĠ Ġfun Ġremove From Body (): ĠArrayList < String > ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġrequest Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġrequest . method ĊĠĠĠĠĠĠĠ Ġval Ġbody Map Ġ= Ġon Request Interceptor . provide Body Map () ĊĠĠĠĠĠĠĠ Ġval Ġlist Exclude Field Ġ= Ġon Request Interceptor . remove From Body () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( method Ġ== Ġ" GET ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf ĠRequest Ġmethod Ġis ĠGET ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfull Url Ġ= Ġrequest . url ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Names Ġ= Ġfull Url . query Parameter Names ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Iterator Ġ= Ġparameter Names . iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġurl RequestBuilder Ġ= Ġrequest . url . newBuilder () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( parameter Iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġparameter Iterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalues Ġ= Ġfull Url . query Parameter Values ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġfull Url . query Parameter Values ( key )[ values . last Index ] // If Ġquery Ġhas Ġmultiple Ġvalue Ġthen Ġdev Ġneeds Ġto Ġsend Ġin Ġother Ġform ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl RequestBuilder . removeAll Query Parameters ( key ) Ġ// Ġremove Ġalready Ġquery Ġparameter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list Exclude Field . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl RequestBuilder . add QueryParameter ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody Map . as Iterable (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl RequestBuilder . add QueryParameter ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest . newBuilder (). get (). url ( url RequestBuilder . build ()). build () ĊĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf ĠRequest Ġmethod Ġis ĠPOST Ġ/ ĠDELETE Ġ/ Ġ ĠPUT Ġ/ ĠP ATCH Ġ.. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġrequest . body ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Body Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġnew Body : ĠRequest Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . body Ġis ĠForm Body Ġ-> Ġ{ Ġ// Ġif Ġrequest Ġbody Ġis ĠFORM ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠB ODY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġform Body Ġ= Ġrequest . body Ġas ĠForm Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsize Ġ= Ġform Body . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Body Builder Ġ= ĠForm Body . Builder () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġsize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġform Body . name ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġform Body . value ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list Exclude Field . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . add ( key , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Map . as Iterable (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . add ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Ġ= Ġnew Body Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . body Ġis ĠMultip art Body Ġ-> Ġ{ Ġ// if Ġrequest Ġbody Ġis ĠMULTI PART ĠB ODY ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġform Body Ġ= Ġrequest . body Ġas ĠMultip art Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart List Ġ= Ġform Body . parts ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Body Builder Ġ= ĠMultip art Body . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . setType ( Multipart Body . FORM ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpart List ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i . body . contentType ()?. type ?. equals (" text ") !! ) Ġ{ Ġ// " text ", Ġ" image ", Ġ" audio ", Ġ" video " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkey Ġ= ĠgetKey From Content Disposition ( i . headers ?. get (" Content - Disposition ") !! ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġbody ToString ( i . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! list Exclude Field . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . add Part ( Multipart Body . Part . create FormData ( key , Ġnull , Ġvalue . to RequestBody ((" text / plain "). to MediaType ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . add Part ( i . headers , Ġi . body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Map . as Iterable (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . add Part ( Multipart Body . Part . create FormData ( it . key , Ġnull , Ġit . value . to RequestBody ((" text / plain "). to MediaType ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Ġ= Ġnew Body Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . body Ġis ĠRequest Body Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Ġ= Ġrequest Body ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Body Builder Ġ= ĠForm Body . Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbody Map . as Iterable (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Builder . add ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Body Ġ= Ġnew Body Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Check Ġwhat Ġmethod Ġtype Ġuser Ġrequested Ġand Ġpass Ġparameters Ġto Ġrespective Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġrequest Builder : ĠRequest . Builder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Builder Ġ= Ġwhen Ġ( request . method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" POST " Ġ-> Ġrequest . newBuilder (). post ( new Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PUT " Ġ-> Ġrequest . newBuilder (). put ( new Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" PATCH " Ġ-> Ġrequest . newBuilder (). patch ( new Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" DELETE " Ġ-> Ġrequest . newBuilder (). delete ( new Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġrequest . newBuilder (). post ( new Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest Builder . build () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġheader Map Ġ= Ġon Request Interceptor . provide Header Map () ĊĠĠĠĠĠĠĠ Ġval Ġrequest Builder Ġ= Ġrequest . newBuilder () ĊĠĠĠĠĠĠĠ Ġheader Map . as Iterable (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Builder . add Header ( it . key , Ġit . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrequest Ġ= Ġrequest Builder . build () ĊĊĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( request ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun ĠgetKey From Content Disposition ( value : ĠString ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpat Ġ= ĠPattern . compile (" (? <= name =\ ") \\ w +") ĊĠĠĠĠĠĠĠ Ġval Ġmat Ġ= Ġpat . matcher ( value ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( mat . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( mat . group ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbody ToString ( request : ĠRequest Body ?): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠBuffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . writeTo ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġbuffer . read Utf 8 () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ