package Ġorg . jel ly fin . apic lient . discovery Ċ Ċ import Ġio . ktor . http .* Ċ import Ġorg . slf 4 j . LoggerFactory Ċ Ċ /** Ċ Ġ* ĠParses Ġthe Ġgiven Ġ[ input ] Ġand Ġallows Ġto Ġfix Ġcommon Ġmist akes . Ċ Ġ*/ Ċ class ĠAddress Candidate Helper ( Ċ ĉ private Ġval Ġinput : ĠString Ċ ) Ġ{ Ċ ĉ comp anion Ġobject Ġ{ Ċĉ ĉ /** Ċĉĉ Ġ* ĠDefault ĠHTTP Ġport Ġfor ĠJ el ly fin Ċĉĉ Ġ*/ Ċĉ ĉ const Ġval ĠJ F _ HTTP _ PORT Ġ= Ġ 8 0 9 6 ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠDefault ĠHTTPS Ġport Ġfor ĠJ el ly fin Ċĉĉ Ġ*/ Ċĉ ĉ const Ġval ĠJ F _ HTTPS _ PORT Ġ= Ġ 8 9 2 0 ĊĊĉ ĉ /** Ċĉĉ Ġ* ĠDefault Ġbase Ġurl Ġfor ĠJ el ly fin Ċĉĉ Ġ*/ Ċĉ ĉ const Ġval ĠJ F _ BASE _ URL Ġ= Ġ"/ jel ly fin /" Ċ ĉ } ĊĊ ĉ private Ġval Ġcandidates Ġ= Ġmutable ListOf < Url >() Ċ ĉ private Ġval Ġpriorit ize Comparator Ġ= ĠComparator < Url > Ġ{ Ġa , Ġb Ġ-> Ġb . score () Ġ- Ġa . score () Ġ} Ċ ĉ private Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger (" Address Candidate Helper ") ĊĊ ĉ init Ġ{ Ċĉ ĉ try Ġ{ Ċĉĉ ĉ logger . debug (" Input Ġis Ġ% s ", Ġinput ) ĊĊĉĉ ĉ // ĠAdd Ġthe Ġinput Ġas Ġinitial Ġcandidate Ċĉĉ ĉ candidates . add ( URL Builder (). apply Ġ{ Ċĉĉĉ ĉ // ĠK tor Ġdoesn 't Ġlike Ġurls Ġnot Ġstarting Ġwith Ġa Ġprotocol Ċĉĉĉ ĉ // Ġso Ġwe Ġdefault Ġto Ġa Ġhttp Ġprefix Ċĉĉĉ ĉ if Ġ(! input . startsWith (" http :// ") Ġ&& Ġ! input . startsWith (" https :// ")) Ċĉĉĉĉ ĉ take From (" http :// $ input ") Ċĉĉĉ ĉ else Ċĉĉĉĉ ĉ take From ( input ) Ċĉĉ ĉ }. build ()) Ċĉ ĉ } Ġcatch Ġ( error : ĠURL Parser Exception ) Ġ{ Ċĉĉ ĉ // ĠInput Ġcan 't Ġbe Ġparsed Ċĉĉ ĉ logger . error (" Input Ġ% s Ġcould Ġnot Ġbe Ġparsed ", Ġinput , Ġerror ) Ċĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAdd Ġa ĠHTTPS Ġcandidate Ġfor Ġeach ĠHTTP Ġcandidate Ċĉ Ġ*/ Ċ ĉ fun Ġadd Protocol Candidates () Ġ{ Ċĉ ĉ logger . debug (" Adding Ġprotocol Ġcandidates ") ĊĊĉ ĉ // ĠAdd ĠHTTPS Ġcandidate Ġfor Ġeach ĠHTTP Ġcandidate Ċĉ ĉ candidates Ċĉĉ ĉ . filter Ġ{ Ġit . protocol Ġ== ĠURL Protocol . HTTP Ġ} Ċĉĉ ĉ . forEach Ġ{ Ċĉĉĉ ĉ candidates . add ( it . copy ( protocol Ġ= ĠURL Protocol . HTTPS )) Ċĉĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAdd Ġa Ġcandidate Ġusing ĠJ el ly fin Ġports Ġfor Ġeach Ġcandidate Ġwithout Ġa Ġspecified Ġport Ġor Ċĉ Ġ* Ġprotocol - default Ġport . Ċĉ Ġ*/ Ċ ĉ fun Ġadd Port Candidates () Ġ{ Ċĉ ĉ logger . debug (" Adding Ġport Ġcandidates ") ĊĊĉ ĉ // ĠAdd ĠHTTPS Ġcandidate Ġfor Ġeach ĠHTTP Ġcandidate Ċĉ ĉ candidates Ċĉĉ ĉ . filter Ġ{ Ġit . port Ġ== Ġit . protocol . default Port Ġ} Ċĉĉ ĉ . forEach Ġ{ Ċĉĉĉ ĉ when Ġ( it . protocol ) Ġ{ Ċĉĉĉĉ ĉ URL Protocol . HTTP Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ candidates . add ( it . copy ( specified Port Ġ= ĠJ F _ HTTP _ PORT )) Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ URL Protocol . HTTPS Ġ-> Ġ{ Ċĉĉĉĉĉ ĉ candidates . add ( it . copy ( specified Port Ġ= ĠJ F _ HTTP _ PORT )) Ċĉĉĉĉĉ ĉ candidates . add ( it . copy ( specified Port Ġ= ĠJ F _ HTTPS _ PORT )) Ċĉĉĉĉ ĉ } Ċĉĉĉ ĉ } Ċĉĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠAdd Ġa Ġbase Ġurl Ġ([ JF _ BASE _ URL ]) Ġfor Ġeach Ġcandidate Ġwith Ġa Ġroot Ġor Ġno Ġpath . Ċĉ Ġ*/ Ċ ĉ fun Ġadd BaseUrl Candidates () Ġ{ Ċĉ ĉ logger . debug (" Adding Ġbase Ġurl Ġcandidates ") ĊĊĉ ĉ candidates Ċĉĉ ĉ . filter Ġ{ Ġit . encoded Path . isEmpty () Ġ|| Ġit . encoded Path Ġ== Ġ"/" Ġ} Ċĉĉ ĉ . forEach Ġ{ Ċĉĉĉ ĉ candidates . add ( it . copy ( encoded Path Ġ= ĠJ F _ BASE _ URL )) Ċĉĉ ĉ } Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠExecute Ġthe Ġfixes Ġfor Ġcommon Ġmist akes : Ċĉ Ġ* Ċĉ Ġ* ĠĠ Ġ- ĠProtocol Ċĉ Ġ* ĠĠ Ġ- ĠPort Ċĉ Ġ* Ċĉ Ġ* ĠNot Ġincluded : Ċĉ Ġ* Ċĉ Ġ* ĠĠ Ġ- ĠBase Url Ċĉ Ġ*/ Ċ ĉ fun Ġadd Common Candidates () Ġ{ Ċĉ ĉ logger . debug (" Adding Ġcommon Ġcandidates ") ĊĊĉ ĉ add Protocol Candidates () Ċĉ ĉ add Port Candidates () Ċĉ ĉ // ĠDisabled Ġby Ġdefault Ġsince Ġit Ġdoesn 't Ġaffect Ġmost Ġusers Ċĉ ĉ // Ġadd BaseUrl Candidates () Ċ ĉ } ĊĊ ĉ private Ġfun ĠUrl . score (): ĠInt Ġ{ Ċĉ ĉ // ĠStart Ġout Ġwith Ġa Ġscore Ġof Ġ 0 Ċĉ ĉ var Ġscore Ġ= Ġ 0 ĊĊĉ ĉ // ĠScore Ġbased Ġon Ġprotocol Ċĉ ĉ when Ġ( protocol ) Ġ{ Ċĉĉ ĉ URL Protocol . HTTPS Ġ-> Ġscore Ġ+= Ġ 5 Ċĉĉ ĉ else Ġ-> Ġscore Ġ-= Ġ 5 Ċĉ ĉ } ĊĊĉ ĉ // ĠScore Ġbased Ġon Ġport Ċĉ ĉ when Ġ( port ) Ġ{ Ċĉĉ ĉ JF _ HTTP _ PORT Ġ-> Ġscore Ġ+= Ġ 2 Ċĉĉĉ 8 0 Ġ-> Ġscore Ġ+= Ġ 1 Ċĉ ĉ } ĊĊĉ ĉ return Ġscore Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠRe order Ġall Ġcandidates Ġbased Ġon Ġpriority . Ċĉ Ġ* Ċĉ Ġ* ĠĠ Ġ- ĠHTTPS Ġabove ĠHTTP Ċĉ Ġ* ĠĠ Ġ- ĠJ el ly fin Ġports Ġabove Ġdefault Ġports Ċĉ Ġ*/ Ċ ĉ fun Ġpriorit ize () Ġ{ Ċĉ ĉ logger . debug (" Prior it izing Ġcandidates ") Ċĉ ĉ candidates . sort With ( prior it ize Comparator ) Ċ ĉ } ĊĊ ĉ /** Ċĉ Ġ* ĠGet Ġall Ġde d uplicated Ġcandidate ĠURLs Ġas Ġstrings . Ċĉ Ġ* ĠCall Ġ[ prior it ize ] Ġbefore Ġif Ġa Ġsorted Ġlist Ġis Ġdesired . Ċĉ Ġ*/ Ċ ĉ fun ĠgetC andidates (): ĠCollection < String > Ġ= Ġcandidates Ċĉ ĉ . map Ġ{ Ġit . toString () Ġ} Ċĉ ĉ . distinct () Ċ } Ċ