From 6e0b0b03c7a1396f3901883699e7ca441ab733b8 Mon Sep 17 00:00:00 2001 From: James South Date: Fri, 1 Aug 2014 15:42:50 +0100 Subject: [PATCH] Fixing virtual directory mapping issue Former-commit-id: 1adc402cdb870e1399e0d8c297268371237aafa2 --- .../NET45/Caching/DiskCache.cs | 77 +++++++++---------- .../HttpModules/ImageProcessingModule.cs | 6 +- 2 files changed, 38 insertions(+), 45 deletions(-) diff --git a/src/ImageProcessor.Web/NET45/Caching/DiskCache.cs b/src/ImageProcessor.Web/NET45/Caching/DiskCache.cs index be6b88744b..c6300c64d5 100644 --- a/src/ImageProcessor.Web/NET45/Caching/DiskCache.cs +++ b/src/ImageProcessor.Web/NET45/Caching/DiskCache.cs @@ -49,14 +49,14 @@ namespace ImageProcessor.Web.Caching private const int MaxFilesCount = 100; /// - /// The absolute path to virtual cache path on the server. + /// The virtual cache path. /// - private static readonly string AbsoluteCachePath = HostingEnvironment.MapPath(ImageProcessorConfiguration.Instance.VirtualCachePath); + private static readonly string VirtualCachePath = ImageProcessorConfiguration.Instance.VirtualCachePath; /// - /// The request for the image. + /// The absolute path to virtual cache path on the server. /// - private readonly HttpRequest request; + private static readonly string AbsoluteCachePath = HostingEnvironment.MapPath(ImageProcessorConfiguration.Instance.VirtualCachePath); /// /// The request path for the image. @@ -72,15 +72,22 @@ namespace ImageProcessor.Web.Caching /// The image name /// private readonly string imageName; + + /// + /// The physical cached path. + /// + private string physicalCachedPath; + + /// + /// The virtual cached path. + /// + private string virtualCachedPath; #endregion #region Constructors /// /// Initializes a new instance of the class. /// - /// - /// The request for the image. - /// /// /// The request path for the image. /// @@ -90,53 +97,41 @@ namespace ImageProcessor.Web.Caching /// /// The image name. /// - public DiskCache(HttpRequest request, string requestPath, string fullPath, string imageName) + public DiskCache(string requestPath, string fullPath, string imageName) { - this.request = request; this.requestPath = requestPath; this.fullPath = fullPath; this.imageName = imageName; + + // Get the physical and virtual paths. + this.GetCachePaths(); } #endregion - #region Methods - #region Internal /// - /// Gets the full transformed cached path for the image. - /// The images are stored in paths that are based upon the SHA1 of their full request path - /// taking the individual characters of the hash to determine their location. - /// This allows us to store millions of images. + /// Gets the cached path. /// - /// The full cached path for the image. - internal Task GetCachePathAsync() + public string CachedPath { - return TaskHelpers.Run(this.GetCachePath); + get + { + return this.physicalCachedPath; + } } /// - /// Gets the virtual path to the cached processed image. + /// Gets the cached path. /// - /// - /// The path to the cached image. - /// - /// - /// The virtual path to the cached processed image. - /// - internal string GetVirtualCachedPath(string cachedPath) + public string VirtualCachedPath { - string applicationPath = this.request.PhysicalApplicationPath; - string virtualDir = this.request.ApplicationPath; - virtualDir = virtualDir == "/" ? virtualDir : (virtualDir + "/"); - - if (applicationPath != null) + get { - return cachedPath.Replace(applicationPath, virtualDir).Replace(@"\", "/"); + return this.virtualCachedPath; } - - throw new InvalidOperationException( - "We can only map an absolute back to a relative path if the application path is available."); } + #region Methods + #region Internal /// /// Adds an image to the cache. /// @@ -256,15 +251,13 @@ namespace ImageProcessor.Web.Caching } /// - /// Gets the full transformed cached path for the image. + /// Gets the full transformed cached paths for the image. /// The images are stored in paths that are based upon the SHA1 of their full request path /// taking the individual characters of the hash to determine their location. /// This allows us to store millions of images. /// - /// The full cached path for the image. - private string GetCachePath() + private void GetCachePaths() { - string cachedPath = string.Empty; string streamHash = string.Empty; if (AbsoluteCachePath != null) @@ -302,16 +295,16 @@ namespace ImageProcessor.Web.Caching // Collision rate of about 1 in 10000 for the folder structure. string pathFromKey = string.Join("\\", encryptedName.ToCharArray().Take(6)); + string virtualPathFromKey = pathFromKey.Replace(@"\", "/"); string cachedFileName = string.Format( "{0}.{1}", encryptedName, !string.IsNullOrWhiteSpace(parsedExtension) ? parsedExtension.Replace(".", string.Empty) : fallbackExtension); - cachedPath = Path.Combine(AbsoluteCachePath, pathFromKey, cachedFileName); + this.physicalCachedPath = Path.Combine(AbsoluteCachePath, pathFromKey, cachedFileName); + this.virtualCachedPath = Path.Combine(VirtualCachePath, virtualPathFromKey, cachedFileName).Replace(@"\", "/"); } - - return cachedPath; } /// diff --git a/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs b/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs index c1ee8355e2..0f4db86f35 100644 --- a/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs +++ b/src/ImageProcessor.Web/NET45/HttpModules/ImageProcessingModule.cs @@ -338,15 +338,15 @@ namespace ImageProcessor.Web.HttpModules } // Create a new cache to help process and cache the request. - DiskCache cache = new DiskCache(request, requestPath, fullPath, imageName); - string cachedPath = await cache.GetCachePathAsync(); + DiskCache cache = new DiskCache(requestPath, fullPath, imageName); + string cachedPath = cache.CachedPath; // Since we are now rewriting the path we need to check again that the current user has access // to the rewritten path. // Get the user for the current request // If the user is anonymous or authentication doesn't work for this suffix avoid a NullReferenceException // in the UrlAuthorizationModule by creating a generic identity. - string virtualCachedPath = cache.GetVirtualCachedPath(cachedPath); + string virtualCachedPath = cache.VirtualCachedPath; IPrincipal user = context.User ?? new GenericPrincipal(new GenericIdentity(string.Empty, string.Empty), new string[0]);