Beispiel #1
0
        public IDictionary <Guid, string> GetSavedUrls()
        {
            RRTracer.Trace("SqlServerStore Looking for previously saved content.");
            var files = repository.GetActiveFiles();

            return(files.ToDictionary(file => uriBuilder.ParseKey(file), file => uriBuilder.BuildResourceUrl(uriBuilder.ParseKey(file), uriBuilder.ParseSignature(file), RRContainer.GetAllResourceTypes().SingleOrDefault(x => file.EndsWith(x.FileName)).GetType())));
        }
Beispiel #2
0
        protected virtual string ProcessCss(string url)
        {
            RRTracer.Trace("Beginning Processing {0}", url);
            var urlParts = url.Split(new[] { '^' }, 2);

            url = urlParts[0];
            RRTracer.Trace("Beginning to Download {0}", url);
            var cssContent = WebClientWrapper.DownloadString <CssResource>(url);

            RRTracer.Trace("Finished Downloading {0}", url);
            RRTracer.Trace("Beginning to absolutize urls in {0}", url);
            cssContent = MakeRelativeUrlsAbsoluteAndRemoveComments(cssContent, url);
            RRTracer.Trace("finished absolutizing urls in {0}", url);
            RRTracer.Trace("Beginning to expand imports in {0}", url);
            cssContent = ExpandImports(cssContent, url);
            RRTracer.Trace("Finished expanding imports in {0}", url);
            if (!configuration.ImageSpritingDisabled)
            {
                RRTracer.Trace("Beginning to process sprites in {0}", url);
                ProcessSprites(cssContent);
                RRTracer.Trace("Finished processing sprites in {0}", url);
            }
            if (urlParts.Length > 1)
            {
                RRTracer.Trace("Beginning to wrap media in {0}", url);
                cssContent = WrapMedia(cssContent, urlParts[1]);
                RRTracer.Trace("finished wraping media in {0}", url);
            }
            return(cssContent);
        }
        public DbDiskCache(IFileWrapper fileWrapper, IRRConfiguration configuration, IUriBuilder uriBuilder) : base(fileWrapper, configuration, uriBuilder, null)
        {
            RRTracer.Trace("Creating db disk cache");
            const int interval = 1000 * 60 * 5;

            timer = new Timer(PurgeOldFiles, null, 0, interval);
        }
