/** Ċ Ġ* ĠCopyright Ġ 2 0 2 0 ĠEP AM ĠSystems Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . ep am . drill . interceptor Ċ Ċ import Ġcom . ep am . drill . hook . gen .* Ċ import Ġcom . ep am . drill . hook . io .* Ċ import Ġcom . ep am . drill . hook . io . tcp .* Ċ import Ġkotlinx . atomic fu .* Ċ import Ġkotlinx . c interop .* Ċ import Ġkotlinx . collections . immutable .* Ċ import Ġkotlin . native . concurrent .* Ċ Ċ // TODO ĠEP MD J - 8 6 9 6 ĠMove Ġback Ġto Ġcommon Ġmodule Ċ Ċ actual Ġfun Ġconfigure Http Interceptor 2 () Ġ{ ĊĠĠĠ Ġconfigure Tcp Hooks () ĊĠĠĠ Ġadd Interceptor ( Http 2 Interceptor (). freeze ()) Ċ } Ċ Ċ @ Shared Immutable Ċ private Ġval Ġ_ http 2 Ġ= Ġatomic ( persistent HashMap Of < DR ILL _ SOCKET , ĠStream Pair >()) Ċ private Ġval Ġhttp 2 ĊĠĠĠ Ġget () Ġ= Ġ_ http 2 . value Ċ Ċ class ĠHttp 2 Interceptor Ġ: ĠInter ceptor Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠMem Scope . intercept Read ( fd : ĠDR ILL _ SOCKET , Ġbytes : ĠC Pointer < Byte Var Of < Byte >>, Ġsize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Bytes Ġ= Ġbytes . read Bytes ( size ) ĊĠĠĠĠĠĠĠ Ġhttp 2 [ fd ]?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġread Stream . copy ( frm Ġ= Ġread Stream . frm . copy ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstream . read Headers ( read Bytes )?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Headers . value ( this ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Callback . value ( byte ArrayOf ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġhttp 2 . remove ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp 2 . put ( fd , Ġcopy ( read Stream Ġ= Ġstream )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠMem Scope . intercept Write ( fd : ĠDR ILL _ SOCKET , Ġbytes : ĠC Pointer < Byte Var Of < Byte >>, Ġsize : ĠInt ): ĠTcp Final Data Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġread Bytes Ġ= Ġbytes . read Bytes ( size ) ĊĠĠĠĠĠĠĠ Ġhttp 2 [ fd ]?. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstream Ġ= Ġwrite Stream . copy ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfrm Ġ= Ġwrite Stream . frm . copy (), Ġheaders Ġ= Ġinjected Headers . value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stream . is Ok ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġread Headers Ġ= Ġstream . write Headers ( read Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( read Headers Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp 2 . put ( fd , Ġcopy ( write Stream Ġ= Ġstream )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTcp Final Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Headers . to C Values (). get Pointer ( this @ intercept Write ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Headers . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġread Headers . size Ġ- Ġread Bytes . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhttp 2 . remove ( fd ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp 2 . put ( fd , Ġcopy ( write Stream Ġ= Ġstream )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTcp Final Data ( bytes , Ġsize ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose ( fd : ĠDR ILL _ SOCKET ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhttp 2 . remove ( fd ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Suit able Byte Stream ( fd : ĠDR ILL _ SOCKET , Ġbytes : ĠC Pointer < Byte Var Of < Byte >> ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġis Http 2 Marker Ġ= Ġbytes . read Bytes ( 8 ). decode ToString (). startsWith ( HTTP 2 _ IDENT IFIC ATOR ) ĊĠĠĠĠĠĠĠ Ġif Ġ( is Http 2 Marker ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhttp 2 . put ( fd , ĠStream Pair ( Read Stream (), ĠWrite Stream ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġis Http 2 Marker Ġ|| Ġhttp 2 . contains ( fd ) ĊĠĠĠ Ġ} Ċ Ċ } Ċ