package Ġcom . z he wen . q ian zh an _ base . network . intercept ors Ċ Ċ import Ġokhttp 3 .* Ċ import Ġokhttp 3 . internal . http . HttpHeaders Ċ import Ġokhttp 3 . internal . platform . Platform Ċ import Ġokhttp 3 . internal . platform . Platform . INFO Ċ import Ġok io . Buffer Ċ import Ġok io . Buffered Source Ċ import Ġjava . io . EOF Exception Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġkotlin . properties . Deleg ates Ċ Ċ /** Ċ Ġ* Ġ ç½ĳç»ľ è¯·æ±Ĥ çļĦ æĹ¥å¿Ĺ æĭ ¦ æĪª åĻ¨ Ċ Ġ*/ Ċ class ĠHttp Logging Interceptor Ġ: ĠInter ceptor Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠUTF 8 : ĠCharset Ġ= ĠStandard Charsets . UTF _ 8 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġbody Ġin Ġquestion Ġprobably Ġcontains Ġhuman Ġreadable Ġtext . ĠUses Ġa Ġsmall Ġsample ĊĠĠĠĠĠĠĠĠ Ġ* Ġof Ġcode Ġpoints Ġto Ġdetect Ġunicode Ġcontrol Ġcharacters Ġcommonly Ġused Ġin Ġbinary Ġfile Ġsignatures . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġis Pl aintext ( buffer : ĠBuffer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprefix Ġ= ĠBuffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbyte Count Ġ= Ġif Ġ( buffer . size () Ġ< Ġ 6 4 ) Ġbuffer . size () Ġelse Ġ 6 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . copy To ( prefix , Ġ 0 , Ġbyte Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 1 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prefix . ex hausted ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcode Point Ġ= Ġprefix . read Utf 8 Code Point () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Character . is ISO Control ( code Point ) Ġ&& Ġ! Character . is Whitespace ( code Point )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠEOF Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse Ġ// ĠTr uncated ĠUTF - 8 Ġsequence . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġm Logger : ĠLogger Ġby ĠDeleg ates . notNull () ĊĊĠĠĠ Ġprivate Ġvar Ġlevel Ġ= ĠLevel . NONE ĊĊĠĠĠ Ġenum Ġclass ĠLevel Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠNo ĠLogs ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠNONE , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogs Ġrequest Ġand Ġresponse Ġlines . ĊĠĠĠĠĠĠĠĠ Ġ* Ġ< p > ĊĠĠĠĠĠĠĠĠ Ġ* Ġ< p > Example : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ< pre >{@ code ĊĠĠĠĠĠĠĠĠ Ġ* Ġ--> ĠPOST Ġ/ greeting Ġhttp / 1 . 1 Ġ( 3 - byte Ġbody ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ<-- Ġ 2 0 0 ĠOK Ġ( 2 2 ms , Ġ 6 - byte Ġbody ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ}</ pre > ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠBAS IC , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogs Ġrequest Ġand Ġresponse Ġlines Ġand Ġtheir Ġrespective Ġheaders . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ< pre >` --> ĠPOST Ġ/ greeting Ġhttp / 1 . 1 ĊĠĠĠĠĠĠĠĠ Ġ* ĠHost : Ġexample . com ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Type : Ġplain / text ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Length : Ġ 3 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ--> ĠEND ĠPOST ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ<-- Ġ 2 0 0 ĠOK Ġ( 2 2 ms ) ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Type : Ġplain / text ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Length : Ġ 6 ĊĠĠĠĠĠĠĠĠ Ġ* Ġ<-- ĠEND ĠHTTP ĊĠĠĠĠĠĠĠ Ġ` </ pre > Ġ* ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠHEAD ERS , ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠLogs Ġrequest Ġand Ġresponse Ġlines Ġand Ġtheir Ġrespective Ġheaders Ġand Ġbodies Ġ( if Ġpresent ). ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠExample : ĊĠĠĠĠĠĠĠĠ Ġ* Ġ< pre >` --> ĠPOST Ġ/ greeting Ġhttp / 1 . 1 ĊĠĠĠĠĠĠĠĠ Ġ* ĠHost : Ġexample . com ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Type : Ġplain / text ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Length : Ġ 3 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠHi ? ĊĠĠĠĠĠĠĠĠ Ġ* Ġ--> ĠEND ĠPOST ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ<-- Ġ 2 0 0 ĠOK Ġ( 2 2 ms ) ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Type : Ġplain / text ĊĠĠĠĠĠĠĠĠ Ġ* ĠContent - Length : Ġ 6 ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠHello ! ĊĠĠĠĠĠĠĠĠ Ġ* Ġ<-- ĠEND ĠHTTP ĊĠĠĠĠĠĠĠ Ġ` </ pre > Ġ* ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ ĠB ODY ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinterface ĠLogger Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġlog ( message : ĠString ) ĊĊĠĠĠĠĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠDEFAULT : ĠLogger ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġobject Ġ: ĠLogger Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġlog ( message : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPlatform . get (). log ( INFO , Ġmessage , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Logger Ġ= ĠLogger . DEFAULT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġconstructor ( logger : ĠLogger ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . m Logger Ġ= Ġlogger ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Level ( level : ĠLevel ): ĠHttp Logging Interceptor Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . level Ġ= Ġlevel ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Level (): ĠLevel Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġthis . level ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġintercept ( chain : ĠInter ceptor . Chain ): ĠResponse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlevel Ġ= Ġthis . level ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġchain . request () ĊĠĠĠĠĠĠĠ Ġif Ġ( level Ġ== ĠLevel . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġchain . proceed ( request ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlog Body Ġ= Ġlevel Ġ== ĠLevel . BODY ĊĠĠĠĠĠĠĠ Ġval Ġlog Headers Ġ= Ġlog Body Ġ|| Ġlevel Ġ== ĠLevel . HEADERS ĊĠĠĠĠĠĠĠ Ġval Ġrequest Body Ġ= Ġrequest . body () ĊĠĠĠĠĠĠĠ Ġval Ġhas RequestBody Ġ= Ġrequest Body Ġ!= Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġchain . connection () ĊĠĠĠĠĠĠĠ Ġval Ġprotocol Ġ= Ġconnection ?. protocol () Ġ?: ĠProtocol . HTTP _ 1 _ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġrequest Start Message Ġ= Ġ" --> Ġ${ request . method ()} Ġ${ request . url ()} Ġ$ protocol " ĊĠĠĠĠĠĠĠ Ġif Ġ(! log Headers Ġ&& Ġhas RequestBody ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Start Message Ġ+= Ġ" Ġ(${ request Body ?. content Length ()} - byte Ġbody )" ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġm Logger . log ( request Start Message ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log Headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Body ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Body . contentType () Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log (" Content - Type : Ġ${ request Body . contentType () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( request Body . content Length () Ġ!= Ġ- 1 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log (" Content - Length : Ġ${ request Body . content Length () }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders : ĠHeaders Ġ= Ġrequest . headers () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount : ĠInt Ġ= Ġheaders . size () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname : ĠString Ġ= Ġheaders . name ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! " Content - Type ". equals ( name , Ġignore Case Ġ= Ġtrue ) Ġ&& Ġ! " Content - Length ". equals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġignore Case Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ( name Ġ+ Ġ": Ġ" Ġ+ Ġheaders . value ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! log Body Ġ|| Ġ! has RequestBody ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log (" --> ĠEND Ġ${ request . method () }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( body Encoded ( request . headers ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log (" --> ĠEND Ġ${ request . method ()} Ġ( encoded Ġbody Ġomitted )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠBuffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Body !!. writeTo ( buffer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcharset : ĠCharset Ġ= ĠUTF 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġrequest Body . contentType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contentType Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharset Ġ= ĠcontentType . charset ( UTF 8 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Pl aintext ( buffer )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ( buffer . readString ( charset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log (" --> ĠEND Ġ${ request . method ()} Ġ(${ request Body . content Length ()} - byte Ġbody )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log (" --> ĠEND Ġ${ request . method ()} Ġ( binary Ġ${ request Body . content Length ()} - byte Ġbody Ġomitted )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġstart Ns Ġ= ĠSystem . nano Time () ĊĠĠĠĠĠĠĠ Ġval Ġresponse : ĠResponse Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġchain . proceed ( request ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("< -- ĠHTTP ĠFAILED : Ġ$ e ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtook Ms Ġ= ĠTimeUnit . NAN O SECONDS . to Millis ( System . nano Time () Ġ- Ġstart Ns ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse Body Ġ= Ġresponse . body () ĊĠĠĠĠĠĠĠ Ġval Ġcontent Length Ġ= Ġresponse Body !!. content Length () ĊĠĠĠĠĠĠĠ Ġval Ġbody Size Ġ= Ġif Ġ( content Length Ġ!= Ġ- 1 L ) Ġ"$ content Length - byte " Ġelse Ġ" unknown - length " ĊĠĠĠĠĠĠĠ Ġm Logger . log ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"< -- Ġ" Ġ+ Ġresponse . code () Ġ+ Ġ' Ġ' Ġ+ Ġresponse . message () Ġ+ Ġ' Ġ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġresponse . request (). url () Ġ+ Ġ" Ġ(" Ġ+ Ġtook Ms Ġ+ Ġ" ms " Ġ+ Ġ( if Ġ(! log Headers ) Ġ", Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġbody Size Ġ+ Ġ" Ġbody " Ġelse Ġ"") Ġ+ Ġ')' ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( log Headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheaders : ĠHeaders Ġ= Ġresponse . headers () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġheaders . size () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġcount ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ( headers . name ( i ) Ġ+ Ġ": Ġ" Ġ+ Ġheaders . value ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! log Body Ġ|| Ġ! HttpHeaders . has Body ( response )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("< -- ĠEND ĠHTTP ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( body Encoded ( response . headers ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("< -- ĠEND ĠHTTP Ġ( encoded Ġbody Ġomitted )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource : ĠBuffered Source Ġ= Ġresponse Body . source () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource . request ( Long . MAX _ VALUE ) Ġ// ĠBuffer Ġthe Ġentire Ġbody . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= Ġsource . buffer () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcharset : ĠCharset Ġ= ĠUTF 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType : ĠMediaType ? Ġ= Ġresponse Body . contentType () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType ?. let Ġ{ Ġcharset Ġ= Ġit . charset ( UTF 8 ) !! Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Pl aintext ( buffer )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("< -- ĠEND ĠHTTP Ġ( binary Ġ" Ġ+ Ġbuffer . size () Ġ+ Ġ"- byte Ġbody Ġomitted )") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( content Length Ġ!= Ġ 0 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ( buffer . clone (). readString ( charset )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Logger . log ("< -- ĠEND ĠHTTP Ġ(" Ġ+ Ġbuffer . size () Ġ+ Ġ"- byte Ġbody )") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġresponse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġbody Encoded ( headers : ĠHeaders ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontent Encoding Ġ= Ġheaders [" Content - Encoding "] ĊĠĠĠĠĠĠĠ Ġreturn Ġcontent Encoding Ġ!= Ġnull Ġ&& Ġ! content Encoding . equals (" identity ", Ġignore Case Ġ= Ġtrue ) ĊĠĠĠ Ġ} Ċ }