Beispiel #4
0
        private void OnChange(object sender, FileSystemEventArgs e)
        {
            var path = e.FullPath;

            RRTracer.Trace("watcher watched {0}", path);
            var guid             = uriBuilder.ParseKey(path.Replace('\\', '/'));
            var contentSignature = uriBuilder.ParseSignature(path.Replace('\\', '/'));

            if (guid != Guid.Empty)
            {
                var resourceType = RRContainer.Current.GetAllInstances <IResourceType>().SingleOrDefault(x => path.EndsWith(x.FileName, true, CultureInfo.InvariantCulture));
                if (resourceType != null)
                {
                    RRTracer.Trace("New Content {0} and watched: {1}", e.ChangeType, path);
                    if (e.ChangeType == WatcherChangeTypes.Deleted)
                    {
                        ReductionRepository.RemoveReduction(guid);
                    }
                    if ((e.ChangeType == WatcherChangeTypes.Created || e.ChangeType == WatcherChangeTypes.Changed))
                    {
                        ReductionRepository.AddReduction(guid, uriBuilder.BuildResourceUrl(guid, contentSignature, resourceType.GetType()));
                    }
                }
            }
        }
        public virtual void Add(BackgroundImageClass image)
        {
            var imageKey = new ImageMetadata(image);

            if (RRContainer.Current.GetAllInstances <IFilter>().Where(x => x is SpriteFilter).FirstOrDefault(y => y.IgnoreTarget(new SpriteFilterContext(image))) != null || spriteList.ContainsKey(imageKey))
            {
                return;
            }
            SpritedImage spritedImage;

            try
            {
                spritedImage = SpriteContainer.AddImage(image);
            }
            catch (Exception ex)
            {
                var message          = string.Format("There were errors reducing {0}", image.ImageUrl);
                var wrappedException =
                    new ApplicationException(message, ex);
                RRTracer.Trace(message);
                RRTracer.Trace(ex.ToString());
                if (Registry.CaptureErrorAction != null)
                {
                    Registry.CaptureErrorAction(wrappedException);
                }
                return;
            }
            spriteList.Add(imageKey, spritedImage);
            if (SpriteContainer.Size >= config.SpriteSizeLimit || (SpriteContainer.Colors >= config.SpriteColorLimit && !config.ImageQuantizationDisabled && !config.ImageOptimizationDisabled))
            {
                Flush();
            }
        }
 private void DoTransform(byte[] buffer, ref int startTransformPosition)
 {
     currentStartStringsToSkip = new bool[currentStartStringsToSkip.Length];
     if ((startTransformPosition - actualOffset) >= 0)
     {
         BaseStream.Write(buffer, actualOffset, startTransformPosition - actualOffset);
     }
     try
     {
         var transformed =
             encoding.GetBytes(responseTransformer.Transform(encoding.GetString(transformBuffer.ToArray())));
         BaseStream.Write(transformed, 0, transformed.Length);
     }
     catch (Exception ex)
     {
         var message          = string.Format("There were errors transforming {0}", encoding.GetString(transformBuffer.ToArray()));
         var wrappedException =
             new ApplicationException(message, ex);
         RRTracer.Trace(message);
         RRTracer.Trace(ex.ToString());
         if (Registry.CaptureErrorAction != null)
         {
             Registry.CaptureErrorAction(wrappedException);
         }
         BaseStream.Write(transformBuffer.ToArray(), 0, transformBuffer.Count);
     }
     startTransformPosition = 0;
     transformBuffer.Clear();
 }
Beispiel #7
0
        public IDictionary <Guid, string> GetSavedUrls()
        {
            RRTracer.Trace("LocalDiskStore Looking for previously saved content.");
            var dic = new Dictionary <Guid, string>();

            if (configuration == null || string.IsNullOrEmpty(configuration.SpritePhysicalPath))
            {
                return(dic);
            }

            var activeFiles = FileWrapper.GetDatedFiles(configuration.SpritePhysicalPath, "*RequestReduce*");

            return((from files in activeFiles
                    where !files.FileName.Contains("-Expired-") && uriBuilder.ParseKey(files.FileName.Replace("\\", "/")) != Guid.Empty
                    group files by uriBuilder.ParseKey(files.FileName.Replace("\\", "/"))
                    into filegroup
                    join files2 in activeFiles on new { k = filegroup.Key, u = filegroup.Max(m => m.CreatedDate) } equals
                    new { k = uriBuilder.ParseKey(files2.FileName.Replace("\\", "/")), u = files2.CreatedDate }
                    select files2.FileName)
                   .ToDictionary(file => uriBuilder.ParseKey(file.Replace("\\", "/")),
                                 file =>
                                 uriBuilder.BuildResourceUrl(uriBuilder.ParseKey(file.Replace("\\", "/")),
                                                             uriBuilder.ParseSignature(file.Replace("\\", "/")),
                                                             RRContainer.Current.GetAllInstances <IResourceType>().
                                                             SingleOrDefault(x => file.EndsWith(x.FileName, true, CultureInfo.InvariantCulture)).GetType())));
        }
        public static void InstallFilter(HttpContextBase context)
        {
            var request = context.Request;
            var config  = RRContainer.Current.GetInstance <IRRConfiguration>();

            if (context.Items.Contains(ContextKey) ||
                (config.CssProcessingDisabled && config.JavaScriptProcessingDisabled) ||
                context.Response.IsRequestBeingRedirected ||
                RRContainer.Current.GetAllInstances <IFilter>().Where(x => x is PageFilter).FirstOrDefault(y => y.IgnoreTarget(new PageFilterContext(context.Request))) != null)
            {
                return;
            }

            if (request.QueryString["RRFilter"] != null && request.QueryString["RRFilter"].Equals("disabled", StringComparison.OrdinalIgnoreCase))
            {
                context.Response.Cache.SetCacheability(HttpCacheability.Private);
                return;
            }

            var hostingEnvironment = RRContainer.Current.GetInstance <IHostingEnvironmentWrapper>();

            if (string.IsNullOrEmpty(config.ResourcePhysicalPath))
            {
                config.ResourcePhysicalPath = hostingEnvironment.MapPath(config.ResourceVirtualPath);
            }

            var oldFilter = context.Response.Filter; //suppresses a asp.net3.5 bugg

            context.Response.Filter = RRContainer.Current.GetInstance <AbstractFilter>();
            context.Items.Add(ContextKey, new object());
            RRTracer.Trace("Attaching Filter to {0}", request.RawUrl);
        }
