Skip to content

Commit 95dcef5

Browse files
committed
Fix encoding when generating the manifest instead
1 parent 8555444 commit 95dcef5

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/StaticWebAssetsSdk/Tasks/GenerateStaticWebAssetEndpointsManifest.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)