@@ -116,6 +116,8 @@ public override bool Execute()
116116 endpoint . AssetFile = asset . ResolvedAsset . ComputeTargetPath ( "" , '/' , StaticWebAssetTokenResolver . Instance ) ;
117117 endpoint . Route = route ;
118118
119+ EncodeLinkHeadersIfNeeded ( endpoint ) ;
120+
119121 Log . LogMessage ( MessageImportance . Low , "Including endpoint '{0}' for asset '{1}' with final location '{2}'" , endpoint . Route , endpoint . AssetFile , asset . TargetPath ) ;
120122 }
121123
@@ -137,6 +139,48 @@ public override bool Execute()
137139 return ! Log . HasLoggedErrors ;
138140 }
139141
142+ private static void EncodeLinkHeadersIfNeeded ( StaticWebAssetEndpoint endpoint )
143+ {
144+ for ( var i = 0 ; i < endpoint . ResponseHeaders . Length ; i ++ )
145+ {
146+ ref var header = ref endpoint . ResponseHeaders [ i ] ;
147+ if ( ! string . Equals ( header . Name , "Link" , StringComparison . OrdinalIgnoreCase ) )
148+ {
149+ continue ;
150+ }
151+ var headerValues = header . Value . Split ( [ ',' ] , StringSplitOptions . RemoveEmptyEntries ) ;
152+ for ( var j = 0 ; j < headerValues . Length ; j ++ )
153+ {
154+ ref var value = ref headerValues [ j ] ;
155+ value = EncodeHeaderValue ( value ) ;
156+ }
157+ header . Value = string . Join ( "," , headerValues ) ;
158+ }
159+ }
160+
161+ private static string EncodeHeaderValue ( string header )
162+ {
163+ var index = header . IndexOf ( '<' ) ;
164+ if ( index == - 1 )
165+ {
166+ return header ;
167+ }
168+ index ++ ;
169+ var endIndex = header . IndexOf ( '>' , index ) ;
170+ if ( endIndex == - 1 )
171+ {
172+ return header ;
173+ }
174+ var link = header . AsSpan ( index , endIndex - index ) . ToString ( ) ;
175+ var segments = link . Split ( '/' ) ;
176+ for ( var j = 0 ; j < segments . Length ; j ++ )
177+ {
178+ segments [ j ] = System . Net . WebUtility . UrlEncode ( segments [ j ] ) ;
179+ }
180+ var encoded = string . Join ( "/" , segments ) ;
181+ return $ "{ header . Substring ( 0 , index ) } { encoded } { header . Substring ( endIndex ) } ";
182+ }
183+
140184 private static ( string , string [ ] ) ParseAndSortPatterns ( string patterns )
141185 {
142186 if ( string . IsNullOrEmpty ( patterns ) )
0 commit comments