Beispiel #9
0
        public void InstallFilter(HttpContextBase context)
        {
            RRTracer.Trace("Entering Module");
            var request = context.Request;
            var config  = RRContainer.Current.GetInstance <IRRConfiguration>();

            if (context.Items.Contains(CONTEXT_KEY) ||
                context.Response.ContentType != "text/html" ||
                (request.QueryString["RRFilter"] != null && request.QueryString["RRFilter"].Equals("disabled", StringComparison.OrdinalIgnoreCase)) ||
                (config.CssProcessingDisabled && config.JavaScriptProcessingDisabled) ||
                context.Response.StatusCode == 302 ||
                context.Response.StatusCode == 301 ||
                request.RawUrl == "/favicon.ico" ||
                RRContainer.Current.GetAllInstances <IFilter>().Where(x => x is PageFilter).FirstOrDefault(y => y.IgnoreTarget(new PageFilterContext(context.Request))) != null ||
                IsInRRContentDirectory(context))
            {
                return;
            }

            if (string.IsNullOrEmpty(config.SpritePhysicalPath))
            {
                config.SpritePhysicalPath = context.Server.MapPath(config.SpriteVirtualPath);
            }

            var oldFilter = context.Response.Filter; //suppresses a asp.net3.5 bug

            context.Response.Filter = RRContainer.Current.GetInstance <AbstractFilter>();
            context.Items.Add(CONTEXT_KEY, new object());
            RRTracer.Trace("Attaching Filter to {0}", request.RawUrl);
        }
 protected override string ProcessResource(Guid key, IEnumerable <string> urls, string host)
 {
     RRTracer.Trace("beginning to merge js");
     try
     {
         var mergedJSBuilder = new StringBuilder();
         foreach (var url in urls)
         {
             mergedJSBuilder.Append(ProcessJavaScript(url).Trim());
             if (mergedJSBuilder.Length > 0 && (mergedJSBuilder[mergedJSBuilder.Length - 1] != ';'))
             {
                 mergedJSBuilder.Append(";");
                 RRTracer.Trace("Appending missing semicolon to {0}", url);
             }
             mergedJSBuilder.AppendLine();
         }
         RRTracer.Trace("finished merging js with a length of {0}", mergedJSBuilder.Length);
         return(mergedJSBuilder.ToString());
     }
     catch (NearFutureJavascriptException)
     {
         RRTracer.Trace("catching near future exception");
         return(null);
     }
 }
        protected virtual string ProcessJavaScript(string url)
        {
            RRTracer.Trace("Beginning Processing {0}", url);
            string jsContent = string.Empty;

            url = url.Replace("&amp;", "&");
            RRTracer.Trace("Beginning to Download {0}", url);
            using (var response = WebClientWrapper.Download <JavaScriptResource>(url))
            {
                if (response == null)
                {
                    RRTracer.Trace("Response is null for {0}", url);
                    return(null);
                }
                var expires = response.Headers["Expires"];
                try
                {
                    if (!string.IsNullOrEmpty(expires) && DateTime.Parse(expires) < DateTime.Now.AddDays(6))
                    {
                        RRTracer.Trace("{0} expires in less than a week", url);
                        AddUrlToIgnores(url);
                    }
                }
                catch (FormatException) { RRTracer.Trace("Format exception thrown parsing expires of {0}", url); }

                var cacheControl = response.Headers["Cache-Control"];
                if (!string.IsNullOrEmpty(cacheControl))
                {
                    var cacheControlVals = cacheControl.ToLower().Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (var val in cacheControlVals)
                    {
                        try
                        {
                            if ((val.Contains("no-") || (val.Contains("max-age") && Int32.Parse(val.Trim().Remove(0, 8)) < (60 * 60 * 24 * 7))))
                            {
                                RRTracer.Trace("{0} max-age in less than a week", url);
                                AddUrlToIgnores(url);
                            }
                        }
                        catch (FormatException) { RRTracer.Trace("Format exception thrown parsing max-age of {0}", url); }
                    }
                }
                using (var responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (var streamDecoder = responseDecoder.GetDecodableStream(responseStream, response.Headers["Content-Encoding"]))
                        {
                            using (var streameader = new StreamReader(streamDecoder, Encoding.UTF8))
                            {
                                jsContent = streameader.ReadToEnd();
                                RRTracer.Trace("content of {0} read and has {1} bytes and a length of {2}", url, response.ContentLength, jsContent.Length);
                            }
                        }
                    }
                }
            }
            return(jsContent);
        }
