package Ġorg . jack J ew . biz . engine Ċ Ċ import Ġorg . apache . http . HttpException Ċ import Ġorg . apache . http . Http Host Ċ import Ġorg . apache . http . HttpRequest Ċ import Ġorg . apache . http . HttpRequest Interceptor Ċ import Ġorg . apache . http . NameValuePair Ċ import Ġorg . apache . http . client . config . Request Config Ċ import Ġorg . apache . http . client . entity . Url Encoded Form Entity Ċ import Ġorg . apache . http . client . methods . Closeable HttpResponse Ċ import Ġorg . apache . http . client . methods . HttpGet Ċ import Ġorg . apache . http . client . methods . HttpPost Ċ import Ġorg . apache . http . client . methods . Http Uri Request Ċ import Ġorg . apache . http . conn . Http Host Connect Exception Ċ import Ġorg . apache . http . impl . client . Closeable HttpClient Ċ import Ġorg . apache . http . impl . client . Default HttpRequest Retry Handler Ċ import Ġorg . apache . http . impl . client . HttpClient s Ċ import Ġorg . apache . http . impl . conn . Pooling HttpClient ConnectionManager Ċ import Ġorg . apache . http . message . Basic NameValuePair Ċ import Ġorg . apache . http . protocol . HttpContext Ċ import Ġorg . jack J ew . biz . engine . util . IO Utils Ċ import Ġorg . jack J ew . biz . engine . util . Property Reader Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* Ġhttp Ġadapter Ġ( safe Ġsingleton Ġfor Ġconcurrency Ġusage ), Ġbased Ġon ĠHttpClient Ġ 4 . 4 . 1 Ġlibrary . Ċ Ġ* Ċ Ġ*/ Ċ class ĠHttp Engine Adapter Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġconst Ġval ĠCONFIG _ B IZ _ TYPE Ġ= Ġ" biz Type " ĊĠĠĠ Ġconst Ġval ĠCONFIG _ HEADER _ CHARSET Ġ= Ġ" charset " ĊĠĠĠ Ġconst Ġval ĠCONFIG _ KEY _ PROXY _ HOST Ġ= Ġ" proxy Host " ĊĠĠĠ Ġconst Ġval ĠCONFIG _ KEY _ PROXY _ PORT Ġ= Ġ" proxy Port " ĊĊĠĠĠ Ġprivate Ġconst Ġval Ġmax _ retry _ times Ġ= Ġ 3 ĊĠĠĠ Ġprivate Ġval Ġconnection Manager Ġ= ĠPool ing HttpClient ConnectionManager (). apply Ġ{ ĊĠĠĠĠĠ Ġmax Total Ġ= Ġ 2 0 0 ĊĠĠĠĠĠ Ġdefault Max Per Route Ġ= Ġ 2 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠCONFIG _ KEY _ USER _ AGENT Ġ= Ġ" User - Agent " ĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ USER _ AGENT Ġ= ĠProperty Reader . getProperty ( CONFIG _ KEY _ USER _ AGENT ) !! ĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ TIMEOUT Ġ= Ġ 3 0 0 0 0 ĊĠĠĠ Ġprivate Ġconst Ġval ĠLONG _ TIMEOUT Ġ= Ġ 5 0 0 0 0 ĊĠĠĠ Ġprivate Ġval ĠLONG _ TIME _ B IZ _ TYPES Ġ= ĠProperty Reader . getProperty (" Long - Time - Biz Types ") ?. split (",") Ġ?: ĠlistOf () ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( Http Engine Adapter :: class . java ) !! ĊĠĠĠ Ġval ĠINSTANCE Ġby Ġlazy Ġ{ ĠHttp Engine Adapter () Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġcreate HttpClient ( config : ĠMutable Map < String , ĠString >): ĠClose able HttpClient Ġ{ ĊĠĠĠ Ġval Ġbiz Type Ġ= Ġconfig . remove ( CONFIG _ B IZ _ TYPE ) ĊĠĠĠ Ġval Ġtimeout Ġ= Ġbiz Type ?. let Ġ{ ĊĠĠĠĠĠ Ġif Ġ( LONG _ TIME _ B IZ _ TYPES . contains ( biz Type )) ĠLONG _ TIMEOUT Ġelse ĠDEFAULT _ TIMEOUT ĊĠĠĠ Ġ} Ġ?: ĠDEFAULT _ TIMEOUT ĊĊĠĠĠ Ġval Ġrequest Config Ġ= ĠRequest Config . custom () ĊĠĠĠĠĠĠĠ Ġ. set Socket Timeout ( timeout ) ĊĠĠĠĠĠĠĠ Ġ. setConnection Request Timeout ( timeout ) ĊĠĠĠĠĠĠĠ Ġ. set Connect Timeout ( timeout ) ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġconfig . get Or Put ( CONFIG _ KEY _ USER _ AGENT , Ġ{ ĠDEFAULT _ USER _ AGENT Ġ}) ĊĠĠĠ Ġval Ġhost Ġ= Ġconfig . remove ( CONFIG _ KEY _ PROXY _ HOST ) ĊĠĠĠ Ġval Ġport Ġ= Ġconfig . remove ( CONFIG _ KEY _ PROXY _ PORT ) ĊĊĠĠĠ Ġreturn ĠHttpClient s . custom () ĊĠĠĠĠĠĠĠ Ġ. set ConnectionManager ( connection Manager ) ĊĠĠĠĠĠĠĠ Ġ. set ConnectionManager Shared ( true ) ĊĠĠĠĠĠĠĠ Ġ. add Interceptor First ( Custom HttpRequest Interceptor ( config )) ĊĠĠĠĠĠĠĠ Ġ. setDefault Request Config ( request Config ) ĊĠĠĠĠĠĠĠ Ġ. set Retry Handler ( Default HttpRequest Retry Handler ( 0 , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġ. run Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġhost ?. also Ġ{ Ġset Proxy ( Http Host ( host , Ġport !!. toInt ())) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġbuild () ĊĠĠĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġget ( url : ĠString ) Ġ= Ġget ( url , Ġmap Of (), Ġmap Of ()) ĊĊĠ Ġfun Ġget ( url : ĠString , Ġconfig : ĠMap < String , ĠString >, Ġheaders : ĠMap < String , ĠString >) Ġ= ĊĠĠĠ ĠHttp Get ( url ). run Ġ{ ĊĠĠĠĠĠ Ġheaders . forEach Ġ{ Ġadd Header ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠ Ġdo Process ( config , Ġthis , Ġurl ) ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġpost ( url : ĠString , Ġparams : ĠMap < String , ĠString > ?) Ġ= ĊĠĠĠĠĠ Ġpost ( url , Ġmap Of (), Ġmap Of (), Ġparams Ġ?: Ġmap Of ()) ĊĊĠ Ġfun Ġpost ( url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠ Ġconfig : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠ Ġheaders : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠ Ġparams : ĠMap < String , ĠString >) Ġ= ĊĠĠĠ ĠHttp Post ( url ). run Ġ{ ĊĠĠĠĠĠ Ġheaders . forEach Ġ{ Ġadd Header ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠ Ġentity Ġ= ĠUrl Encoded Form Entity ( array ListOf < NameValuePair >(). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġparams . forEach Ġ{ Ġadd ( Basic NameValuePair ( it . key , Ġit . value )) Ġ} ĊĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠ Ġdo Process ( config , Ġthis , Ġurl ) ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġdo Process ( config : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest : ĠHttp Uri Request , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl : ĠString ): ĠResponse Converter Ġ{ ĊĠĠĠ Ġvar Ġlast Exception : ĠException ? Ġ= Ġnull ĊĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠ Ġwhile Ġ( i Ġ< Ġmax _ retry _ times ) Ġ{ ĊĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate HttpClient ( config . to Mutable Map ()). run Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġexecute ( request ). use Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconvert Response ( it , Ġconfig [ CONFIG _ HEADER _ CHARSET ]) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġlast Exception Ġ= Ġex ĊĠĠĠĠĠĠĠ Ġlog . error ("", Ġex ) ĊĠĠĠĠĠĠĠ Ġif Ġ( i Ġ== Ġmax _ retry _ times Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . info (" Retry Ġfailed .") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . info (" Retry ing Ġrequest .") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( last Exception Ġis ĠHttp Host Connect Exception ) ĊĠĠĠĠĠ Ġthrow Ġlast Exception ĊĠĠĠ Ġthrow ĠHttp Exception (" request Ġfail Ġ$ url ", Ġlast Exception ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġconvert Response ( response : ĠClose able HttpResponse , Ġ_ charset : ĠString ?) Ġ= ĊĠĠĠ ĠResponse Converter (). apply Ġ{ ĊĠĠĠĠĠ Ġcharset Ġ= Ġ_ charset ĊĠĠĠĠĠ ĠstatusCode Ġ= Ġresponse . status Line ?. statusCode Ġ?: Ġ 0 ĊĊĠĠĠĠĠ Ġheaders Ġ= Ġresponse . all Headers ĊĠĠĠĠĠĠĠĠĠ Ġ? . associate Ġ{ ĠPair ( it . name , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ?: Ġmap Of () ĊĊĠĠĠĠĠ Ġbytes Ġ= ĠIO Utils . getBytes ( response . entity . content ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġcustom ĠHttpRequest Interceptor Ċ Ġ* Ċ Ġ* Ġ@ author Ġj ack . zh u Ċ Ġ*/ Ċ private Ġclass ĠCustom HttpRequest Interceptor ( val Ġconfig : ĠMap < String , ĠString >) Ġ: ĠHttpRequest Interceptor Ġ{ ĊĊĠ Ġ@ Throws ( HttpException :: class , ĠIOException :: class ) ĊĠ Ġoverride Ġfun Ġprocess ( request : ĠHttpRequest , Ġcontext : ĠHttp Context ) Ġ{ ĊĠĠĠ Ġconfig . entries . forEach Ġ{ Ġrequest . setHeader ( it . key , Ġit . value ) Ġ} ĊĠ Ġ} Ċ }