From c72f9a1977844fc1ac07f7675e88168b79a841dc Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Thu, 14 Dec 2017 15:48:01 +0000 Subject: [PATCH] Simplify in-memory file provider usage by initializing with byte[], not Stream --- .../ReferencedAssemblyFileProvider.cs | 4 ++-- .../Core/FileSystem/IndexHtmlFileProvider.cs | 5 ++--- .../EmbeddedResourceFileProvider.cs | 14 ++++++++++++-- .../FileProviders/InMemoryFileInfo.cs | 16 ++++------------ .../FileProviders/InMemoryFileProvider.cs | 2 +- .../CompositeMountedFileProviderTest.cs | 5 ++--- .../InMemoryFileProviderTest.cs | 7 +++---- 7 files changed, 26 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.Blazor.Build/Core/FileSystem/FrameworkFiles/ReferencedAssemblyFileProvider.cs b/src/Microsoft.Blazor.Build/Core/FileSystem/FrameworkFiles/ReferencedAssemblyFileProvider.cs index 037c286e37..b3b17cc924 100644 --- a/src/Microsoft.Blazor.Build/Core/FileSystem/FrameworkFiles/ReferencedAssemblyFileProvider.cs +++ b/src/Microsoft.Blazor.Build/Core/FileSystem/FrameworkFiles/ReferencedAssemblyFileProvider.cs @@ -16,7 +16,7 @@ namespace Microsoft.Blazor.Build.Core.FileSystem { } - private static IEnumerable<(string, Stream)> ComputeContents( + private static IEnumerable<(string, byte[])> ComputeContents( string rootAssemblyName, ReferencedAssemblyResolver resolver) { @@ -25,7 +25,7 @@ namespace Microsoft.Blazor.Build.Core.FileSystem return foundAssemblies.Values.Select(assembly => ( $"/{assembly.Definition.Name.Name}.dll", - (Stream)new MemoryStream(assembly.Data))); + assembly.Data)); } private static void AddWithReferencesRecursive( diff --git a/src/Microsoft.Blazor.Build/Core/FileSystem/IndexHtmlFileProvider.cs b/src/Microsoft.Blazor.Build/Core/FileSystem/IndexHtmlFileProvider.cs index 69cc89a954..a3570738f7 100644 --- a/src/Microsoft.Blazor.Build/Core/FileSystem/IndexHtmlFileProvider.cs +++ b/src/Microsoft.Blazor.Build/Core/FileSystem/IndexHtmlFileProvider.cs @@ -17,14 +17,13 @@ namespace Microsoft.Blazor.Build.Core.FileSystem { } - private static IEnumerable<(string, Stream)> ComputeContents(string htmlTemplate, string assemblyName, IEnumerable binFiles) + private static IEnumerable<(string, byte[])> ComputeContents(string htmlTemplate, string assemblyName, IEnumerable binFiles) { if (htmlTemplate != null) { var html = GetIndexHtmlContents(htmlTemplate, assemblyName, binFiles); var htmlBytes = Encoding.UTF8.GetBytes(html); - var htmlStream = new MemoryStream(htmlBytes); - yield return ("/index.html", htmlStream); + yield return ("/index.html", htmlBytes); } } diff --git a/src/Microsoft.Blazor.Common/FileProviders/EmbeddedResourceFileProvider.cs b/src/Microsoft.Blazor.Common/FileProviders/EmbeddedResourceFileProvider.cs index eade32fefc..eb7baf78f5 100644 --- a/src/Microsoft.Blazor.Common/FileProviders/EmbeddedResourceFileProvider.cs +++ b/src/Microsoft.Blazor.Common/FileProviders/EmbeddedResourceFileProvider.cs @@ -16,14 +16,24 @@ namespace Microsoft.Blazor.Internal.Common.FileProviders { } - private static IEnumerable<(string, Stream)> ReadEmbeddedResources( + private static IEnumerable<(string, byte[])> ReadEmbeddedResources( Assembly assembly, string resourceNamePrefix) { return assembly.GetManifestResourceNames() .Where(name => name.StartsWith(resourceNamePrefix, StringComparison.Ordinal)) .Select(name => ( name.Substring(resourceNamePrefix.Length), - assembly.GetManifestResourceStream(name))); + ReadManifestResource(assembly, name))); + } + + private static byte[] ReadManifestResource(Assembly assembly, string name) + { + using (var ms = new MemoryStream()) + using (var resourceStream = assembly.GetManifestResourceStream(name)) + { + resourceStream.CopyTo(ms); + return ms.ToArray(); + } } } } diff --git a/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileInfo.cs b/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileInfo.cs index b1c6f9b695..28bd02936c 100644 --- a/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileInfo.cs +++ b/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileInfo.cs @@ -19,13 +19,13 @@ namespace Microsoft.Blazor.Internal.Common.FileProviders public static IFileInfo ForExistingDirectory(string path) => new InMemoryFileInfo(path, isDir: true, exists: true); - public static IFileInfo ForExistingFile(string path, Stream dataStream, DateTimeOffset lastModified) - => new InMemoryFileInfo(path, isDir: false, exists: true, dataStream: dataStream, lastModified: lastModified); + public static IFileInfo ForExistingFile(string path, byte[] data, DateTimeOffset lastModified) + => new InMemoryFileInfo(path, isDir: false, exists: true, data: data, lastModified: lastModified); public static IFileInfo ForNonExistingFile(string path) => new InMemoryFileInfo(path, isDir: false, exists: false); - private InMemoryFileInfo(string physicalPath, bool isDir, bool exists, Stream dataStream = null, DateTimeOffset lastModified = default(DateTimeOffset)) + private InMemoryFileInfo(string physicalPath, bool isDir, bool exists, byte[] data = null, DateTimeOffset lastModified = default(DateTimeOffset)) { _exists = exists; _isDirectory = isDir; @@ -48,15 +48,7 @@ namespace Microsoft.Blazor.Internal.Common.FileProviders } } - if (dataStream != null) - { - using (var ms = new MemoryStream()) - { - dataStream.CopyTo(ms); - _fileData = ms.ToArray(); - dataStream.Dispose(); - } - } + _fileData = data; } public bool Exists => _exists; diff --git a/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileProvider.cs b/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileProvider.cs index eb5ec1868a..0367e9d91e 100644 --- a/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileProvider.cs +++ b/src/Microsoft.Blazor.Common/FileProviders/InMemoryFileProvider.cs @@ -20,7 +20,7 @@ namespace Microsoft.Blazor.Internal.Common.FileProviders // It's convenient to use forward slash, because it matches URL conventions public const char DirectorySeparatorChar = '/'; - public InMemoryFileProvider(IEnumerable<(string, Stream)> contents) : this( + public InMemoryFileProvider(IEnumerable<(string, byte[])> contents) : this( contents.Select(pair => InMemoryFileInfo .ForExistingFile(pair.Item1, pair.Item2, DateTime.Now))) { diff --git a/test/Microsoft.Blazor.Common.Test/CompositeMountedFileProviderTest.cs b/test/Microsoft.Blazor.Common.Test/CompositeMountedFileProviderTest.cs index 37af58a218..18d10cd064 100644 --- a/test/Microsoft.Blazor.Common.Test/CompositeMountedFileProviderTest.cs +++ b/test/Microsoft.Blazor.Common.Test/CompositeMountedFileProviderTest.cs @@ -13,9 +13,8 @@ namespace Microsoft.Blazor.Common.Test { public class CompositeMountedFileProviderTest { - private (string, Stream) TestItem(string name) => TestItem(name, Array.Empty()); - private (string, Stream) TestItem(string name, string data) => TestItem(name, Encoding.UTF8.GetBytes(data)); - private (string, Stream) TestItem(string name, byte[] data) => (name, new MemoryStream(data)); + private (string, byte[]) TestItem(string name) => (name, Array.Empty()); + private (string, byte[]) TestItem(string name, string data) => (name, Encoding.UTF8.GetBytes(data)); private IFileProvider TestFileProvider(params string[] paths) => new InMemoryFileProvider(paths.Select(TestItem)); [Fact] diff --git a/test/Microsoft.Blazor.Common.Test/InMemoryFileProviderTest.cs b/test/Microsoft.Blazor.Common.Test/InMemoryFileProviderTest.cs index 9e4d3579e9..85b558e65a 100644 --- a/test/Microsoft.Blazor.Common.Test/InMemoryFileProviderTest.cs +++ b/test/Microsoft.Blazor.Common.Test/InMemoryFileProviderTest.cs @@ -11,8 +11,7 @@ namespace Microsoft.Blazor.Common.Test { public class InMemoryFileProviderTest { - private (string, Stream) TestItem(string name) => TestItem(name, Array.Empty()); - private (string, Stream) TestItem(string name, byte[] data) => (name, new MemoryStream(data)); + private (string, byte[]) TestItem(string name) => (name, Array.Empty()); [Fact] public void RequiresPathsToStartWithSlash() @@ -38,8 +37,8 @@ namespace Microsoft.Blazor.Common.Test // Arrange var instance = new InMemoryFileProvider(new[] { - TestItem("/dirA/item", Encoding.UTF8.GetBytes("Contents of /dirA/item")), - TestItem("/dirB/item", Encoding.UTF8.GetBytes("Contents of /dirB/item")) + ("/dirA/item", Encoding.UTF8.GetBytes("Contents of /dirA/item")), + ("/dirB/item", Encoding.UTF8.GetBytes("Contents of /dirB/item")) }); // Act