Beispiel #12
0
 public virtual void Dispose()
 {
     if (configuration.IsFullTrust)
     {
         ShutdownWatcher();
     }
     RRTracer.Trace("Local Disk Store Disposed.");
 }
Beispiel #13
0
 public void RemoveReduction(Guid key)
 {
     lock (lockObject)
     {
         dictionary.Remove(key);
     }
     RRTracer.Trace("Reduction {0} removed.", key);
 }
Beispiel #14
0
 public SqlServerStore(IUriBuilder uriBuilder, IFileRepository repository, LocalDiskStore fileStore, IReductionRepository reductionRepository)
 {
     RRTracer.Trace("Sql Server Store Created.");
     this.uriBuilder          = uriBuilder;
     this.repository          = repository;
     FileStore                = fileStore;
     this.reductionRepository = reductionRepository;
 }
Beispiel #15
0
 private void ProcessQueue()
 {
     RRTracer.Trace("Process Queue Thread Started");
     while (IsRunning)
     {
         ProcessQueuedItem();
         Thread.Sleep(100);
     }
 }
Beispiel #16
0
        private string DoTransform <T>(string preTransform, StringBuilder urls, List <string> transformableMatches, string noCommentTransform) where T : IResourceType
        {
            var resource = RRContainer.Current.GetInstance <T>();

            RRTracer.Trace("Looking for reduction for {0}", urls);
            var transform = reductionRepository.FindReduction(urls.ToString());

            if (transform != null)
            {
                RRTracer.Trace("Reduction found for {0}", urls);
                if (uriBuilder.ParseSignature(transform) != Guid.Empty.RemoveDashes())
                {
                    var firstScript =
                        RRContainer.Current.GetInstance <JavaScriptResource>().ResourceRegex.Match(noCommentTransform);
                    var firstScriptIndex = firstScript.Success ? preTransform.IndexOf(firstScript.ToString(), StringComparison.Ordinal) : -1;
                    var insertionIdx     = (firstScript.Success && firstScriptIndex <
                                            preTransform.IndexOf(transformableMatches[0], StringComparison.Ordinal) && resource is CssResource)
                                           ? firstScriptIndex - 1
                                           : preTransform.IndexOf(transformableMatches[0], StringComparison.Ordinal) - 1;
                    preTransform = preTransform.Insert(insertionIdx + 1, resource.TransformedMarkupTag(transform));
                }
                var result = preTransform;
                foreach (var match in transformableMatches)
                {
                    var idx = result.IndexOf(match, StringComparison.Ordinal);
                    result = result.Remove(idx, match.Length);
                    if (idx == result.Length)
                    {
                        continue;
                    }
                    if (result[idx] == '\r')
                    {
                        result = result.Remove(idx, 1);
                    }
                    if (result[idx] == '\n')
                    {
                        result = result.Remove(idx, 1);
                    }
                }
                return(result);
            }
            var host = string.Empty;

            if (!string.IsNullOrEmpty(config.ContentHost))
            {
                var uri = context.Request.Url;
                if (uri != null)
                {
                    host = string.Format("{0}://{1}/", uri.Scheme, uri.Host);
                }
            }
            reducingQueue.Enqueue(new QueueItem <T> {
                Urls = urls.ToString(), Host = host
            });
            RRTracer.Trace("No reduction found for {0}. Enqueuing.", urls);
            return(preTransform);
        }
