package Ġcom . fire fly source . net . http . server . impl . router . handler Ċ Ċ import Ġcom . fire fly source . common . annotation . No Arg Ċ import Ġcom . fire fly source . common . string . Pattern Ċ import Ġcom . fire fly source . common . sys . Result Ċ import Ġcom . fire fly source . net . http . common . model . Http Header .* Ċ import Ġcom . fire fly source . net . http . common . model . HttpMethod Ċ import Ġcom . fire fly source . net . http . common . model . HttpStatus Ċ import Ġcom . fire fly source . net . http . common . model . Mime Types Ċ import Ġcom . fire fly source . net . http . server . Router Ċ import Ġcom . fire fly source . net . http . server . Routing Context Ċ import Ġcom . fire fly source . net . http . server . impl . content . provider . Default Content Provider Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . function . Consumer ĊĊ Ċ class ĠC ors Handler ( val Ġconfig : ĠC ors Config ) Ġ: ĠRouter . Handler Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsimple Request Methods Ġ= Ġset Of < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . GET . value , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . HEAD . value , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . POST . value ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsimple Request Content Types Ġ= Ġset Of < String >( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMime Types . Type . FORM _ ENCODE D . value , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMime Types . Type . MULTI PART _ FORM _ DATA . value , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠMime Types . Type . TEXT _ PLAIN . value ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġallow Origin Pattern Ġ= ĠPattern . compile ( config . allow Origin Pattern , Ġ"* ") ĊĊĠĠĠ Ġoverride Ġfun Ġapply ( ctx : ĠRouting Context ): ĠCompletableFuture < Void > Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Simple Request ( ctx ) Ġ-> Ġhandle Simple Request ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis Pref light Request ( ctx ) Ġ-> Ġhandle Pref light Request ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin : ĠString ? Ġ= Ġctx . http Fields [ ORIGIN ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! origin . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( allow Origin ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset AccessControl Headers ( ctx , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ctx . response . is Commit ted ) ĠResult . DONE Ġelse Ġctx . next () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallow Origin ( ctx : ĠRouting Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġorigin : ĠString ? Ġ= Ġctx . http Fields [ ORIGIN ] ĊĠĠĠĠĠĠĠ Ġreturn Ġ! origin . isNull Or Blank () Ġ&& Ġallow Origin Pattern . match ( origin ) Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Simple Request ( ctx : ĠRouting Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( ctx . http Fields . contains ( ORIGIN ) Ġ&& Ġsimple Request Methods . contains ( ctx . method )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctx . method Ġ== ĠHttpMethod . POST . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple Request Content Types . any Ġ{ Ġctx . contentType . contains ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Pref light Request ( ctx : ĠRouting Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġctx . http Fields . contains ( ORIGIN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġctx . method Ġ== ĠHttpMethod . OPTIONS . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġctx . http Fields . contains ( ACCESS _ CONTROL _ REQUEST _ METHOD ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Simple Request ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( allow Origin ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorigin : ĠString ? Ġ= Ġctx . http Fields [ ORIGIN ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire NotNull ( origin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset AccessControl Headers ( ctx , Ġorigin ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġhandle Not Allow Origin ( ctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset AccessControl Headers ( ctx : ĠRouting Context , Ġorigin : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġctx . put ( ACCESS _ CONTROL _ ALLOW _ ORIGIN , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ACCESS _ CONTROL _ ALLOW _ CRED ENTIAL S , Ġconfig . allow Credentials . toString ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( config . expose Headers . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . add CSV ( ACCESS _ CONTROL _ EXPOSE _ HEADERS , Ġ* config . expose Headers . to Typed Array ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Pref light Request ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! allow Origin ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Not Allow Origin ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! allow Method ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Not Allow Method ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! allow Headers ( ctx )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandle Not Allow Header ( ctx ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġorigin : ĠString ? Ġ= Ġctx . http Fields [ ORIGIN ] ĊĠĠĠĠĠĠĠ Ġrequire NotNull ( origin ) ĊĊĠĠĠĠĠĠĠ Ġctx . setStatus ( HttpStatus . NO _ CONTENT _ 2 0 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ACCESS _ CONTROL _ ALLOW _ ORIGIN , Ġorigin ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ACCESS _ CONTROL _ ALLOW _ CRED ENTIAL S , Ġconfig . allow Credentials . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. put ( ACCESS _ CONTROL _ MAX _ AGE , Ġconfig . pref light Max Age . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add CSV ( ACCESS _ CONTROL _ ALLOW _ METHO DS , Ġ* config . allow Methods . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add CSV ( ACCESS _ CONTROL _ ALLOW _ HEADERS , Ġ* config . allow Headers . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallow Method ( ctx : ĠRouting Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccess Control Request Methods Ġ= Ġctx . http Fields . get CSV ( ACCESS _ CONTROL _ REQUEST _ METHOD , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġconfig . allow Methods . contains All ( access Control Request Methods ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġallow Headers ( ctx : ĠRouting Context ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccess Control Request Headers Ġ= Ġctx . http Fields . get CSV ( ACCESS _ CONTROL _ REQUEST _ HEADERS , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( access Control Request Headers . isNull OrEmpty ()) Ġtrue ĊĠĠĠĠĠĠĠ Ġelse Ġconfig . allow Headers . map Ġ{ Ġit . lowercase ( Locale . getDefault ()) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains All ( access Control Request Headers . map Ġ{ Ġit . lowercase ( Locale . getDefault ()) Ġ}) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġprivate Ġfun Ġhandle Not Allow Origin ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . handle Not Allow Origin . accept ( ctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Not Allow Method ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . handle Not Allow Method . accept ( ctx ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Not Allow Header ( ctx : ĠRouting Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġconfig . handle Not Allow Header . accept ( ctx ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ No Arg Ċ data Ġclass ĠC ors Config Ġ@ Jvm Over loads Ġconstructor ( ĊĠĠĠ Ġvar Ġallow Origin Pattern : ĠString , ĊĠĠĠ Ġvar Ġexpose Headers : ĠSet < String > Ġ= Ġset Of (), ĊĠĠĠ Ġvar Ġallow Headers : ĠSet < String > Ġ= Ġset Of (" Content - Type "), ĊĠĠĠ Ġvar Ġpref light Max Age : ĠInt Ġ= Ġ 8 6 4 0 0 , ĊĠĠĠ Ġvar Ġallow Credentials : ĠBoolean Ġ= Ġtrue , ĊĠĠĠ Ġvar Ġallow Methods : ĠSet < String > Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠ ĠHttpMethod . GET . value , ĊĠĠĠĠĠĠĠ ĠHttpMethod . POST . value , ĊĠĠĠĠĠĠĠ ĠHttpMethod . PUT . value , ĊĠĠĠĠĠĠĠ ĠHttpMethod . DELETE . value , ĊĠĠĠĠĠĠĠ ĠHttpMethod . OPTIONS . value , ĊĠĠĠĠĠĠĠ ĠHttpMethod . HEAD . value , ĊĠĠĠĠĠĠĠ ĠHttpMethod . PATCH . value ĊĠĠĠ Ġ), ĊĠĠĠ Ġvar Ġhandle Not Allow Origin : ĠConsumer < Routing Context > Ġ= ĠConsumer Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġorigin : ĠString ? Ġ= Ġctx . http Fields [ ORIGIN ] ĊĠĠĠĠĠĠĠ Ġctx . setStatus ( HttpStatus . FOR BID DEN _ 4 0 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Content Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . FOR BID DEN _ 4 0 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNot Allow Origin Exception (" Not Ġallow Ġorigin : Ġ$ origin "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end () ĊĠĠĠ Ġ}, ĊĠĠĠ Ġvar Ġhandle Not Allow Method : ĠConsumer < Routing Context > Ġ= ĠConsumer Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġaccess Control Request Methods Ġ= Ġctx . http Fields . get CSV ( ACCESS _ CONTROL _ REQUEST _ METHOD , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġctx . setStatus ( HttpStatus . METHOD _ NOT _ ALLOWED _ 4 0 5 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Content Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . METHOD _ NOT _ ALLOWED _ 4 0 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNot Allow Method Exception (" Not Ġallow Ġmethods : Ġ$ access Control Request Methods "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end () ĊĠĠĠ Ġ}, ĊĠĠĠ Ġvar Ġhandle Not Allow Header : ĠConsumer < Routing Context > Ġ= ĠConsumer Ġ{ Ġctx Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġaccess Control Request Headers Ġ= Ġctx . http Fields . get CSV ( ACCESS _ CONTROL _ REQUEST _ HEADERS , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġctx . setStatus ( HttpStatus . BAD _ REQUEST _ 4 0 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. content Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDefault Content Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . BAD _ REQUEST _ 4 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠNot Allow Header Exception (" Not Ġallow Ġheaders : Ġ$ access Control Request Headers "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġctx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. end () ĊĠĠĠ Ġ} Ċ ) Ċ Ċ class ĠNot Allow Origin Exception ( message : ĠString ) Ġ: ĠIllegalArgumentException ( message ) Ċ Ċ class ĠNot Allow Method Exception ( message : ĠString ) Ġ: ĠIllegalArgumentException ( message ) Ċ Ċ class ĠNot Allow Header Exception ( message : ĠString ) Ġ: ĠIllegalArgumentException ( message )