package Ġit . uni bo . tup ro log . solve . libs . io Ċ Ċ import Ġit . uni bo . tup ro log . solve . libs . io . exceptions . Invalid Url Exception Ċ import Ġkotlin . js . Js Name Ċ import Ġkotlin . jvm . Jvm Static Ċ Ċ interface ĠUrl Ġ{ ĊĠĠĠ Ġ@ Js Name (" protocol ") ĊĠĠĠ Ġval Ġprotocol : ĠString ĊĊĠĠĠ Ġ@ Js Name (" host ") ĊĠĠĠ Ġval Ġhost : ĠString ĊĊĠĠĠ Ġ@ Js Name (" path ") ĊĠĠĠ Ġval Ġpath : ĠString ĊĊĠĠĠ Ġ@ Js Name (" port ") ĊĠĠĠ Ġval Ġport : ĠInt ? ĊĊĠĠĠ Ġ@ Js Name (" query ") ĊĠĠĠ Ġval Ġquery : ĠString ? ĊĊĠĠĠ Ġ@ Js Name (" read As Text ") ĊĠĠĠ Ġfun Ġread As Text (): ĠString ĊĊĠĠĠ Ġ@ Js Name (" read As ByteArray ") ĊĠĠĠ Ġfun Ġread As ByteArray (): ĠByteArray ĊĊĠĠĠ Ġ@ Js Name (" resolve ") ĊĠĠĠ Ġfun Ġresolve ( child : ĠString ): ĠUrl Ġ= ĊĠĠĠĠĠĠĠ Ġremote ( protocol , Ġhost , Ġport , Ġ"$ path /$ child ", Ġquery ) ĊĊĠĠĠ Ġ@ Js Name (" div ") ĊĠĠĠ Ġoperator Ġfun Ġdiv ( child : ĠString ): ĠUrl Ġ= Ġresolve ( child ) ĊĊĠĠĠ Ġ@ Js Name (" isFile ") ĊĠĠĠ Ġval Ġis File : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprotocol Ġ== Ġ" file " ĊĊĠĠĠ Ġ@ Js Name (" is Http ") ĊĠĠĠ Ġval Ġis Http : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġprotocol . startsWith (" http ") ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > ĠT ?. str ( transformation : Ġ( T ) Ġ-> ĠString Ġ= Ġ{ Ġit . toString () Ġ}): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ== Ġnull ) Ġ"" Ġelse Ġtransformation ( this ) ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠInt . ensure Valid Port (): ĠInt Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( this Ġ< Ġ 0 ) Ġthrow ĠIllegalArgumentException (" Invalid Ġport : Ġ$ this ") Ġelse Ġthis ĊĊĠĠĠĠĠĠĠ Ġinternal Ġenum Ġclass ĠUrl Field Ġ{ ĠPROTO COL , ĠUNIT , ĠHOST , ĠPORT , ĠPATH , ĠQUERY , ĠAN CH OR Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġurl Regex ( protocol : ĠString ? Ġ= Ġnull , Ġunit : ĠString ? Ġ= Ġnull , Ġhost : ĠString ? Ġ= Ġnull , Ġport : ĠString ? Ġ= Ġnull , Ġpath : ĠString ? Ġ= Ġnull , Ġquery : ĠString ? Ġ= Ġnull , Ġanchor : ĠString ? Ġ= Ġnull ): ĠRegex Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprotocol Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (${ protocol . str Ġ{ Ġ"? <$ it >" Ġ}} [\ w ]+) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunit Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (\ /? ${ unit . str Ġ{ Ġ"? $ it " Ġ}} [ a - z ]: ) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhost Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (${ host . str Ġ{ Ġ"? <$ it >" Ġ}} [^\ s \/ ]+ [ . ][ a - z ]{ 2 , }) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġport Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (${ port . str Ġ{ Ġ"? <$ it >" Ġ}} \ d +) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (${ path . str Ġ{ Ġ"? <$ it >" Ġ}} (?: \/ [^\ s ? # \/ ]+ )* \/ ?) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġquery Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (${ query . str Ġ{ Ġ"? <$ it >" Ġ}} [^\ s \/ ? # ]+) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġanchor Group Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" (${ anchor . str Ġ{ Ġ"? <$ it >" Ġ}} .* ) """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpattern Ġ= Ġ""" $ protocol Group :\ / +( ?: $ unit Group |$ host Group (? ::$ port Group )? )? $ path Group (?: \ ?$ query Group ? )? (?: #$ anchor Group )? """ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠRegex ( pattern , ĠRegex Option . IGNORE _ CASE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval ĠURL _ REGEX Ġ= Ġurl Regex () ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġparse ( string : ĠString ): ĠMap < Url Field , ĠString ?> ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= ĠURL _ REGEX . match Ent ire ( string )?. groups ?. toList () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatch ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ? . let Ġ{ Ġit Ġas ? ĠMatch Named Group Collection Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġgroups Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUrl Field . values (). associate Ġ{ Ġit Ġto Ġ( groups [ it . ordinal Ġ+ Ġ 1 ]?. value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Js Name (" file ") ĊĠĠĠĠĠĠĠ Ġfun Ġfile ( path : ĠString ): ĠUrl Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile Url ( path ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Js Name (" remote ") ĊĠĠĠĠĠĠĠ Ġfun Ġremote ( protocol : ĠString , Ġhost : ĠString Ġ= Ġ"", Ġport : ĠInt ? Ġ= Ġnull , Ġpath : ĠString Ġ= Ġ"", Ġquery : ĠString ? Ġ= Ġnull ): ĠUrl Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Url ( protocol , Ġhost , Ġport , Ġpath , Ġquery ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Js Name (" http ") ĊĠĠĠĠĠĠĠ Ġfun Ġhttp ( host : ĠString Ġ= Ġ"", Ġport : ĠInt ? Ġ= Ġnull , Ġpath : ĠString Ġ= Ġ"", Ġquery : ĠString ? Ġ= Ġnull ): ĠUrl Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote (" http ", Ġhost , Ġport , Ġpath , Ġquery ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Js Name (" https ") ĊĠĠĠĠĠĠĠ Ġfun Ġhttps ( host : ĠString Ġ= Ġ"", Ġport : ĠInt ? Ġ= Ġnull , Ġpath : ĠString Ġ= Ġ"", Ġquery : ĠString ? Ġ= Ġnull ): ĠUrl Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote (" https ", Ġhost , Ġport , Ġpath , Ġquery ) ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Js Name (" of ") ĊĠĠĠĠĠĠĠ Ġfun Ġof ( string : ĠString ): ĠUrl Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparse Url ( string ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Url Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Url (" file :// $ string ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠInvalid Url Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun ĠtoString ( protocol : ĠString , Ġhost : ĠString Ġ= Ġ"", Ġport : ĠInt ? Ġ= Ġnull , Ġpath : ĠString Ġ= Ġ"", Ġquery : ĠString ? Ġ= Ġnull ): ĠString Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ protocol :// $ host ${ port ?. ensure Valid Port (). str Ġ{ Ġ": $ it " Ġ}} $ path ${ query . str Ġ{ Ġ"? $ it " Ġ}}" ĊĠĠĠ Ġ} Ċ } Ċ