Beispiel #17
0
        private void ProcessSprites(string cssContent)
        {
            var newImages = cssImageTransformer.ExtractImageUrls(cssContent);

            foreach (var imageUrl in newImages)
            {
                RRTracer.Trace("Adding {0}", imageUrl.ImageUrl);
                spriteManager.Add(imageUrl);
                RRTracer.Trace("Finished adding {0}", imageUrl.ImageUrl);
            }
        }
 public override void Flush()
 {
     if (isAdjacent)
     {
         var transformed =
             encoding.GetBytes(responseTransformer.Transform(encoding.GetString(transformBuffer.ToArray())));
         BaseStream.Write(transformed, 0, transformed.Length);
         transformBuffer.Clear();
     }
     BaseStream.Flush();
     RRTracer.Trace("Flushing Filter");
 }
Beispiel #19
0
 public ReducingQueue(IReductionRepository reductionRepository, IStore store)
 {
     RRTracer.Trace("Instantiating new Reducing queue.");
     queueLock           = new ReaderWriterLockSlim();
     ReductionRepository = reductionRepository;
     Store            = store;
     BackgroundThread = new Thread(ProcessQueue)
     {
         IsBackground = true
     };
     BackgroundThread.Start();
 }
        public void HandleRRFlush(HttpContextBase httpContextWrapper)
        {
            var url = EnsurePath(httpContextWrapper.Request.RawUrl);

            if (!IsInRRContentDirectory(httpContextWrapper) ||
                (!url.ToLowerInvariant().Contains("/flush/") &&
                 !url.ToLowerInvariant().Contains("/flushfailures/")))
            {
                return;
            }

            var config             = RRContainer.Current.GetInstance <IRRConfiguration>();
            var hostingEnvironment = RRContainer.Current.GetInstance <IHostingEnvironmentWrapper>();
            var ipfilter           = RRContainer.Current.GetInstance <IIpFilter>();

            if (string.IsNullOrEmpty(config.SpritePhysicalPath))
            {
                config.SpritePhysicalPath = hostingEnvironment.MapPath(config.SpriteVirtualPath);
            }
            var user = httpContextWrapper.User == null ? string.Empty : httpContextWrapper.User.Identity.Name;

            if ((config.AuthorizedUserList.AllowsAnonymous() || config.AuthorizedUserList.Contains(user)) &&
                ipfilter.IsAuthorizedIpAddress(httpContextWrapper))
            {
                if (url.ToLowerInvariant().Contains("/flushfailures/"))
                {
                    var queue = RRContainer.Current.GetInstance <IReducingQueue>();
                    queue.ClearFailures();
                    RRTracer.Trace("Failures Cleared");
                }
                else
                {
                    var uriBuilder = RRContainer.Current.GetInstance <IUriBuilder>();
                    var key        = uriBuilder.ParseKey(url.ToLower().Replace("/flush/rrflush.aspx/", "-flush"));
                    if (key == Guid.Empty)
                    {
                        key = uriBuilder.ParseKey(url.ToLower().Replace("/flush/", "-flush"));
                    }
                    var store = RRContainer.Current.GetInstance <IStore>();
                    store.Flush(key);
                    RRTracer.Trace("{0} Flushed {1}", user, key);
                }
                if (HttpContext.Current != null)
                {
                    httpContextWrapper.Response.Redirect(string.Format("{0}/dashboard", config.SpriteVirtualPath));
                }
            }
            else
            {
                httpContextWrapper.Response.StatusCode = 401;
            }
        }
        public override void Write(byte[] buffer, int offset, int count)
        {
            watch.Start();

            RRTracer.Trace("Beginning Filter Write");
            if (Closed)
            {
                throw new ObjectDisposedException("ResponseFilter");
            }
            originalOffset = actualOffset = offset;
            actualLength   = count;

            var startTransformPosition = 0;
            var endTransformPosition   = 0;

            for (var idx = offset; idx < (count + offset); idx++)
            {
                matchPosition = HandleMatch(ref idx, buffer[idx], buffer, ref startTransformPosition, ref endTransformPosition);
            }

            RRTracer.Trace("Response filter state is {0}", state);
            switch (state)
            {
            case SearchState.LookForStart:
                if (endTransformPosition > 0)
                {
                    if ((actualOffset + actualLength) - endTransformPosition > 0)
                    {
                        BaseStream.Write(buffer, endTransformPosition, (actualOffset + actualLength) - endTransformPosition);
                    }
                }
                else
                {
                    BaseStream.Write(buffer, actualOffset, actualLength);
                }
                break;

            case SearchState.MatchingStart:
            case SearchState.MatchingStartClose:
            case SearchState.LookForStop:
            case SearchState.MatchingStop:
            case SearchState.LookForAdjacentScript:
                if (startTransformPosition > actualOffset)
                {
                    BaseStream.Write(buffer, actualOffset, startTransformPosition - actualOffset);
                }
                break;
            }
            RRTracer.Trace("Ending Filter Write");
            watch.Stop();
        }
