package Ġcom . y ww . http . manager . parser Ċ Ċ import Ġandroid . text . TextUtils Ċ import Ġcom . y ww . http . manager . Ret rofit Url Manager Ċ import Ġcom . y ww . http . manager . Ret rofit Url Manager . Companion . IDENT IFICATION _ PATH _ SIZE Ċ import Ġcom . y ww . http . manager . cache . Cache Ċ import Ġcom . y ww . http . manager . cache . L ru Cache Ċ import Ġokhttp 3 . Http Url Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* Ġ@ author Ġ ĠW AV EN ING Ċ Ġ*/ Ċ class ĠUrl Parser Super ( var Ġmanager : ĠRet rofit Url Manager ) Ġ: ĠUrl Parser Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcache : ĠCache < String , ĠString > Ġ= ĠL ru Cache ( 1 0 0 ) ĊĠĠĠ Ġoverride Ġfun Ġparse Url ( domain Url : ĠHttp Url ?, Ġurl : ĠHttp Url ): ĠHttp Url Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( null Ġ== Ġdomain Url ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġurl ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= Ġurl . newBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġpath Size Ġ= Ġresolve Path Size ( url , Ġbuilder ) ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( cache . get ( getKey ( domain Url , Ġurl , Ġpath Size )))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġurl . path Size ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// å½ĵ åĪłéĻ¤ äºĨ ä¸Ĭ ä¸Ģä¸ª Ġindex , ĠPath Segment ĠçļĦ Ġitem Ġä¼ļ èĩªåĬ¨ åīį è¿Ľ ä¸Ģ ä½į , Ġ æīĢä»¥ Ġremove ( 0 ) Ġ å°± å¥½ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . remove Path Segment ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Path Segments Ġ= ĠArrayList < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Path Segments . addAll ( domain Url . encoded Path Segments ()) ĊĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( url . path Size () Ġ> Ġpath Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġencoded Path Segments Ġ= Ġurl . encoded Path Segments () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġpath Size Ġuntil Ġencoded Path Segments . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Path Segments . add ( encoded Path Segments . get ( i )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( url . path Size () Ġ< Ġpath Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Your Ġfinal Ġpath Ġis Ġ% s , Ġthe Ġpath Size Ġ= Ġ% d , Ġbut Ġthe Ġ# baseurl _ path _ size Ġ= Ġ% d , Ġ# baseurl _ path _ size Ġmust Ġbe Ġless Ġthan Ġor Ġequal Ġto Ġpath Size Ġof Ġthe Ġfinal Ġpath ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġurl . scheme () Ġ+ Ġ" ://" Ġ+ Ġurl . host () Ġ+ Ġurl . encoded Path (), Ġurl . path Size (), Ġpath Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( Path Segment Ġin Ġnew Path Segments ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . add Encoded Path Segment ( Path Segment ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . encoded Path ( cache . get ( getKey ( domain Url , Ġurl , Ġpath Size ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhttp Url Ġ= Ġbuilder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. scheme ( domain Url . scheme ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. host ( domain Url . host ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. port ( domain Url . port ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( cache . get ( getKey ( domain Url , Ġurl , Ġpath Size )))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache . put ( getKey ( domain Url , Ġurl , Ġpath Size ), Ġhttp Url . encoded Path ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġhttp Url ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetKey ( domain Url : ĠHttp Url , Ġurl : ĠHttp Url , ĠPath Size : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ( domain Url . encoded Path () Ġ+ Ġurl . encoded Path () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ ĠPath Size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġresolve Path Size ( http Url : ĠHttp Url , Ġbuilder : ĠHttp Url . Builder ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfragment Ġ= Ġhttp Url . fragment () ĊĊĠĠĠĠĠĠĠ Ġvar Ġpath Size Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġval Ġnew Fragment Ġ= ĠStringBuffer () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( fragment !!. indexOf ("# ") Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġfragment . split (" =". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Size Ġ= ĠInteger . parseInt ( split [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fragment . indexOf ( IDENT IFICATION _ PATH _ SIZE ) Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġfragment . indexOf ("# ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Fragment . append ( fragment . substring ( index Ġ+ Ġ 1 , Ġfragment . length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . substring ( 0 , Ġindex ). split (" =". to Regex ()). drop Last While Ġ{ Ġit . isEmpty () Ġ}. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Size Ġ= ĠInteger . parseInt ( split [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfragment . split ( IDENT IFICATION _ PATH _ SIZE . to Regex ()). drop Last While ({ Ġit . isEmpty () Ġ}). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Fragment . append ( split [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( split . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġsplit [ 1 ]. indexOf ("# ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ!= Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Fragment . append ( split [ 1 ]. substring ( index , Ġsplit [ 1 ]. length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstring Ġ= Ġsplit [ 1 ]. substring ( 0 , Ġindex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! TextUtils . isEmpty ( substring )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Size Ġ= ĠInteger . parseInt ( substring ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Size Ġ= ĠInteger . parseInt ( split [ 1 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( new Fragment . toString ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . fragment ( null ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . fragment ( new Fragment . toString ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġpath Size ĊĠĠĠ Ġ} Ċ }