package Ġthe again again Ċ Ċ import Ġcom . google . common . collect . Lists Ċ import Ġcom . google . common . net . HttpHeaders Ċ import Ġcom . google . inject . Inject Ċ import Ġmu . Kotlin Logging Ċ import Ġspark . Filter Ċ import Ġspark . Request Ċ import Ġspark . Response Ċ import Ġspark . Spark Ċ import Ġthe again again . configuration . Service Configuration Ċ Ċ private Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} Ċ Ċ class ĠWeb Service Initializer Ġ@ Inject Ġconstructor ( private Ġval Ġconfiguration : ĠService Configuration ) Ġ{ ĊĠĠĠ Ġfun Ġinitialize ( setup Endpoints : ĠRunnable ) Ġ{ ĊĠĠĠĠĠĠĠ ĠSpark . port ( configuration . getPort ()) ĊĊĠĠĠĠĠĠĠ Ġ// ĠStatic Ġfiles Ġmust Ġcome Ġbefore Ġthe Ġendpoints ĊĠĠĠĠĠĠĠ ĠSpark . static Files . external Location ( configuration . get Ui Location ()); ĊĠĠĠĠĠĠĠ Ġsetup Endpoints . run () ĊĊĠĠĠĠĠĠĠ Ġhard ening () ĊĠĠĠĠĠĠĠ ĠSpark . await Initialization () ĊĠĠĠĠĠĠĠ ĠSpark . exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠException :: class . java , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSpark ExceptionHandler ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhard ening () Ġ{ ĊĠĠĠĠĠĠĠ Ġsetup Cors For Options HttpMethod () ĊĠĠĠĠĠĠĠ ĠSpark . before ( Filter Ġ{ Ġrequest : ĠRequest ?, Ġresponse : ĠResponse ? Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġssl Redirect ( request , Ġresponse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Cors Header On Response ( response ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġapply Cs rf Protection ( request ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġssl Redirect ( request : ĠRequest ?, Ġresponse : ĠResponse ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl : ĠString Ġ= Ġrequest ?. url () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠ Ġif Ġ( configuration . ssl Redirect Enabled () Ġ&& Ġurl . startsWith (" http :// ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" redirect ing Ġ$ url Ġto Ġhttps ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsplit Ġ= Ġurl . split (" http :// ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ?. redirect (" https ://${ split [ 1 ]} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġset Cors Header On Response ( response : ĠResponse ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġresponse !!. header (" Access - Control - Allow - Origin ", Ġ"* ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġapply Cs rf Protection ( request : ĠRequest ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcustom Header Ġ= Ġrequest !!. headers ( HttpHeaders . X _ REQUEST ED _ WITH ) ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġrequest . request Method () ĊĠĠĠĠĠĠĠ Ġval Ġprotected Methods : ĠList < String > Ġ= ĠLists . newArrayList (" POST ", Ġ" DELETE ", Ġ" PUT ") ĊĠĠĠĠĠĠĠ Ġif Ġ( custom Header Ġ== Ġnull Ġ&& Ġprotected Methods . contains ( method )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠerrorMessage Ġ= Ġ"{\" message \": Ġ\" The ĠX - Requested - With Ġheader Ġis Ġrequired \" }" ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSpark . halt ( 4 0 1 , ĠerrorMessage ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġsetup Cors For Options HttpMethod () Ġ{ ĊĠĠĠĠĠĠĠ ĠSpark . options (" /* ") Ġ{ Ġrequest : ĠRequest , Ġresponse : ĠResponse Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccess Control Request Headers Ġ= Ġrequest . headers (" Access - Control - Request - Headers ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( access Control Request Headers Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . header (" Access - Control - Allow - Headers ", Ġaccess Control Request Headers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaccess Control Request Method Ġ= Ġrequest . headers (" Access - Control - Request - Method ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( access Control Request Method Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresponse . header (" Access - Control - Allow - Methods ", Ġaccess Control Request Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" OK " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