diff --git a/src/Microsoft.AspNet.Mvc.TagHelpers/Internal/FileVersionProvider.cs b/src/Microsoft.AspNet.Mvc.TagHelpers/Internal/FileVersionProvider.cs index d5ef0eda93..f5c8772c8e 100644 --- a/src/Microsoft.AspNet.Mvc.TagHelpers/Internal/FileVersionProvider.cs +++ b/src/Microsoft.AspNet.Mvc.TagHelpers/Internal/FileVersionProvider.cs @@ -77,8 +77,11 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal { using (var sha256 = SHA256.Create()) { - var hash = sha256.ComputeHash(fileInfo.CreateReadStream()); - return WebEncoders.Base64UrlEncode(hash); + using (var readStream = fileInfo.CreateReadStream()) + { + var hash = sha256.ComputeHash(readStream); + return WebEncoders.Base64UrlEncode(hash); + } } } } diff --git a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/Internal/FileVersionProviderTest.cs b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/Internal/FileVersionProviderTest.cs index e07fe43af0..e5e01826c1 100644 --- a/test/Microsoft.AspNet.Mvc.TagHelpers.Test/Internal/FileVersionProviderTest.cs +++ b/test/Microsoft.AspNet.Mvc.TagHelpers.Test/Internal/FileVersionProviderTest.cs @@ -36,6 +36,38 @@ namespace Microsoft.AspNet.Mvc.TagHelpers.Internal Assert.Equal(expected, result); } + // Verifies if the stream is closed after reading. + [Fact] + public void AddsVersionToFiles_DoesNotLockFileAfterReading() + { + // Arrange + var stream = new MemoryStream(Encoding.UTF8.GetBytes("Hello World!")); + var mockFile = new Mock(); + mockFile.SetupGet(f => f.Exists).Returns(true); + mockFile + .Setup(m => m.CreateReadStream()) + .Returns(stream); + + var mockFileProvider = new Mock(); + mockFileProvider.Setup(fp => fp.GetFileInfo(It.IsAny())) + .Returns(mockFile.Object); + + var hostingEnvironment = new Mock(); + hostingEnvironment.Setup(h => h.WebRootFileProvider).Returns(mockFileProvider.Object); + + var fileVersionProvider = new FileVersionProvider( + hostingEnvironment.Object.WebRootFileProvider, + GetMockCache(), + GetRequestPathBase()); + + // Act + var result = fileVersionProvider.AddFileVersionToPath("/hello/world"); + + // Assert + Assert.False(stream.CanRead); + Assert.Throws(() => fileVersionProvider.AddFileVersionToPath("/hello/world")); + } + [Theory] [InlineData("/testApp/hello/world", true, "/testApp")] [InlineData("/testApp/foo/bar/hello/world", true, "/testApp/foo/bar")]