Beispiel #22
0
        public virtual void Add(BackgroundImageClass image)
        {
            var imageKey = new ImageMetadata(image);

            if (RRContainer.Current.GetAllInstances <IFilter>().Where(x => x is SpriteFilter).FirstOrDefault(y => y.IgnoreTarget(new SpriteFilterContext(image))) != null)
            {
                return;
            }
            if (SpriteList.Any(x => x.Key.Equals(imageKey)))
            {
                var originalImage = SpriteList.First(x => x.Key.Equals(imageKey)).Value;
                var clonedImage   = new SpritedImage(originalImage.AverageColor, image, originalImage.Image)
                {
                    Position = originalImage.Position, Url = originalImage.Url, Metadata = imageKey
                };
                //SpriteContainer.AddImage(clonedImage);
                SpriteList.Add(new KeyValuePair <ImageMetadata, SpritedImage>(imageKey, clonedImage));
                return;
            }
            SpritedImage spritedImage;
            var          sprite = SpriteList.FirstOrDefault(x => x.Value.CssClass.ImageUrl == image.ImageUrl);

            if (sprite.Value != null)
            {
                image.IsSprite = true;
                sprite.Value.CssClass.IsSprite = true;
            }
            try
            {
                spritedImage          = SpriteContainer.AddImage(image);
                spritedImage.Metadata = imageKey;
            }
            catch (Exception ex)
            {
                var message          = string.Format("There were errors reducing {0}", image.ImageUrl);
                var wrappedException =
                    new ApplicationException(message, ex);
                RRTracer.Trace(message);
                RRTracer.Trace(ex.ToString());
                if (Registry.CaptureErrorAction != null)
                {
                    Registry.CaptureErrorAction(wrappedException);
                }
                return;
            }
            SpriteList.Add(new KeyValuePair <ImageMetadata, SpritedImage>(imageKey, spritedImage));
            if (SpriteContainer.Size >= config.SpriteSizeLimit || (SpriteContainer.Colors >= config.SpriteColorLimit && !config.ImageQuantizationDisabled && !config.ImageOptimizationDisabled))
            {
                Flush();
            }
        }
