/* Ċ * ĠCopyright Ġ 2 0 1 4 - 2 0 2 1 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ */ Ċ Ċ package Ġio . ktor . http . auth Ċ Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . parsing .* Ċ import Ġio . ktor . util .* Ċ import Ġio . ktor . utils . io . char sets .* Ċ import Ġkotlin . native . concurrent .* Ċ Ċ private Ġval ĠTOKEN _ EXTRA Ġ= Ġset Of (' !', Ġ'#', Ġ'$ ', Ġ'% ', Ġ'& ', Ġ'\' ', Ġ'*', Ġ'+', Ġ'-', Ġ'.', Ġ'^ ', Ġ'_ ', Ġ'` ', Ġ' |', Ġ'~ ') Ċ private Ġval ĠTOKEN 6 8 _ EXTRA Ġ= Ġset Of ('- ', Ġ'.', Ġ'_ ', Ġ'~ ', Ġ'+', Ġ'/') Ċ private Ġval Ġtoken 6 8 Pattern Ġ= Ġ"[ a - zA - Z 0 - 9 \\ - ._ ~ +/ ]+ = * ". to Regex () Ċ private Ġval Ġescape Regex : ĠRegex Ġ= Ġ" \\\\ .". to Regex () Ċ Ċ /** Ċ Ġ* ĠParses Ġan Ġauthorization Ġheader Ġ[ header Value ] Ġinto Ġa Ġ[ Http Auth Header ]. Ċ Ġ* Ġ@ return Ġ[ Http Auth Header ] Ġor Ġ` null ` Ġif Ġargument Ġstring Ġis Ġblank . Ċ Ġ* Ġ@ throws Ġ[ ParseException ] Ġon Ġinvalid Ġheader Ċ Ġ*/ Ċ public Ġfun Ġparse Authorization Header ( header Value : ĠString ): ĠHttp Auth Header ? Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġindex Ġ= Ġheader Value . skip Spaces ( index ) ĊĊĠĠĠ Ġvar Ġtoken StartIndex Ġ= Ġindex ĊĠĠĠ Ġwhile Ġ( index Ġ< Ġheader Value . length Ġ&& Ġheader Value [ index ]. is Token ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠAuth Ġscheme ĊĠĠĠ Ġval Ġauth Scheme Ġ= Ġheader Value . substring ( token StartIndex Ġuntil Ġindex ) ĊĠĠĠ Ġindex Ġ= Ġheader Value . skip Spaces ( index ) ĊĠĠĠ Ġtoken StartIndex Ġ= Ġindex ĊĊĠĠĠ Ġif Ġ( auth Scheme . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( header Value . length Ġ== Ġindex ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHttp Auth Header . Parameterized ( auth Scheme , Ġempty List ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġtoken 6 8 Ġ= Ġmatch Token 6 8 ( header Value , Ġindex ) ĊĠĠĠ Ġif Ġ( token 6 8 Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠHttp Auth Header . Single ( auth Scheme , Ġtoken 6 8 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparameters Ġ= Ġmatch Parameters ( header Value , Ġtoken StartIndex ) ĊĠĠĠ Ġreturn ĠHttp Auth Header . Parameterized ( auth Scheme , Ġparameters ) Ċ } Ċ Ċ private Ġfun Ġmatch Parameters ( header Value : ĠString , ĠstartIndex : ĠInt ): ĠMap < String , ĠString > Ġ{ ĊĠĠĠ Ġval Ġresult Ġ= Ġmutable Map Of < String , ĠString >() ĊĊĠĠĠ Ġvar Ġindex Ġ= ĠstartIndex ĊĠĠĠ Ġwhile Ġ( index Ġ> Ġ 0 Ġ&& Ġindex Ġ< Ġheader Value . length ) Ġ{ ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġmatch Parameter ( header Value , Ġindex , Ġresult ) ĊĠĠĠĠĠĠĠ Ġindex Ġ= Ġheader Value . skip Delimiter ( index , Ġ', ') ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġresult Ċ } Ċ Ċ private Ġfun Ġmatch Parameter ( header Value : ĠString , ĠstartIndex : ĠInt , Ġparameters : ĠMutable Map < String , ĠString >): ĠInt Ġ{ ĊĠĠĠ Ġval Ġkey Start Ġ= Ġheader Value . skip Spaces ( startIndex ) ĊĠĠĠ Ġvar Ġindex Ġ= Ġkey Start ĊĊĠĠĠ Ġ// ĠTake Ġkey ĊĠĠĠ Ġwhile Ġ( index Ġ< Ġheader Value . length Ġ&& Ġheader Value [ index ]. is Token ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġkey Ġ= Ġheader Value . substring ( key Start Ġuntil Ġindex ) ĊĊĠĠĠ Ġ// ĠTake Ġ'=' ĊĠĠĠ Ġindex Ġ= Ġheader Value . skip Spaces ( index ) ĊĠĠĠ Ġif Ġ( index Ġ>= Ġheader Value . length Ġ|| Ġheader Value [ index ] Ġ!= Ġ'= ') Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Expected Ġ` =` Ġafter Ġparameter Ġkey Ġ'$ key ': Ġ$ header Value ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġindex ++ ĊĠĠĠ Ġindex Ġ= Ġheader Value . skip Spaces ( index ) ĊĊĠĠĠ Ġ// ĠTake Ġvalue ĊĠĠĠ Ġvar Ġquoted Ġ= Ġfalse ĊĠĠĠ Ġvar Ġvalue Start Ġ= Ġindex ĊĊĠĠĠ Ġif Ġ( header Value [ index ] Ġ== Ġ'" ') Ġ{ ĊĠĠĠĠĠĠĠ Ġquoted Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠ Ġvalue Start Ġ= Ġindex ĊĊĠĠĠĠĠĠĠ Ġvar Ġescaped Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġheader Value . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( header Value [ index ] Ġ== Ġ'"' Ġ&& Ġ! escaped ) Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġescaped Ġ= Ġ! escaped Ġ&& Ġheader Value [ index ] Ġ== Ġ'\\ ' ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġheader Value . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Expected Ġclosing Ġquote ' \" ' Ġin Ġparameter : Ġ$ header Value Ġ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( index Ġ< Ġheader Value . length Ġ&& Ġheader Value [ index ] Ġ!= Ġ' Ġ' Ġ&& Ġheader Value [ index ] Ġ!= Ġ', ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġvalue Ġ= Ġheader Value . substring ( value Start Ġuntil Ġindex ) ĊĠĠĠ Ġparameters [ key ] Ġ= Ġif Ġ( quoted ) Ġvalue . unes caped () Ġelse Ġvalue ĊĊĠĠĠ Ġif Ġ( quoted ) Ġindex ++ ĊĠĠĠ Ġreturn Ġindex Ċ } Ċ Ċ private Ġfun Ġmatch Token 6 8 ( header Value : ĠString , ĠstartIndex : ĠInt ): ĠString ? Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= ĠstartIndex ĊĊĠĠĠ Ġwhile Ġ( index Ġ< Ġheader Value . length Ġ&& Ġheader Value [ index ]. is Token 6 8 ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġwhile Ġ( index Ġ< Ġheader Value . length Ġ&& Ġheader Value [ index ] Ġ== Ġ'= ') Ġ{ ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġonly Space Remaining Ġ= Ġ( index Ġuntil Ġheader Value . length ). all Ġ{ Ġheader Value [ it ] Ġ== Ġ' Ġ' Ġ} ĊĠĠĠ Ġif Ġ( only Space Remaining ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġheader Value . substring ( startIndex Ġuntil Ġindex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* ĠDescri bes Ġan Ġauthentication Ġheader Ġwith Ġa Ġmandatory Ġ[ auth Scheme ] Ġthat Ġusually Ġis Ġa Ġstandard Ġ[ Auth Scheme ]. Ċ Ġ* Ċ Ġ* ĠThis Ġcan Ġbe Ġof Ġtype Ġ[ Http Auth Header . Single ] Ġor Ġ[ Http Auth Header . Parameterized ]. Ċ Ġ* Ċ Ġ* Ġ@ property Ġauth Scheme Ġauth Ġscheme , Ġusually Ġone Ġof Ġ[ Auth Scheme ] Ċ Ġ*/ Ċ public Ġsealed Ġclass ĠHttp Auth Header ( public Ġval Ġauth Scheme : ĠString ) Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! auth Scheme . matches ( token 6 8 Pattern )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Invalid Ġauth Scheme Ġvalue : Ġit Ġshould Ġbe Ġtoken , Ġbut Ġinstead Ġit Ġis Ġ$ auth Scheme ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDescri bes Ġan Ġauthentication Ġheader Ġthat Ġis Ġrepresented Ġby Ġa Ġsingle Ġ[ blob ]. ĊĠĠĠĠ Ġ* Ġ@ property Ġblob Ġcontains Ġsingle Ġtoken Ġ 6 8 , Ġshould Ġconsist Ġfrom Ġdigits , Ġletters Ġand Ġone Ġof Ġthe Ġfollowing : Ġ`- ._ ~ + /` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠSingle ( auth Scheme : ĠString , Ġpublic Ġval Ġblob : ĠString ) Ġ: ĠHttp Auth Header ( auth Scheme ) Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! blob . matches ( token 6 8 Pattern )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" Invalid Ġblob Ġvalue : Ġit Ġshould Ġbe Ġtoken 6 8 , Ġbut Ġinstead Ġit Ġis Ġ$ blob ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrender (): ĠString Ġ= Ġ"$ auth Scheme Ġ$ blob " ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrender ( encoding : ĠHeader Value Encoding ): ĠString Ġ= Ġrender () ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠSingle ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother . auth Scheme . equals ( auth Scheme , Ġignore Case Ġ= Ġtrue ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . blob . equals ( blob , Ġignore Case Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHash . combine ( auth Scheme . lowercase (), Ġblob . lowercase ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDescri bes Ġa Ġparameter ized Ġauthentication Ġheader Ġthat Ġis Ġrepresented Ġby Ġa Ġset Ġof Ġ[ parameters ] Ġencoded Ġwith Ġ[ encoding ]. ĊĠĠĠĠ Ġ* Ġ@ property Ġparameters Ġa Ġlist Ġof Ġauth Ġparameters ĊĠĠĠĠ Ġ* Ġ@ property Ġencoding Ġparameters Ġencoding Ġmethod , Ġone Ġof Ġ[ HeaderValue Encoding ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġclass ĠParameter ized ( ĊĠĠĠĠĠĠĠ Ġauth Scheme : ĠString , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġparameters : ĠList < HeaderValue Param >, ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġencoding : ĠHeader Value Encoding Ġ= ĠHeader Value Encoding . QUOT ED _ WHEN _ REQUIRED ĊĠĠĠ Ġ) Ġ: ĠHttp Auth Header ( auth Scheme ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġauth Scheme : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters : ĠMap < String , ĠString >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoding : ĠHeader Value Encoding Ġ= ĠHeader Value Encoding . QUOT ED _ WHEN _ REQUIRED ĊĠĠĠĠĠĠĠ Ġ) Ġ: Ġthis ( auth Scheme , Ġparameters . entries . map Ġ{ ĠHeader Value Param ( it . key , Ġit . value ) Ġ}, Ġencoding ) ĊĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . name . matches ( token 6 8 Pattern )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠParseException (" parameter Ġname Ġshould Ġbe Ġa Ġtoken Ġbut Ġit Ġis Ġ${ it . name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCop ies Ġthis Ġ[ Parameterized ] Ġapp ending Ġa Ġnew Ġparameter Ġ[ name ] Ġ[ value ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġwith Parameter ( name : ĠString , Ġvalue : ĠString ): ĠParameter ized Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠParameter ized ( auth Scheme , Ġthis . parameters Ġ+ ĠHeader Value Param ( name , Ġvalue ), Ġencoding ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠCop ies Ġthis Ġ[ Parameterized ] Ġreplacing Ġparameters Ġwith Ġ[ name ] Ġassigning Ġnew Ġ[ value ] ĊĠĠĠĠĠĠĠĠ Ġ* Ġor Ġapp ending Ġif Ġno Ġsuch Ġparameters Ġfound . ĊĠĠĠĠĠĠĠĠ Ġ* ĠIf Ġthere Ġwere Ġseveral Ġpairs Ġthey Ġwill Ġbe Ġreduced Ġinto Ġa Ġsingle Ġpair ĊĠĠĠĠĠĠĠĠ Ġ* Ġat Ġposition Ġof Ġfirst Ġoccurrence Ġdiscard ing Ġfollowing Ġpairs Ġwith Ġthis Ġ[ name ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġwith Re placed Parameter ( name : ĠString , Ġvalue : ĠString ): ĠParameter ized Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Index Ġ= Ġparameters . indexOf First Ġ{ Ġit . name Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( first Index Ġ== Ġ- 1 ) Ġreturn Ġwith Parameter ( name , Ġvalue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġreplaced Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Parameters Ġ= Ġparameters . map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . name Ġ!= Ġname Ġ-> Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! re placed Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreplaced Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHeader Value Param ( name , Ġvalue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠParameter ized ( auth Scheme , Ġnew Parameters , Ġencoding ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrender ( encoding : ĠHeader Value Encoding ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters . join ToString (", Ġ", Ġprefix Ġ= Ġ"$ auth Scheme Ġ") Ġ{ Ġ"${ it . name } =${ it . value . encode ( encoding )}" Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠT ries Ġto Ġextract Ġthe Ġfirst Ġvalue Ġof Ġa Ġparameter Ġ[ name ]. ĠReturns Ġnull Ġwhen Ġnot Ġfound . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġparameter ( name : ĠString ): ĠString ? Ġ= Ġparameters . first OrNull Ġ{ Ġit . name Ġ== Ġname Ġ} ?. value ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠString . encode ( encoding : ĠHeader Value Encoding ) Ġ= Ġwhen Ġ( encoding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeader Value Encoding . QUOT ED _ WHEN _ REQUIRED Ġ-> Ġescape IfNeeded () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeader Value Encoding . QUOT ED _ ALWAYS Ġ-> Ġquote () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeader Value Encoding . URI _ ENCODE Ġ-> Ġencode URL Parameter () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġrender (): ĠString Ġ= Ġrender ( encoding ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠParameter ized ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġother . auth Scheme . equals ( auth Scheme , Ġignore Case Ġ= Ġtrue ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother . parameters Ġ== Ġparameters ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠHash . combine ( auth Scheme . lowercase (), Ġparameters ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn codes Ġthe Ġheader Ġwith Ġa Ġspecified Ġ[ encoding ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġrender ( encoding : ĠHeader Value Encoding ): ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn codes Ġthe Ġheader Ġwith Ġthe Ġdefault Ġ[ HeaderValue Encoding ] Ġfor Ġthis Ġheader . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġabstract Ġfun Ġrender (): ĠString ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEn codes Ġthe Ġheader Ġwith Ġthe Ġdefault Ġ[ HeaderValue Encoding ] Ġfor Ġthis Ġheader . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġrender () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGenerates Ġan Ġ[ Auth Scheme . Basic ] Ġchallenge Ġas Ġa Ġ[ Http Auth Header ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġbasic Auth Challenge ( realm : ĠString , Ġcharset : ĠCharset ?): ĠParameter ized Ġ= ĠParameter ized ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Scheme . Basic , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLinkedHashMap < String , ĠString >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Parameters . Realm , Ġrealm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( charset Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput ( Parameters . Charset , Ġcharset . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠGenerates Ġan Ġ[ Auth Scheme . Digest ] Ġchallenge Ġas Ġa Ġ[ Http Auth Header ]. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġpublic Ġfun Ġdigest Auth Challenge ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrealm : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnonce : ĠString Ġ= Ġgenerate Nonce (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdomain : ĠList < String > Ġ= Ġempty List (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopaque : ĠString ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstale : ĠBoolean ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalgorithm : ĠString Ġ= Ġ" MD 5 " ĊĠĠĠĠĠĠĠ Ġ): ĠParameter ized Ġ= ĠParameter ized ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠAuth Scheme . Digest , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlinked Map Of < String , ĠString >(). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" realm ", Ġrealm ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" nonce ", Ġnonce ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domain . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" domain ", Ġdomain . join ToString (" Ġ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( opaque Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" opaque ", Ġopaque ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( st ale Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" st ale ", Ġstale . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġput (" algorithm ", Ġalgorithm ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHeader Value Encoding . QUOT ED _ ALWAYS ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStandard Ġparameters Ġfor Ġ[ Parameterized ] Ġ[ Http Auth Header ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" K Doc Missing Documentation ", Ġ" Public Api Implicit Type ") ĊĠĠĠ Ġpublic Ġobject ĠParameters Ġ{ ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠRealm : ĠString Ġ= Ġ" realm " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠCharset : ĠString Ġ= Ġ" charset " ĊĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Callback : ĠString Ġ= Ġ" oauth _ callback " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Consumer Key : ĠString Ġ= Ġ" oauth _ consumer _ key " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Nonce : ĠString Ġ= Ġ" oauth _ nonce " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Token : ĠString Ġ= Ġ" oauth _ token " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Token Secret : ĠString Ġ= Ġ" oauth _ token _ secret " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Verifier : ĠString Ġ= Ġ" oauth _ verifier " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Signature Method : ĠString Ġ= Ġ" oauth _ signature _ method " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Timestamp : ĠString Ġ= Ġ" oauth _ timestamp " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Version : ĠString Ġ= Ġ" oauth _ version " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Signature : ĠString Ġ= Ġ" oauth _ signature " ĊĠĠĠĠĠĠĠ Ġpublic Ġconst Ġval ĠOAuth Callback Confirmed : ĠString Ġ= Ġ" oauth _ callback _ confirmed " ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠString . unes caped () Ġ= Ġreplace ( escape Regex ) Ġ{ Ġit . value . take Last ( 1 ) Ġ} Ċ Ċ private Ġfun ĠString . skip Delimiter ( startIndex : ĠInt , Ġdelimiter : ĠChar ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= Ġskip Spaces ( startIndex ) ĊĊĠĠĠ Ġwhile Ġ( index Ġ< Ġlength Ġ&& Ġthis [ index ] Ġ!= Ġdelimiter ) Ġ{ ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġif Ġ( index Ġ== Ġlength ) Ġreturn Ġ- 1 ĊĠĠĠ Ġindex ++ ĊĊĠĠĠ Ġreturn Ġskip Spaces ( index ) Ċ } Ċ Ċ private Ġfun ĠString . skip Spaces ( startIndex : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġvar Ġindex Ġ= ĠstartIndex ĊĠĠĠ Ġwhile Ġ( index Ġ< Ġlength Ġ&& Ġ( this [ index ] Ġ== Ġ' Ġ')) Ġ{ ĊĠĠĠĠĠĠĠ Ġindex ++ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġindex Ċ } Ċ Ċ private Ġfun ĠChar . is Token 6 8 (): ĠBoolean Ġ= Ġ( this Ġin Ġ' a ' .. ' z ') Ġ|| Ġ( this Ġin Ġ' A ' .. ' Z ') Ġ|| Ġis Digit () Ġ|| Ġthis Ġin ĠTOKEN 6 8 _ EXTRA Ċ Ċ private Ġfun ĠChar . is Token (): ĠBoolean Ġ= Ġ( this Ġin Ġ' a ' .. ' z ') Ġ|| Ġ( this Ġin Ġ' A ' .. ' Z ') Ġ|| Ġis Digit () Ġ|| Ġthis Ġin ĠTOKEN _ EXTRA Ċ