@@ -116,6 +116,8 @@ public override bool Execute()
116
116
endpoint . AssetFile = asset . ResolvedAsset . ComputeTargetPath ( "" , '/' , StaticWebAssetTokenResolver . Instance ) ;
117
117
endpoint . Route = route ;
118
118
119
+ EncodeLinkHeadersIfNeeded ( endpoint ) ;
120
+
119
121
Log . LogMessage ( MessageImportance . Low , "Including endpoint '{0}' for asset '{1}' with final location '{2}'" , endpoint . Route , endpoint . AssetFile , asset . TargetPath ) ;
120
122
}
121
123
@@ -137,6 +139,48 @@ public override bool Execute()
137
139
return ! Log . HasLoggedErrors ;
138
140
}
139
141
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
+
140
184
private static ( string , string [ ] ) ParseAndSortPatterns ( string patterns )
141
185
{
142
186
if ( string . IsNullOrEmpty ( patterns ) )
0 commit comments