Beispiel #23
0
        protected override string ProcessResource(Guid key, IEnumerable <string> urls)
        {
            spriteManager.SpritedCssKey = key;
            var mergedCss = new StringBuilder();

            RRTracer.Trace("beginning to merge css");
            foreach (var url in urls)
            {
                mergedCss.Append(ProcessCss(url));
            }
            RRTracer.Trace("Finished merging css");
            spriteManager.Dispose();
            return(SpriteCss(mergedCss.ToString()));
        }
        public void InstallFilter(HttpContextBase context)
        {
            RRTracer.Trace("Entering Module");
            var request = context.Request;

            if (context.Response.ContentType != "text/html" ||
                request.RawUrl == "/favicon.ico" ||
                IsInRRContentDirectory(context))
            {
                return;
            }

            ResponseFilter.InstallFilter(context);
        }
Beispiel #25
0
 public void AddReduction(Guid key, string reducedUrl)
 {
     try
     {
         lock (lockObject)
         {
             dictionary[key] = reducedUrl;
             RRTracer.Trace("Reduction {0} added to ReductionRepository Dictionary.", key);
         }
     }
     catch (ArgumentException)
     {
     }
 }
Beispiel #26
0
        public void InstallFilter(HttpContextBase context)
        {
            RRTracer.Trace("Entering Module");
            var uri = context.Request.Url;

            if ((context.Response.ContentType != "text/html" &&
                 context.Response.ContentType != "application/xhtml+xml") ||
                uri.AbsolutePath == "/favicon.ico" ||
                IsInRRContentDirectory(uri))
            {
                return;
            }

            ResponseFilter.InstallFilter(context);
        }
