Skip to content

Commit 8768690

Browse files
committed
Add preload order property and sort headers
1 parent 513d10a commit 8768690

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.Streaming.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Diagnostics;
5+
using System.Linq;
56
using System.Runtime.InteropServices;
67
using System.Text;
78
using System.Text.Encodings.Web;
@@ -323,7 +324,7 @@ private void AppendWebAssemblyPreloadHeaders()
323324
var assets = _httpContext.GetEndpoint()?.Metadata.GetMetadata<ResourceAssetCollection>();
324325
if (assets != null)
325326
{
326-
var headers = new List<string>();
327+
var headers = new List<(string? Order, string Value)>();
327328
foreach (var asset in assets)
328329
{
329330
if (asset.Properties == null)
@@ -347,6 +348,7 @@ private void AppendWebAssemblyPreloadHeaders()
347348
continue;
348349
}
349350

351+
string? order = null;
350352
foreach (var property in asset.Properties)
351353
{
352354
if (property.Name.Equals("preloadas", StringComparison.OrdinalIgnoreCase))
@@ -365,15 +367,20 @@ private void AppendWebAssemblyPreloadHeaders()
365367
{
366368
header = String.Concat(header, "; integrity=\"", property.Value, "\"");
367369
}
370+
else if (property.Name.Equals("preloadorder", StringComparison.OrdinalIgnoreCase))
371+
{
372+
order = property.Value;
373+
}
368374
}
369375

370376
if (header != null)
371377
{
372-
headers.Add(header);
378+
headers.Add((order, header));
373379
}
374380
}
375381

376-
_httpContext.Response.Headers.Link = StringValues.Concat(_httpContext.Response.Headers.Link, headers.ToArray());
382+
headers.Sort((a, b) => string.Compare(a.Order, b.Order, StringComparison.InvariantCulture));
383+
_httpContext.Response.Headers.Link = StringValues.Concat(_httpContext.Response.Headers.Link, headers.Select(h => h.Value).ToArray());
377384
}
378385
}
379386

src/Shared/Components/ResourceCollectionResolver.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,15 @@ public ResourceAssetCollection ResolveResourceCollection()
4646
string? preloadAs = null;
4747
string? preloadPriority = null;
4848
string? preloadCrossorigin = null;
49+
string? preloadOrder = null;
4950
#else
5051
string label = null;
5152
string integrity = null;
5253
string preloadRel = null;
5354
string preloadAs = null;
5455
string preloadPriority = null;
5556
string preloadCrossorigin = null;
57+
string preloadOrder = null;
5658
#endif
5759

5860
// If there's a selector this means that this is an alternative representation for a resource, so skip it.
@@ -92,9 +94,14 @@ public ResourceAssetCollection ResolveResourceCollection()
9294
preloadCrossorigin = property.Value;
9395
foundProperties++;
9496
}
97+
else if (property.Name.Equals("preloadorder", StringComparison.OrdinalIgnoreCase))
98+
{
99+
preloadOrder = property.Value;
100+
foundProperties++;
101+
}
95102
}
96103

97-
AddResource(resources, descriptor, label, integrity, preloadRel, preloadAs, preloadPriority, preloadCrossorigin, foundProperties);
104+
AddResource(resources, descriptor, label, integrity, preloadRel, preloadAs, preloadPriority, preloadCrossorigin, preloadOrder, foundProperties);
98105
}
99106
}
100107

@@ -128,13 +135,15 @@ private static void AddResource(
128135
string? preloadAs,
129136
string? preloadPriority,
130137
string? preloadCrossorigin,
138+
string? preloadOrder,
131139
#else
132140
string label,
133141
string integrity,
134142
string preloadRel,
135143
string preloadAs,
136144
string preloadPriority,
137145
string preloadCrossorigin,
146+
string preloadOrder,
138147
#endif
139148
int foundProperties)
140149
{
@@ -166,6 +175,10 @@ private static void AddResource(
166175
{
167176
properties[index++] = new ResourceAssetProperty("preloadcrossorigin", preloadCrossorigin);
168177
}
178+
if (preloadOrder != null)
179+
{
180+
properties[index++] = new ResourceAssetProperty("preloadorder", preloadOrder);
181+
}
169182

170183
resources.Add(new ResourceAsset(descriptor.Route, properties));
171184
}

0 commit comments

Comments
 (0)