package Ġio . u ver a . helmet react ives pr ing boot starter . filter Ċ Ċ import Ġio . u ver a . helmet react ives pr ing boot starter . configuration . Content Security Policy Values Ċ import Ġio . u ver a . helmet react ives pr ing boot starter . properties . Hel met Reactive Properties Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . boot . autoconfigure . condition . Conditional On Property Ċ import Ġorg . springframework . core . annotation . Order Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġorg . springframework . web . server . Server Web Exchange Ċ import Ġorg . springframework . web . server . Web Filter Ċ import Ġorg . springframework . web . server . Web FilterChain Ċ import Ġreactor . core . publisher . Mono Ċ Ċ @ Conditional On Property ( prefix Ġ= Ġ" spring - helmet . reactive ", Ġname Ġ= Ġ[" enable - content - security - policy "]) Ċ @ Order ( 1 ) Ċ @ Component Ċ class ĠContent Security Policy Filter ( private Ġval Ġprops : ĠHel met Reactive Properties ) Ġ: ĠWeb Filter Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( this :: class . java ) ĊĊĠĠĠ Ġval Ġheader Name Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Header Name ( props ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġparsed Props Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ Ġparse Props ( props ) ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġfilter ( exchange : ĠServer Web Exchange , Ġchain : ĠWeb FilterChain ): ĠMono < Void > Ġ= ĊĠĠĠĠĠĠĠ Ġwith ( exchange . response . headers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparsed Props . do On Next Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset ( header Name , Ġit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. do OnError Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Error Ġoccurred : Ġ" Ġ+ Ġit . localized Message ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchain . filter ( exchange ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Props ( props : ĠHel met Reactive Properties ): ĠMono < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdirectives Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( props . content Security Policy . use Default ) ĠContent Security Policy Values . default Values . to Mutable Map () Ġelse Ġmutable Map Of () ĊĠĠĠĠĠĠĠ Ġprops . content Security Policy . directives ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( key , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Key Ġ= Ġkey . dash ify () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdirectives [ new Key ] Ġ= Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġdirectives ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Keys Ġ{ Ġit . key . dash ify () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( entry , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirective Value Ġ= Ġvalue . join ToString ( separator Ġ= Ġ" Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( directive Value . isBlank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ entry Ġ$ directive Value " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠMono . just ( result . join ToString ( separator Ġ= Ġ"; ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Header Name ( props : ĠHel met Reactive Properties ): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( props . content Security Policy . report Only ) Ġ" Content - Security - Policy - Report - Only " ĊĠĠĠĠĠĠĠ Ġelse Ġ" Content - Security - Policy " ĊĊĠĠĠ Ġval Ġdash ify Regex : ĠRegex Ġ= Ġ"[ A - Z ] ". to Regex () ĊĊĠĠĠ Ġprivate Ġfun ĠString . dash ify () Ġ= Ġthis . replace ( dash ify Regex ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ"- ${ it . value . lowercase () }" ĊĠĠĠ Ġ} Ċ } Ċ