internal RenderRequest[] PrepareDataForRG_(FrameData result) { logger_.Verbose("enter"); ConcurrentDictionary <string, RGridResource> allBlobs = new ConcurrentDictionary <string, RGridResource>(); HashSet <string> resourceUrls = new HashSet <string>(); ParseScriptResult_(result, allBlobs, resourceUrls); logger_.Verbose("fetching {0} resources...", resourceUrls.Count); //Fetch all resources FetchAllResources_(allBlobs, resourceUrls); logger_.Verbose("done fetching resources."); List <RGridResource> written = AddBlobsToCache_(allBlobs); logger_.Verbose("written {0} blobs to cache.", written.Count); //Create RenderingRequest //Parse allBlobs to mapping ConcurrentDictionary <string, RGridResource> resourceMapping = new ConcurrentDictionary <string, RGridResource>(); foreach (KeyValuePair <string, RGridResource> kvp in allBlobs) { string urlStr = SanitizeUrl_(kvp.Key); ResourceFuture resourceFuture = fetchedCacheMap_[urlStr]; Task <RGridResource> resourceTask = resourceFuture.Get(TimeSpan.FromSeconds(60)); RGridResource resource = resourceTask.Result; resourceMapping.TryAdd(urlStr, resource); // TODO - ITAI } BuildAllRGDoms_(resourceMapping, result); logger_.Verbose("resources count: {0}", resourceMapping.Count); logger_.Verbose("cached resources count: {0}", cachedResourceMapping_.Count); AppendAllCachedResources_(resourceMapping); // Sort mapped resources by their URL for constant, testable results. SortedDictionary <string, RGridResource> sortedResourceMapping = new SortedDictionary <string, RGridResource>(resourceMapping); List <RenderRequest> allRequestsForRG = BuildRenderRequests_(result, sortedResourceMapping); RenderRequest[] asArray = allRequestsForRG.ToArray(); logger_.Verbose("exit - returning renderRequest array of length: {0}", asArray.Length); return(asArray); }
private ResourceFuture DownloadResourceFuture_(string url) { logger_.Verbose("Downloading data from {0}", url); // If resource is not being fetched yet (limited guarantee) IEyesConnector eyesConnector = taskList_?[0].EyesConnector; HttpWebRequest request = WebRequest.CreateHttp(url); request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; request.Proxy = eyesConnector?.Proxy; request.UserAgent = userAgent_.OriginalUserAgentString; Task <WebResponse> task = request.GetResponseAsync(); ResourceFuture future = new ResourceFuture(task, new Uri(url), logger_); return(future); }
private List <RGridResource> AddBlobsToCache_(ConcurrentDictionary <string, RGridResource> allBlobs) { logger_.Verbose("trying to add {0} blobs to cache", allBlobs.Count); logger_.Verbose("current fetchedCacheMap size: {0}", fetchedCacheMap_.Count); List <RGridResource> unparsedResources = new List <RGridResource>(); foreach (RGridResource blob in allBlobs.Values) { Uri url = blob.Url; ResourceFuture resourceFuture = new ResourceFuture(blob, logger_); string sanitizedUrl = SanitizeUrl_(url.OriginalString); if (fetchedCacheMap_.TryAdd(sanitizedUrl, resourceFuture)) { logger_.Verbose("Cache write for url - {0} hash:({1})", url, resourceFuture.GetHashCode()); unparsedResources.Add(blob); } else { logger_.Verbose("Already cached: url - {0} hash:({1})", url, resourceFuture.GetHashCode()); } } return(unparsedResources); }