diff --git a/src/StaticWebAssetsSdk/Tasks/Data/ContentTypeProvider.cs b/src/StaticWebAssetsSdk/Tasks/Data/ContentTypeProvider.cs index 3a6d7f9e85ba..9b9afdb73f11 100644 --- a/src/StaticWebAssetsSdk/Tasks/Data/ContentTypeProvider.cs +++ b/src/StaticWebAssetsSdk/Tasks/Data/ContentTypeProvider.cs @@ -459,7 +459,7 @@ private bool TryGetMapping(StaticWebAssetGlobMatcher.MatchContext context, TaskL var match = _matcher.Match(context); if (match.IsMatch) { - if (_builtInMappings.TryGetValue(match.Pattern, out mapping) || _customMappings.TryGetValue(match.Pattern, out mapping)) + if (_customMappings.TryGetValue(match.Pattern, out mapping) || _builtInMappings.TryGetValue(match.Pattern, out mapping)) { log.LogMessage(MessageImportance.Low, $"Matched {relativePath} to {mapping.MimeType} using pattern {match.Pattern}"); return true; diff --git a/test/Microsoft.NET.Sdk.StaticWebAssets.Tests/StaticWebAssets/ContentTypeProviderTests.cs b/test/Microsoft.NET.Sdk.StaticWebAssets.Tests/StaticWebAssets/ContentTypeProviderTests.cs index 4cc3f29a3c65..88805b73dad2 100644 --- a/test/Microsoft.NET.Sdk.StaticWebAssets.Tests/StaticWebAssets/ContentTypeProviderTests.cs +++ b/test/Microsoft.NET.Sdk.StaticWebAssets.Tests/StaticWebAssets/ContentTypeProviderTests.cs @@ -114,6 +114,57 @@ public void GetContentType_ReturnsTextPlainForCompressedTextFiles(string path) Assert.Equal("text/plain", contentType.MimeType); } + [Fact] + public void GetContentType_CustomMappingOverridesBuiltInMapping() + { + // Arrange + var customMapping = new ContentTypeMapping("text/html", "no-store, must-revalidate, no-cache", "*.html", 2); + var provider = new ContentTypeProvider([customMapping]); + + // Act + var contentType = provider.ResolveContentTypeMapping(CreateContext("index.html"), _log); + + // Assert + Assert.Equal("text/html", contentType.MimeType); + Assert.Equal("no-store, must-revalidate, no-cache", contentType.Cache); + Assert.Equal("*.html", contentType.Pattern); + Assert.Equal(2, contentType.Priority); + } + + [Fact] + public void GetContentType_CustomMappingOverridesBuiltInMappingForCompressedFiles() + { + // Arrange + var customMapping = new ContentTypeMapping("text/html", "no-store, must-revalidate, no-cache", "*.html", 2); + var provider = new ContentTypeProvider([customMapping]); + + // Act + var contentType = provider.ResolveContentTypeMapping(CreateContext("index.html.gz"), _log); + + // Assert + Assert.Equal("text/html", contentType.MimeType); + Assert.Equal("no-store, must-revalidate, no-cache", contentType.Cache); + Assert.Equal("*.html", contentType.Pattern); + Assert.Equal(2, contentType.Priority); + } + + [Fact] + public void GetContentType_CustomJavaScriptMappingOverridesBuiltIn() + { + // Arrange + var customMapping = new ContentTypeMapping("text/javascript", "max-age=3600", "*.js", 3); + var provider = new ContentTypeProvider([customMapping]); + + // Act + var contentType = provider.ResolveContentTypeMapping(CreateContext("app.js"), _log); + + // Assert + Assert.Equal("text/javascript", contentType.MimeType); + Assert.Equal("max-age=3600", contentType.Cache); + Assert.Equal("*.js", contentType.Pattern); + Assert.Equal(3, contentType.Priority); + } + private class TestTaskLoggingHelper : TaskLoggingHelper { public TestTaskLoggingHelper() : base(new TestTask())