Skip to content

Commit 234296c

Browse files
committed
Manifest detection is more lenient regarding content-type response header
1 parent 874d375 commit 234296c

5 files changed

Lines changed: 14 additions & 11 deletions

File tree

apps/pwabuilder/Common/Constants.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ public static class Constants
44
{
55
public const string DesktopUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 Edg/139.0.0.0 PWABuilderHttpAgent";
66
public const string PwaBuilderAgentHttpClient = "PWABuilderHttpAgent";
7-
public static readonly IReadOnlyCollection<string> ManifestMimeTypes =
7+
public static readonly IReadOnlyCollection<string> ManifestMimeTypes =
88
[
99
"application/manifest+json",
1010
"application/json",
11-
"text/json"
11+
"text/json",
12+
"application/octet-stream" // Some servers incorrectly serve manifests with this MIME type, but browsers still consider such manifests valid, so we will too.
1213
];
1314
public static readonly IReadOnlyCollection<string> JavascriptMimeTypes = [
1415
"application/javascript",

apps/pwabuilder/Services/ManifestDetector.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ public ManifestDetector(WebStringCache webStringCache, IPuppeteerService puppete
130130

131131
try
132132
{
133-
var manifestJson = await webStringCache.Get(manifestUrl, Constants.ManifestMimeTypes, cancelToken, 1024 * 1024 * 5);
133+
var manifestJson = await webStringCache.Get(manifestUrl, Constants.ManifestMimeTypes, logger, cancelToken, 1024 * 1024 * 5);
134134
if (string.IsNullOrWhiteSpace(manifestJson))
135135
{
136136
logger.LogWarning("Manifest at {manifestUrl} returned empty content.", manifestUrl);
@@ -187,7 +187,7 @@ public ManifestDetector(WebStringCache webStringCache, IPuppeteerService puppete
187187
{
188188
try
189189
{
190-
var htmlString = await webStringCache.Get(appUrl, ["text/html"], cancelToken);
190+
var htmlString = await webStringCache.Get(appUrl, ["text/html"], logger, cancelToken);
191191
return htmlString;
192192
}
193193
catch (Exception htmlFetchError)

apps/pwabuilder/Services/ServiceWorkerAnalyzer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ private async Task<List<string>> TryFindAndFetchImportScriptsAsync(string code,
254254
// Fetch the content of each script
255255
var contents = new List<string>();
256256
var scriptFetches = normalizedUrls
257-
.Select(url => webCache.Get(url, Constants.JavascriptMimeTypes, cancelToken));
257+
.Select(url => webCache.Get(url, Constants.JavascriptMimeTypes, logger, cancelToken));
258258
try
259259
{
260260
var scriptResults = await Task.WhenAll(scriptFetches);

apps/pwabuilder/Services/ServiceWorkerDetector.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public ServiceWorkerDetector(WebStringCache webStringCache, IPuppeteerService pu
135135

136136
try
137137
{
138-
var serviceWorkerJs = await webStringCache.Get(serviceWorkerUrl, Constants.JavascriptMimeTypes, cancelToken, maxSizeInBytes: 1024 * 1024 * 1);
138+
var serviceWorkerJs = await webStringCache.Get(serviceWorkerUrl, Constants.JavascriptMimeTypes, logger, cancelToken, maxSizeInBytes: 1024 * 1024 * 1);
139139
if (serviceWorkerJs == null)
140140
{
141141
logger.LogWarning("Service worker at {serviceWorkerUrl} returned null content.", serviceWorkerUrl);
@@ -189,7 +189,7 @@ public ServiceWorkerDetector(WebStringCache webStringCache, IPuppeteerService pu
189189
{
190190
try
191191
{
192-
var html = await webStringCache.Get(appUrl, ["text/html"], cancelToken);
192+
var html = await webStringCache.Get(appUrl, ["text/html"], logger, cancelToken);
193193
return html;
194194
}
195195
catch (Exception htmlFetchError)

apps/pwabuilder/Services/WebStringCache.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ public WebStringCache(IDatabase redis, IHttpClientFactory httpClientFactory, ILo
3535
/// <param name="url">The URL to fetch.</param>
3636
/// <param name="accepts"> The type of content to accept (e.g., "text/html", "application/json").</param>
3737
/// <param name="cancelToken">The cancellation token.</param>
38+
/// <param name="logger">An optional logger to log the results to.</param>
39+
/// <param name="maxSizeInBytes">The maximum size of the resource to fetch
3840
/// <returns>The resource at the given URL.</returns>
39-
public async Task<string?> Get(Uri url, IEnumerable<string> accepts, CancellationToken cancelToken, int maxSizeInBytes = defaultMaxSizeInBytes)
41+
public async Task<string?> Get(Uri url, IEnumerable<string> accepts, ILogger? logger, CancellationToken cancelToken, int maxSizeInBytes = defaultMaxSizeInBytes)
4042
{
4143
var cacheKey = GetCacheKey(url, accepts);
4244
var cached = await redis.StringGetAsync(cacheKey);
@@ -46,7 +48,7 @@ public WebStringCache(IDatabase redis, IHttpClientFactory httpClientFactory, ILo
4648
}
4749

4850
// It's not in the cache. Fetch it and if fetch was successful, put it in the cache.
49-
var webString = await TryGetResource(url, accepts, cancelToken);
51+
var webString = await TryGetResource(url, accepts, maxSizeInBytes, logger ?? this.logger, cancelToken);
5052
if (webString != null)
5153
{
5254
await redis.StringSetAsync(cacheKey, webString, cacheExpiration);
@@ -55,11 +57,11 @@ public WebStringCache(IDatabase redis, IHttpClientFactory httpClientFactory, ILo
5557
return webString;
5658
}
5759

58-
private async Task<string?> TryGetResource(Uri appUrl, IEnumerable<string> accepts, CancellationToken cancelToken)
60+
private async Task<string?> TryGetResource(Uri appUrl, IEnumerable<string> accepts, int maxSizeInBytes, ILogger logger, CancellationToken cancelToken)
5961
{
6062
try
6163
{
62-
var webString = await http.GetStringAsync(appUrl, accepts, defaultMaxSizeInBytes, cancelToken);
64+
var webString = await http.GetStringAsync(appUrl, accepts, maxSizeInBytes, cancelToken);
6365
if (webString == null)
6466
{
6567
logger.LogWarning("No response received for {appUrl} with accept {accept}.", appUrl, accepts);

0 commit comments

Comments
 (0)