package Ġcom . bad oo . k ex as ol . stream Ċ Ċ import Ġcom . bad oo . k ex as ol . Ex a Connection Options Ċ import Ġcom . bad oo . k ex as ol . enum . Ex a Encryption Mode Ċ import Ġcom . bad oo . k ex as ol . net . Ex a Node Address Ċ import Ġcom . bad oo . k ex as ol . net . Ex a Self Signed Ssl Socket Factory Ċ import Ġok io .* Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Protocol Exception Ċ import Ġjava . net . Socket Ċ import Ġjava . net . Socket TimeoutException Ċ import Ġjava . util . concurrent . locks . Re entrant Lock Ċ import Ġjavax . net . ssl . SSL Exception Ċ import Ġjavax . net . ssl . SS LS ocket Ċ import Ġkotlin . concurrent . with Lock Ċ Ċ internal Ġclass ĠEx a Stream Http Thread ( ĊĠĠĠ Ġprivate Ġval Ġoptions : ĠEx a Connection Options , ĊĠĠĠ Ġprivate Ġval Ġnode Address : ĠEx a Node Address Ċ ) Ġ: ĠThread () Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġsocket Ġ= ĠSocket (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . connect ( node Address , Ġoptions . connection Timeout . toInt () Ġ* Ġ 1 0 0 0 ) ĊĠĠĠĠĠĠĠ Ġthis . so Timeout Ġ= Ġoptions . socket Timeout . toInt () Ġ* Ġ 1 0 0 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġsocket Input Buffer : ĠBuffered Source Ġ= Ġsocket . source (). buffer () ĊĠĠĠ Ġprivate Ġvar Ġsocket Output Buffer : ĠBuffered Sink Ġ= Ġsocket . sink (). buffer () ĊĊĠĠĠ Ġprivate Ġval Ġdata Pipe Ġ= ĠPipe ( 1 0 2 4 L Ġ* Ġ 1 0 2 4 L ) Ġ// Ġ 1 Mb ĊĊĠĠĠ Ġval Ġdata Sink Buffer Ġ= Ġdata Pipe . sink . buffer () ĊĠĠĠ Ġval ĠdataSource Buffer Ġ= Ġdata Pipe . source . buffer () ĊĊĠĠĠ Ġval Ġinternal Address : ĠEx a Stream Internal Address ĊĠĠĠ Ġvar Ġlast Exception : ĠException ? Ġ= Ġnull ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġinternal Address Ġ= Ġrequest Internal Address () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Internal Address (): ĠEx a Stream Internal Address Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSend Ġspecial Ġpacket Ġto Ġestablish Ġproxy Ġconnection Ġfor ĠHTTP Ġtransport ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . writeInt Le ( 0 x 0 2 2 1 2 1 0 2 ) ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . writeInt Le ( 1 ) ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . writeInt Le ( 1 ) ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . flush () ĊĊĠĠĠĠĠĠĠ Ġ// ĠSkip Ġthe Ġfirst Ġint Ġin Ġresponse Ġ( protocol Ġversion ?) ĊĠĠĠĠĠĠĠ Ġsocket Input Buffer . skip ( 4 ) ĊĊĠĠĠĠĠĠĠ Ġ// ĠSecond Ġint Ġis Ġa Ġport Ġnumber ĊĠĠĠĠĠĠĠ Ġval Ġport Ġ= Ġsocket Input Buffer . readInt Le () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFollowing Ġ 1 6 Ġbytes Ġrepresent ĠEx as ol Ġinternal ĠIPv 4 Ġaddress ĊĠĠĠĠĠĠĠ Ġval Ġip Address Ġ= Ġsocket Input Buffer . read Utf 8 ( 1 6 ). trim () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠEx a Stream Internal Address ( Inet Address . get ByName ( ipAddress ), Ġport ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Inner () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exc : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlast Exception Ġ= Ġexc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata Pipe . cancel () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrun Inner () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠWait Ġfor Ġincoming ĠHTTP Ġrequest Ġinitiated Ġby ĠEx as ol ĊĠĠĠĠĠĠĠ Ġ// ĠAllow Ġother Ġthreads Ġto Ġinterrupt Ġthis Ġwait ĊĠĠĠĠĠĠĠ ĠwaitFor Incoming Data () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( options . encryption Ġ!= ĠEx a Encryption Mode . DISABLED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Ssl Socket () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġsocket Input Buffer . read Utf 8 Line () !!. split (" Ġ" )[ 0 ] ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( socket Input Buffer . read Utf 8 Line () Ġ!= Ġ"") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġskip Ġall Ġother Ġheaders ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ( method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" PUT " Ġ-> Ġhandle Put () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" GET " Ġ-> Ġhandle Get () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠProtocol Exception (" Unexpected ĠHTTP Ġmethod ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġjoin With Exception () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . join () ĊĊĠĠĠĠĠĠĠ Ġlast Exception ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠwaitFor Incoming Data () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket . so Timeout Ġ= Ġ 2 0 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Input Buffer . request ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsocket . so Timeout Ġ= Ġoptions . socket Timeout . toInt () Ġ* Ġ 1 0 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠSocket TimeoutException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Ssl Socket () Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġserver ĠSSL Socket Ġwith Ġself - signed Ġcertificate Ġcreated Ġon Ġthe Ġfly ĊĠĠĠĠĠĠĠ Ġsocket Ġ= Ġ( Ex a Self Signed Ssl Socket Factory ( options ). wrap Socket ( socket , Ġsocket Input Buffer . inputStream ())). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Input Buffer Ġ= Ġthis . source (). buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsocket Output Buffer Ġ= Ġthis . sink (). buffer () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . start Handshake () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Put () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġwrapped Input Buffer Ġ= Ġwhen Ġ( options . compression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠG zip Source ( Ex a Stream Chunk ed Source ( socket Input Buffer )). buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> ĠEx a Stream Chunk ed Source ( socket Input Buffer ). buffer () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrapped Input Buffer . read All ( data Sink Buffer ) ĊĠĠĠĠĠĠĠ Ġdata Sink Buffer . close () ĊĊĠĠĠĠĠĠĠ Ġsend Headers () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Get () Ġ{ ĊĠĠĠĠĠĠĠ Ġsend Headers () ĊĊĠĠĠĠĠĠĠ Ġval Ġwrapped Output Buffer Ġ= Ġwhen Ġ( options . compression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue Ġ-> ĠG zip Sink ( socket Output Buffer ). buffer () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġsocket Output Buffer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrapped Output Buffer . write All ( dataSource Buffer ) ĊĠĠĠĠĠĠĠ Ġwrapped Output Buffer . flush () ĊĊĠĠĠĠĠĠĠ ĠdataSource Buffer . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsend Headers () Ġ{ ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . write Utf 8 (" HTTP / 1 . 1 Ġ 2 0 0 ĠOK \ r \ n ") ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . write Utf 8 (" Connection : Ġclose \ r \ n ") ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . write Utf 8 ("\ r \ n ") ĊĠĠĠĠĠĠĠ Ġsocket Output Buffer . flush () ĊĠĠĠ Ġ} Ċ } Ċ