Beispiel #27
0
 public virtual void Flush()
 {
     if (SpriteContainer.Size > 0)
     {
         RRTracer.Trace("Beginning to Flush sprite");
         using (var spriteWriter = new SpriteWriter(SpriteContainer.Width, SpriteContainer.Height))
         {
             var offset = 0;
             foreach (var image in SpriteContainer)
             {
                 spriteWriter.WriteImage(image.Image);
                 image.Position = offset;
                 offset        += image.Image.Width + 1;
             }
             var    bytes = spriteWriter.GetBytes("image/png");
             byte[] optBytes;
             try
             {
                 optBytes = (config.ImageOptimizationDisabled || !config.IsFullTrust) ? bytes : pngOptimizer.OptimizePng(bytes, config.ImageOptimizationCompressionLevel, config.ImageQuantizationDisabled);
             }
             catch (OptimizationException optEx)
             {
                 optBytes = bytes;
                 RRTracer.Trace(string.Format("Errors optimizing {0}. Received Error: {1}", SpritedCssKey, optEx.Message));
                 if (Registry.CaptureErrorAction != null)
                 {
                     Registry.CaptureErrorAction(optEx);
                 }
             }
             var url = GetSpriteUrl(optBytes);
             store.Save(optBytes, url, null);
             foreach (var image in SpriteContainer)
             {
                 image.Url = url;
                 foreach (var dupImage in SpriteList)
                 {
                     if (dupImage.Key.Equals(image.Metadata) && dupImage.Value.Position == -1)
                     {
                         dupImage.Value.Position = image.Position;
                         dupImage.Value.Url      = image.Url;
                     }
                 }
             }
         }
         RRTracer.Trace("Finished Flushing sprite");
     }
     SpriteContainer = new SpriteContainer(webClientWrapper, config);
 }
        public virtual string Process(Guid key, string urls)
        {
            RRTracer.Trace("beginning reducing process for {0}", urls);
            var urlList           = SplitUrls(urls);
            var processedResource = ProcessResource(key, urlList);
            var virtualfileName   = string.Empty;

            if (processedResource != null)
            {
                var bytes = Encoding.UTF8.GetBytes(minifier.Minify <T>(processedResource));
                virtualfileName = uriBuilder.BuildResourceUrl <T>(key, bytes);
                store.Save(bytes, virtualfileName, urls);
            }
            RRTracer.Trace("finishing reducing process for {0}", urls);
            return(virtualfileName);
        }
        public void ProcessRequest(HttpContextBase context)
        {
            var url = context.Request.Url.AbsolutePath;

            if (string.IsNullOrEmpty(config.ResourcePhysicalPath))
            {
                config.ResourcePhysicalPath = hostingEnvironment.MapPath(config.ResourceVirtualPath);
            }

            RRTracer.Trace("Beginning to serve {0}", url);
            var sig = uriBuilder.ParseSignature(url);

            if (sig == Guid.Empty.RemoveDashes())
            {
                return;
            }
            var etag = context.Request.Headers["If-None-Match"];

            etag = etag == null ? string.Empty : etag.Replace("\"", "");
            if (sig == etag || store.SendContent(url, context.Response))
            {
                context.Response.Cache.SetETag(string.Format(@"""{0}""", sig));
                context.Response.Cache.SetCacheability(HttpCacheability.Public);
                context.Response.Expires = 60 * 24 * 360; //LITTLE under A YEAR
                if (sig == etag)
                {
                    context.Response.StatusCode = 304;
                }
                else if (url.EndsWith(".css", StringComparison.OrdinalIgnoreCase))
                {
                    context.Response.ContentType = "text/css";
                }
                else if (url.EndsWith(".js", StringComparison.OrdinalIgnoreCase))
                {
                    context.Response.ContentType = "application/x-javascript";
                }
                else if (url.EndsWith(".png", StringComparison.OrdinalIgnoreCase))
                {
                    context.Response.ContentType = "image/png";
                }
                if (context.ApplicationInstance != null)
                {
                    context.ApplicationInstance.CompleteRequest();
                }
            }
            RRTracer.Trace("Finished serving {0}", url);
        }
Beispiel #30
0
        public void HandleRRFlush(HttpContextBase httpContextWrapper)
        {
            var url = EnsurePath(httpContextWrapper.Request.RawUrl);

            if (!IsInRRContentDirectory(httpContextWrapper) ||
                (!url.EndsWith("/flush/", StringComparison.OrdinalIgnoreCase) &&
                 !url.EndsWith("/flushfailures/", StringComparison.OrdinalIgnoreCase)))
            {
                return;
            }

            var config = RRContainer.Current.GetInstance <IRRConfiguration>();

            if (string.IsNullOrEmpty(config.SpritePhysicalPath))
            {
                config.SpritePhysicalPath = httpContextWrapper.Server.MapPath(config.SpriteVirtualPath);
            }
            var user = httpContextWrapper.User.Identity.Name;

            if (config.AuthorizedUserList.AllowsAnonymous() || config.AuthorizedUserList.Contains(user))
            {
                if (url.EndsWith("/flushfailures/", StringComparison.OrdinalIgnoreCase))
                {
                    var queue = RRContainer.Current.GetInstance <IReducingQueue>();
                    queue.ClearFailures();
                    RRTracer.Trace("Failures Cleared");
                }
                else
                {
                    var store      = RRContainer.Current.GetInstance <IStore>();
                    var uriBuilder = RRContainer.Current.GetInstance <IUriBuilder>();
                    var key        = uriBuilder.ParseKey(url.ToLower().Replace("/flush/", "-flush"));
                    store.Flush(key);
                    RRTracer.Trace("{0} Flushed {1}", user, key);
                }
                if (HttpContext.Current != null)
                {
                    httpContextWrapper.Response.Redirect(string.Format("{0}/dashboard", config.SpriteVirtualPath));
                }
            }
            else
            {
                httpContextWrapper.Response.StatusCode = 401;
            }
        }