/* Ċ Ġ* Ġ ĠCopyright Ġ 2 0 1 8 ĠJul ian ĠEx en ber ger Ċ Ġ* Ċ Ġ* Ġ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* Ġ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* ĠĠĠ Ġ` * ĠĠ Ġ`[ ` http :// www . apache . org / licenses / LICENSE - 2 . 0 `]( http :// www . apache . org / licenses / LICENSE - 2 . 0 ) Ċ Ġ* Ċ Ġ* Ġ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* Ġ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* Ġ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġ Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġio . code stream . util . rest Ċ Ċ import Ġjava . io . File Ċ import Ġjava . io . IOException Ċ import Ġjava . net .* Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . security . Secure Random Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . util .* Ċ import Ġjavax . net . ssl . Hostname Verifier Ċ import Ġjavax . net . ssl . Https URLConnection Ċ import Ġjavax . net . ssl . SSL Context Ċ import Ġjavax . net . ssl . X 5 0 9 Trust Manager Ċ Ċ class ĠRequest ( val Ġuri : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType : ĠString Ġ= Ġ" application / json ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidate SSL : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalidate HostName : ĠBoolean Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoding : ĠString Ġ= Ġ" UTF - 8 ") Ġ{ ĊĊĠĠĠ Ġconstructor ( url : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate SSL : ĠBoolean , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalidate HostName : ĠBoolean ) Ġ: Ġthis ( url Ġ+ Ġ"/" Ġ+ Ġpath , ĠcontentType , Ġvalidate SSL , Ġvalidate HostName ) ĊĊĊĠĠĠ Ġprivate Ġval Ġheaders Ġ= Ġmutable Map Of < String , ĠString >() ĊĠĠĠ Ġprivate Ġvar Ġbody : ĠString Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġval Ġquery Parms Ġ= Ġmutable ListOf < Pair < String , ĠString >>() ĊĠĠĠ Ġprivate Ġvar Ġproxy : ĠProxy ? ĊĠĠĠ Ġprivate Ġvar ĠoutputFile : ĠFile ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġattachments : ĠMutable List < Multipart > Ġ= Ġmutable ListOf () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġproxy Ġ= ĠConfig ured Http Proxy . global Proxy Configured ?. to Proxy () ĊĠĠĠĠĠĠĠ Ġif Ġ( proxy Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . setProperty (" java . net . use System Prox ies ", Ġ" true ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiterator Ġ= ĠProxy Selector . getDefault (). select ( URI (" http :// www . test . com / ")). iterator () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( iterator . hasNext ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Ġ= Ġiterator . next () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġproxy ( server : ĠString , Ġport : ĠInt Ġ= Ġ 8 0 8 0 , Ġuser : ĠString ? Ġ= Ġnull , Ġpassword : ĠString ? Ġ= Ġnull ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġproxy Ġ= ĠConfig ured Http Proxy ( server , Ġport , Ġuser , Ġpassword ). to Proxy () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġattachment ( file : ĠFile , ĠcontentType : ĠString Ġ= ĠMultip art . contentType FromFile ( file ), Ġencoding : ĠString Ġ= Ġ" UTF - 8 "): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġattachments Ġ+= ĠMultip art ( file , ĠcontentType , Ġencoding ) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġproxy ( proxy Configured : ĠConfig ured Http Proxy ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . proxy Ġ= Ġproxy Configured . to Proxy () ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠoutputFile ( outputFile : ĠFile ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . outputFile Ġ= ĠoutputFile ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġheaders ( var arg Ġpar ms : ĠPair < String , ĠString >): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( parm Ġin Ġpar ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( parm . first , Ġpar m . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġheader ( name : ĠString , Ġvalue : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġheaders [ name ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpar ms ( var arg Ġpar ms : ĠPair < String , ĠString >): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( parm Ġin Ġpar ms ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġquery Parms . add ( parm ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpar m ( name : ĠString , Ġvalue : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġquery Parms . add ( Pair ( name , Ġvalue )) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbody ( content : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġbody Ġ= Ġcontent ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbody ( content : Ġ() Ġ-> ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġbody ( content ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġpost (): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Request ( uri , Ġ" POST ", Ġ{ Ġbody Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġput (): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Request ( uri , Ġ" PUT ", Ġ{ Ġbody Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdelete (): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Request ( uri , Ġ" DELETE ", Ġ{ Ġbody Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget (): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdo Request ( uri , Ġ" GET ", Ġ{ Ġnull Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Attachments ( conn : ĠHttp URLConnection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġid Ġ= ĠMultip art . getId () ĊĠĠĠĠĠĠĠ Ġconn . setRequest Property (" Content - Type ", Ġ" multipart / form - data ; Ġboundary =$ id ") ĊĠĠĠĠĠĠĠ ĠMultip art . write ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream Ġ= Ġconn . output Stream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencoding Ġ= Ġthis . encoding , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparts Ġ= Ġattachments . to Typed Array (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġid ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Body ( body : Ġ() Ġ-> ĠString ?, Ġconn : ĠHttp URLConnection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbody Str Ġ= Ġbody () ĊĠĠĠĠĠĠĠ Ġif Ġ( body Str Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . output Stream . write ( body Str . toByteArray ( Charset . forName ( encoding ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdo Request ( uri : ĠString , Ġverb : ĠString , Ġbody : Ġ() Ġ-> ĠString ?): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= ĠURL ( uri ) ĊĠĠĠĠĠĠĠ Ġval Ġconn Ġ= Ġ( proxy ?. let Ġ{ Ġurl . open Connection ( proxy ) Ġ} Ġ?: Ġurl . open Connection ()) Ġas ĠHttp URLConnection ĊĊĠĠĠĠĠĠĠ Ġif Ġ( conn Ġis ĠHttp s URLConnection Ġ&& Ġ! validate SSL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsc Ġ= ĠSSL Context . getInstance (" SSL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsc . init ( null , ĠarrayOf ( No Valid ating Trust Manager ), ĠSecure Random ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . ssl Socket Factory Ġ= Ġsc . socket Factory ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( conn Ġis ĠHttp s URLConnection Ġ&& Ġ! validate HostName ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . hostname Verifier Ġ= ĠHost name Verifier Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġconn . do Output Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġconn . setRequest Property (" Content - Type ", ĠcontentType ) ĊĠĠĠĠĠĠĠ Ġheaders . forEach Ġ{ Ġk , Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconn . setRequest Property ( k , Ġv ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconn . request Method Ġ= Ġverb ĊĠĠĠĠĠĠĠ Ġif Ġ( attachments . isNotEmpty () Ġ&& Ġ! " GET ". equals ( verb )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Attachments ( conn ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrite Body ( body , Ġconn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġresponse Code Ġ= Ġconn . response Code ĊĠĠĠĠĠĠĠ Ġval Ġresponse Message : ĠString Ġ= Ġconn . response Message . let Ġ{ Ġit Ġ} Ġ?: Ġ"< EMPTY >" ĊĠĠĠĠĠĠĠ Ġval Ġresponse Headers Ġ= Ġconn . header Fields ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠString Ġ= Ġif Ġ( outputFile Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconn . inputStream . copy To ( outputFile !!. output Stream ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠoutputFile !!. absolute Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġinput Ġ= Ġconn . inputStream . buffered Reader () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinput . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse ( response Code , Ġresponse Message , Ġresult , Ġresponse Headers ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Text Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconn . error Stream . buffered Reader (). read Text () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalStateException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"< unknown >" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠResponse ( response Code , Ġresponse Message , Ġerror Text , Ġresponse Headers ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject ĠNo Valid ating Trust Manager Ġ: ĠX 5 0 9 Trust Manager Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Client Trusted ( p 0 : ĠArray < out ĠX 5 0 9 Certificate > ?, Ġp 1 : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġcheck Server Trusted ( p 0 : ĠArray < out ĠX 5 0 9 Certificate > ?, Ġp 1 : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Accepted Iss u ers (): ĠArray < X 5 0 9 Certificate >? Ġ= Ġempty Array () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbasic Auth ( user : ĠString , Ġpwd : ĠString ): ĠRequest Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠuserName Password Ġ= ĠBase 6 4 . get Encoder (). encode ToString ("$ user :$ pwd ". toByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġheader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Authorization ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Basic Ġ$ userName Password " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ }