package Ġcom . neo 4 j . gradle . wordpress Ċ Ċ import Ġcom . be ust . kl ax on . JsonArray Ċ import Ġcom . be ust . kl ax on . Kl ax on Ċ import Ġcom . be ust . kl ax on . Kl ax on Exception Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . MediaType . Companion . to MediaType Ċ import Ġokhttp 3 . RequestBody . Companion . to RequestBody Ċ import Ġorg . gradle . api . logging . Logger ĊĊ Ċ class ĠWordPress HttpClient ( val Ġconnection Info : ĠWordPress Connection Info , Ġprivate Ġval Ġlogger : ĠLogger ) Ġ{ ĊĊĠ Ġprivate Ġval Ġjson MediaType Ġ= Ġ" application / json ; Ġcharset = utf - 8 ". to MediaType () ĊĠ Ġprivate Ġval Ġunderlying HttpClient Ġ= ĠhttpClient () ĊĠ Ġprivate Ġval Ġkl ax on Ġ= ĠK l ax on () ĊĊĠ Ġfun ĠbaseUrl Builder (): ĠHttp Url . Builder Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠHttp Url . Builder () ĊĠĠĠĠĠ Ġ. scheme ( connection Info . scheme ) ĊĠĠĠĠĠ Ġ. host ( connection Info . host ) ĊĠĠĠ Ġif Ġ( connection Info . port Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġbuilder . port ( connection Info . port ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbuilder ĊĠĠĠĠĠ Ġ. add Path Segment (" wp - json ") ĊĠĠĠĠĠ Ġ. add Path Segment (" wp ") ĊĠĠĠĠĠ Ġ. add Path Segment (" v 2 ") ĊĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠExecute Ġa Ġrequest Ġthat Ġreturns ĠJSON . ĊĠĠ Ġ*/ ĊĠ Ġfun Ġ< T > Ġexecute Request ( request : ĠRequest , Ġmapper : Ġ( ResponseBody ) Ġ-> ĠT ): ĠT ? Ġ{ ĊĠĠĠ Ġunderlying HttpClient . new Call ( request ). execute (). use Ġ{ ĊĠĠĠĠĠ Ġif Ġ( it . is Successful ) Ġ{ ĊĠĠĠĠĠĠĠ Ġit . body . use Ġ{ Ġresponse Body Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Body Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġresponse Body . contentType () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contentType Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contentType . type Ġ== Ġ" application " Ġ&& ĠcontentType . subtype Ġ== Ġ" json ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmapper ( response Body ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠK l ax on Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Unable Ġto Ġparse Ġthe Ġresponse ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Content - Type Ġmust Ġbe Ġapplication / json ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Content - Type Ġis Ġundefined ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Response Ġis Ġempty ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . warn (" Request Ġis Ġun successful Ġ- Ġ{ request : Ġ$ request , Ġcode : Ġ${ it . code }, Ġmessage : Ġ${ it . message }, Ġresponse : Ġ${ it . body ?. string ()}} ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġfun Ġ< T > Ġget Recursive Objects ( page : ĠInt Ġ= Ġ 1 , Ġacc : ĠList < T > Ġ= Ġempty List (), ĠbaseUrl : ĠHttp Url , Ġmapper : Ġ( response : ĠJson Array <* >) Ġ-> ĠList < T >): ĠList < T > Ġ{ ĊĠĠĠ Ġval Ġsearch Url Ġ= ĠbaseUrl ĊĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠ Ġ. add QueryParameter (" page ", Ġpage . toString ()) ĊĠĠĠĠĠ Ġ. add QueryParameter (" per _ page ", Ġ" 1 0 0 ") ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġval Ġcredential Ġ= ĠCredentials . basic ( connection Info . username , Ġconnection Info . password ) ĊĠĠĠ Ġval Ġsearch Request Ġ= ĠRequest . Builder () ĊĠĠĠĠĠ Ġ. url ( search Url ) ĊĠĠĠĠĠ Ġ// Ġforce Ġthe Ġheader Ġbecause ĠWordPress Ġreturns Ġa Ġ 4 0 0 Ġinstead Ġof Ġa Ġ 4 0 1 Ġwhen Ġthe Ġauthentication Ġfails ... ĊĠĠĠĠĠ Ġ. header (" Authorization ", Ġcredential ) ĊĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġval Ġpag inated Result Ġ= Ġunderlying HttpClient . new Call ( search Request ). execute (). use Ġ{ Ġresponse Ġ-> ĊĠĠĠĠĠ Ġval Ġtotal Pages Ġ= Ġresponse . header (" X - WP - Total Pages ", Ġ" 1 ") ?. toInt () Ġ?: Ġ 1 ĊĠĠĠĠĠ Ġval Ġhas Next Ġ= Ġtotal Pages Ġ> Ġpage ĊĠĠĠĠĠ Ġresponse . body . use Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPag inated Result ( mapper ( kl ax on . parse JsonArray ( it . char Stream ())), Ġhas Next ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠPag inated Result ( emptyList (), Ġhas Next ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġif Ġ( pag inated Result . hasNext ) Ġ{ ĊĠĠĠĠĠ Ġget Recursive Objects ( page Ġ+ Ġ 1 , Ġacc Ġ+ Ġpag inated Result . result , ĠbaseUrl , Ġmapper Ġ= Ġmapper ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġacc Ġ+ Ġpag inated Result . result ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġbuild GetRequest ( url : ĠHttp Url ): ĠRequest Ġ{ ĊĠĠĠ Ġval Ġcredential Ġ= ĠCredentials . basic ( connection Info . username , Ġconnection Info . password ) ĊĠĠĠ Ġreturn ĠRequest . Builder () ĊĠĠĠĠĠ Ġ. url ( url ) ĊĠĠĠĠĠ Ġ// Ġforce Ġthe Ġheader Ġbecause ĠWordPress Ġreturns Ġa Ġ 4 0 0 Ġinstead Ġof Ġa Ġ 4 0 1 Ġwhen Ġthe Ġauthentication Ġfails ... ĊĠĠĠĠĠ Ġ. header (" Authorization ", Ġcredential ) ĊĠĠĠĠĠ Ġ. get () ĊĠĠĠĠĠ Ġ. build () ĊĠ Ġ} ĊĊĠ Ġfun Ġbuild Post Request ( url : ĠHttp Url , Ġdata : ĠMutable Map < String , ĠAny >): ĠRequest Ġ{ ĊĠĠĠ Ġreturn ĠRequest . Builder () ĊĠĠĠĠĠ Ġ. url ( url ) ĊĠĠĠĠĠ Ġ. post ( kl ax on . toJson String ( data ). to RequestBody ( json MediaType )) ĊĠĠĠĠĠ Ġ. build () ĊĠ Ġ} ĊĊĠ Ġfun Ġparse JsonObject ( response Body : ĠResponse Body ) Ġ= Ġkl ax on . parse JsonObject ( response Body . char Stream ()) ĊĊĠ Ġfun Ġparse JsonArray ( response Body : ĠResponse Body ) Ġ= Ġkl ax on . parse JsonArray ( response Body . char Stream ()) ĊĊĠ Ġprivate Ġfun ĠhttpClient (): ĠOk HttpClient Ġ{ ĊĠĠĠ Ġval Ġclient Ġ= ĠOk HttpClient . Builder () ĊĠĠĠĠĠ Ġ. auth enticator ( object Ġ: ĠAuth enticator Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġauthenticate ( route : ĠRoute ?, Ġresponse : ĠResponse ): ĠRequest ? Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġif Ġ( response Count ( response ) Ġ>= Ġ 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull Ġ// Ġunable Ġto Ġauthenticate Ġfor Ġthe Ġthird Ġtime , Ġwe Ġgive Ġup ... ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcredential Ġ= ĠCredentials . basic ( connection Info . username , Ġconnection Info . password ) ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse . request . newBuilder (). header (" Authorization ", Ġcredential ). build () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġ. connect Timeout ( connection Info . connect Timeout ) ĊĠĠĠĠĠ Ġ. write Timeout ( connection Info . write Timeout ) ĊĠĠĠĠĠ Ġ. read Timeout ( connection Info . read Timeout ) ĊĠĠĠ Ġreturn Ġclient . build () ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġresponse Count ( response : ĠResponse ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġcount Ġ= Ġ 1 ĊĠĠĠ Ġvar Ġres Ġ= Ġresponse . prior Response ĊĠĠĠ Ġwhile Ġ( res Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcount ++ ĊĠĠĠĠĠ Ġres Ġ= Ġres . prior Response ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġcount ĊĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠPag inated Result < T >( val Ġresult : ĠList < T >, Ġval Ġhas Next : ĠBoolean ) Ċ