Пример #1
0
        // Add value to list
        private static bool AppendValue(string value, List <string> domains)
        {
            string domain = value
                            .Replace("www.", "").ToLower();

            // Remove search results
            if (
                domain.Contains("google") ||
                domain.Contains("bing") ||
                domain.Contains("yandex") ||
                domain.Contains("duckduckgo"))
            {
                return(false);
            }
            // If cookie value
            if (domain
                .StartsWith("."))
            {
                domain = domain.Substring(1);
            }
            // Get hostname from url
            try {
                domain = new System.Uri(domain).Host;
            } catch (System.UriFormatException) { }
            // Remove .com, .org
            domain = System.IO.Path.GetFileNameWithoutExtension(domain);
            domain = domain.Replace(".com", "").Replace(".org", "");
            // Check if domain already exists in list
            foreach (string domainValue in domains)
            {
                if (domain.ToLower().Replace(" ", "").Contains(domainValue.ToLower().Replace(" ", "")))
                {
                    return(false);
                }
            }
            // Convert first char to upper-case
            domain = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(domain);
            domains.Add(domain);
            return(true);
        }
Пример #2
0
        public void PutExistingBlobControllerTest()
        {
            string blobUri = _ctx.GetBlobUri("test.txt");

            var pipelineResponse = BlobPipelineTests.BlobRequest("GET", blobUri);
            string redirectHost = new Uri(pipelineResponse.Location).Host;

            var content = new StringContent("hello world", System.Text.Encoding.UTF8, "text/plain");
            content.Headers.Add("x-ms-version", "2013-08-15");
            content.Headers.Add("x-ms-date", "Wed, 23 Oct 2013 22:33:355 GMT");
            content.Headers.Add("x-ms-blob-content-disposition", "attachment; filename=\"test.txt\"");
            content.Headers.Add("x-ms-blob-type", "BlockBlob");
            content.Headers.Add("x-ms-meta-m1", "v1");
            content.Headers.Add("x-ms-meta-m2", "v2");

            var response = _ctx.Runner.ExecuteRequest(blobUri,
                "PUT",
                content,
                HttpStatusCode.Created);
            // Validate that the blob is still in the same account
            pipelineResponse = BlobPipelineTests.BlobRequest("GET", blobUri);
            Assert.AreEqual(redirectHost.ToLower(), new Uri(pipelineResponse.Location).Host.ToLower());
        }
Пример #3
0
        /// <summary>
        /// Performs a SaveAs operation of an open document. Called from SaveItem after the running document table has been updated with the new doc data.
        /// </summary>
        /// <param name="docData">A pointer to the document in the rdt</param>
        /// <param name="newFilePath">The new file path to the document</param>
        /// <returns></returns>
        protected override int AfterSaveItemAs(IntPtr docData, string newFilePath)
        {
            if (String.IsNullOrEmpty(newFilePath))
            {
                throw new ArgumentException(SR.GetString(SR.ParameterCannotBeNullOrEmpty), "newFilePath");
            }

            int returnCode = VSConstants.S_OK;
            newFilePath.Trim();

            //Identify if Path or FileName are the same for old and new file
            string newDirectoryName = Path.GetDirectoryName(newFilePath);
            Uri newDirectoryUri = new Uri(newDirectoryName);
            string newCanonicalDirectoryName = newDirectoryUri.LocalPath;
            newCanonicalDirectoryName = newCanonicalDirectoryName.TrimEnd(Path.DirectorySeparatorChar);
            string oldCanonicalDirectoryName = new Uri(Path.GetDirectoryName(this.GetMkDocument())).LocalPath;
            oldCanonicalDirectoryName = oldCanonicalDirectoryName.TrimEnd(Path.DirectorySeparatorChar);
            string errorMessage = String.Empty;
            bool isSamePath = NativeMethods.IsSamePath(newCanonicalDirectoryName, oldCanonicalDirectoryName);
            bool isSameFile = NativeMethods.IsSamePath(newFilePath, this.Url);

            // Currently we do not support if the new directory is located outside the project cone
            string projectCannonicalDirecoryName = new Uri(this.ProjectMgr.ProjectFolder).LocalPath;
            projectCannonicalDirecoryName = projectCannonicalDirecoryName.TrimEnd(Path.DirectorySeparatorChar);
            if (!isSamePath && newCanonicalDirectoryName.ToLower().IndexOf(projectCannonicalDirecoryName.ToLower()) == -1)
            {
                errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.LinkedItemsAreNotSupported), Path.GetFileNameWithoutExtension(newFilePath));
                throw new InvalidOperationException(errorMessage);
            }

            //Get target container
            HierarchyNode targetContainer = null;
            if (isSamePath)
            {
                targetContainer = this.Parent;
            }
            else if (NativeMethods.IsSamePath(newCanonicalDirectoryName, projectCannonicalDirecoryName))
            {
                //the projectnode is the target container
                targetContainer = this.ProjectMgr;
            }
            else
            {
                //search for the target container among existing child nodes
                targetContainer = this.ProjectMgr.FindChild(newDirectoryName);
                if (targetContainer != null && (targetContainer is FileNode))
                {
                    // We already have a file node with this name in the hierarchy.
                    errorMessage = String.Format(CultureInfo.CurrentCulture, SR.GetString(SR.FileAlreadyExistsAndCannotBeRenamed), Path.GetFileNameWithoutExtension(newFilePath));
                    throw new InvalidOperationException(errorMessage);
                }
            }

            if (targetContainer == null)
            {
                // Add a chain of subdirectories to the project.
                string relativeUri = PackageUtilities.GetPathDistance(this.ProjectMgr.BaseURI.Uri, newDirectoryUri);
                Debug.Assert(!String.IsNullOrEmpty(relativeUri) && relativeUri != newDirectoryUri.LocalPath, "Could not make pat distance of " + this.ProjectMgr.BaseURI.Uri.LocalPath + " and " + newDirectoryUri);
                targetContainer = this.ProjectMgr.CreateFolderNodes(relativeUri);
            }
            Debug.Assert(targetContainer != null, "We should have found a target node by now");

            //Suspend file changes while we rename the document
            string oldrelPath = this.ItemNode.GetMetadata(ProjectFileConstants.Include);
            string oldName = Path.Combine(this.ProjectMgr.ProjectFolder, oldrelPath);
            SuspendFileChanges sfc = new SuspendFileChanges(this.ProjectMgr.Site, oldName);
            sfc.Suspend();

            try
            {
                // Rename the node.
                DocumentManager.UpdateCaption(this.ProjectMgr.Site, Path.GetFileName(newFilePath), docData);
                // Check if the file name was actually changed.
                // In same cases (e.g. if the item is a file and the user has changed its encoding) this function
                // is called even if there is no real rename.
                if (!isSameFile || (this.Parent.ID != targetContainer.ID))
                {
                    // The path of the file is changed or its parent is changed; in both cases we have
                    // to rename the item.
                    this.RenameFileNode(oldName, newFilePath, targetContainer.ID);
                    OnInvalidateItems(this.Parent);
                }
            }
            catch (Exception e)
            {
                Trace.WriteLine("Exception : " + e.Message);
                this.RecoverFromRenameFailure(newFilePath, oldrelPath);
                throw e;
            }
            finally
            {
                sfc.Resume();
            }

            return returnCode;
        }
 public void TestNoShadow()
 {
     Assembly assembly = GetType().Assembly;
     string localPath = new Uri(assembly.CodeBase).LocalPath;
     string location = assembly.Location;
     Assert.IsTrue(localPath.ToLower() != location.ToLower(), "assembly at '" + location + "' is being shadow copied");
 }
Пример #5
0
        public static bool IsBaseOfWithPath(this Uri baseUri, Uri uri)
        {
            // Note: Uri.IsBaseOf returns true also when called with
            // new Uri("http://contoso.com/path").IsBaseOf(new Uri("http://contoso.com"))
            // Which for me is wrong...so I check also the path

            if (string.IsNullOrWhiteSpace(baseUri.ToString()))
                return false;

            if (baseUri.IsAbsoluteUri && uri.IsAbsoluteUri)
            {
                baseUri = baseUri.ToLower();
                uri = uri.ToLower();

                if (baseUri.Scheme == uri.Scheme &&
                    baseUri.Host == uri.Host &&
                    baseUri.Port == uri.Port &&
                    uri.GetComponents(UriComponents.Path, UriFormat.UriEscaped).StartsWith(baseUri.GetComponents(UriComponents.Path, UriFormat.UriEscaped).Trim('/')))
                    return true;
                else
                    return false;
            }
            else if (!baseUri.IsAbsoluteUri && !uri.IsAbsoluteUri)
            {
                baseUri = baseUri.RemoveTrailingSlash();

                return uri.ToString().StartsWith(baseUri.ToString(), StringComparison.InvariantCultureIgnoreCase);
            }
            else
                throw new XrcException("Uri not valid, cannot compare a relative uri with an absolute uri.");
        }
Пример #6
0
        /// <summary>
        /// Returns a value indicating whether the original file is new or has been updated.
        /// </summary>
        /// <returns>
        /// True if the the original file is new or has been updated; otherwise, false.
        /// </returns>
        internal async Task<bool> IsNewOrUpdatedFileAsync()
        {
            string path = this.CachedPath;
            bool isUpdated = false;
            CachedImage cachedImage;

            // is this a cropup url ....
            bool isCropup = this.requestPath.ToLower().IndexOf("/cropup/") > -1;


            if (isCropup)
            {
                try
                {
                    // get the json file name associated with the request. We will do timestamp check against that.
                    string urlpath = new Uri(this.requestPath).PathAndQuery;
                    string servermappedpath = request.MapPath(urlpath.Substring(urlpath.ToLower().IndexOf("/media")));
                    string jsonFileToCheck = servermappedpath + ".crop.json";


                    cachedImage = await CacheIndexer.GetValueAsync(path);
                    FileInfo jsonFileInfo = new FileInfo(jsonFileToCheck);

                    if (cachedImage != null && jsonFileInfo.Exists)
                    {
                        // Looking for json file
                        // or if the max age is different.
                        if (this.IsExpired(cachedImage.CreationTimeUtc) || jsonFileInfo.LastWriteTimeUtc > cachedImage.LastWriteTimeUtc)
                        {
                            CacheIndexer.Remove(path);
                            isUpdated = true;
                        }
                    }
                    else if (!jsonFileInfo.Exists)
                    {

                        // no json means no first time save means no changes
                        isUpdated = true;

                    }
                    else
                    {
                        // Nothing in the cache so we should return true.
                        isUpdated = true;
                    }
                }
                catch
                {

                    isUpdated = false;
                }

            }
            else if (this.isRemote)
            {
                cachedImage = await CacheIndexer.GetValueAsync(path);

                if (cachedImage != null)
                {
                    // Can't check the last write time so check to see if the cached image is set to expire 
                    // or if the max age is different.
                    if (this.IsExpired(cachedImage.CreationTimeUtc))
                    {
                        CacheIndexer.Remove(path);
                        isUpdated = true;
                    }
                }
                else
                {
                    // Nothing in the cache so we should return true.
                    isUpdated = true;
                }
            }
            else
            {
                // Test now for locally requested files.
                cachedImage = await CacheIndexer.GetValueAsync(path);

                if (cachedImage != null)
                {
                    FileInfo imageFileInfo = new FileInfo(this.requestPath);

                    if (imageFileInfo.Exists)
                    {
                        // Pull the latest info.
                        imageFileInfo.Refresh();

                        // Check to see if the last write time is different of whether the
                        // cached image is set to expire or if the max age is different.
                        if (!this.RoughDateTimeCompare(imageFileInfo.LastWriteTimeUtc, cachedImage.LastWriteTimeUtc)
                            || this.IsExpired(cachedImage.CreationTimeUtc))
                        {
                            CacheIndexer.Remove(path);
                            isUpdated = true;
                        }
                    }
                }
                else
                {
                    // Nothing in the cache so we should return true.
                    isUpdated = true;
                }
            }

            return isUpdated;
        }
Пример #7
0
        public LinkGrap(string link)
        {
            LinkGrap Item = null;
            string saveLocation = HostingEnvironment.MapPath("~/lib/u/");
            Item = (LinkGrap)HttpContext.Current.Cache[string.Format(cacheKey, link)];
            if (Item == null)
            {
                #region xử lý Link
                HttpWebRequest wrq;
                wrq = (HttpWebRequest)(WebRequest.Create(link));
                string host = new Uri(link).Host;
                wrq.Credentials = CredentialCache.DefaultCredentials;
                wrq.Method = "GET";
                wrq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; vi; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3";
                wrq.SendChunked = true;
                if (link.IndexOf("zing.vn") != -1)
                {
                    wrq.Referer = "http://mp3.zing.vn";
                }
                try
                {
                    HttpWebResponse wrp = (HttpWebResponse)wrq.GetResponse();
                    HtmlDocument doc = new HtmlDocument();
                    contentType = wrp.ContentType;
                    if (contentType.ToLower().IndexOf("html") != -1)
                    {
                        doc.Load(wrp.GetResponseStream(), Encoding.UTF8);
                        string domain = "http://" + (new Uri(link)).Host;
                        #region Title
                        if (doc.DocumentNode.SelectNodes("//title | //TITLE") != null)
                        {
                            HtmlNode titleNode = doc.DocumentNode.SelectNodes("//title | //TITLE")[0];
                            Title = titleNode.InnerText;
                        }
                        #endregion
                        #region Desc
                        if (doc.DocumentNode.SelectNodes("//meta[@name='description'] | //meta[@name='DESCRIPTION']") != null)
                        {
                            HtmlNode titleNode = doc.DocumentNode.SelectNodes("//meta[@name='description'] | //meta[@name='DESCRIPTION']")[0];
                            Description = titleNode.Attributes["content"].Value;
                        }
                        #endregion
                        #region Content
                        ContentRawHtml = doc.DocumentNode.InnerHtml;
                        ContentRawText = doc.DocumentNode.InnerText;
                        Content = Wrapper(host, link, doc);
                        #endregion
                        #region Images
                        //if (doc.DocumentNode.SelectNodes("//img | //IMG") != null)
                        //{
                        //    List<string> _list = new List<string>();
                        //    foreach (HtmlNode _img in doc.DocumentNode.SelectNodes("//img | //IMG"))
                        //    {
                        //        if (_img.Attributes["src"] != null)
                        //        {
                        //            string src = _img.Attributes["src"].Value;
                        //            if (src.ToLower().IndexOf("http://") != 0)
                        //            {
                        //                src = domain + src;
                        //            }
                        //            _list.Add(src);
                        //        }
                        //    }
                        //    Images = _list;
                        //}
                        #endregion
                        #region Link
                        List<string> _inLink = new List<string>();
                        List<string> _outLink = new List<string>();
                        foreach (HtmlNode a in doc.DocumentNode.SelectNodes("//a|//A"))
                        {
                            string href = string.Empty;
                            if (a.Attributes["href"] != null)
                            {
                                href = a.Attributes["href"].Value;
                            }
                            else if (a.Attributes["HREF"] != null)
                            {
                                href = a.Attributes["HREF"].Value;
                            }
                            if (!string.IsNullOrEmpty(href))
                            {
                                if (href.ToLower().IndexOf("javascrip") != 0 && href.ToLower().IndexOf("#") != 0)
                                {
                                    if (href.ToLower().IndexOf("http://") == 0)//HTTPLink
                                    {
                                        Uri _href = new Uri(href);
                                        if (_href.Host.ToLower().IndexOf(host.ToLower()) != -1)
                                        {
                                            _inLink.Add(href);
                                        }
                                        else
                                        {
                                            _outLink.Add(href);
                                        }
                                    }
                                    else
                                    {
                                        if (href.ToLower().IndexOf("/") == -1) href = "/" + href;
                                        if (href.ToLower().IndexOf("../") == 0) href = href.Substring(href.LastIndexOf("../") + 3);
                                        href = "http://" + host + href;
                                        _inLink.Add(href);
                                    }
                                }
                            }
                            InLink = _inLink;
                            OutLink = _outLink;
                        }
                        #endregion

                    }
                    #region Ảnh
                    //else
                    //{
                    //    if (contentType.IndexOf("image") != -1)
                    //    {
                    //        Title = link;
                    //        Description = link;
                    //        List<string> _list = new List<string>();
                    //        ImageProcess gimg = new ImageProcess(new Uri(link), link);
                    //        if (gimg.Width > 100 && gimg.Heigth > 75)
                    //        {
                    //            _list.Add(link);
                    //        }
                    //        Images = _list;
                    //    }
                    //}
                    #endregion
                    HttpContext.Current.Cache.Insert(string.Format(cacheKey, link), this);
                }
                catch (WebException ex)
                {
                    LinkGrap _obj2 = new LinkGrap();
                    _obj2.Title = "0";
                    HttpContext.Current.Cache.Remove(string.Format(cacheKey, link));
                }
                #endregion
            }
        }
Пример #8
0
        ///<summary>
        ///</summary>
        ///<returns>true of successful; false if failed</returns>
        public virtual bool SetRepositoryAddress()
        {
            var repo = new HgRepository(TargetDestination, _progress);
            var name = new Uri(URL).Host;
            if (String.IsNullOrEmpty(name)) //This happens for repos on the local machine
            {
                name = @"LocalRepository";
            }
            if (name.ToLower().Contains(@"languagedepot"))
                name = @"LanguageDepot";

            var address = RepositoryAddress.Create(name, URL);

            //this will also remove the "default" one that hg puts in, which we don't really want.
            repo.SetKnownRepositoryAddresses(new[] { address });
            repo.SetIsOneDefaultSyncAddresses(address, true);
            return true;
        }
Пример #9
0
        /// <summary>
        /// Tests ALL link suggestions in LS_DEBUG mode. Should only be used for small caches.
        /// </summary>
        /// <param name="proxy">The local proxy.</param>
        public static void DebugLinkSuggestion(RCLocalProxy proxy)
        {
            CacheManager cm = proxy.ProxyCacheManager;
            string[] stopwords = File.ReadAllLines("stopwords.txt");

            List<string> sites = cm.TextFiles();
            int i = 1;
            foreach (string site in sites)
            {
                proxy.Logger.Debug(String.Format("Working site {0} of {1}", i++, sites.Count));
                string url = cm.AbsoluteFilePathToUri(site);

                string content = Utils.ReadFileAsString(site);
                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(content);

                HtmlNode head = doc.DocumentNode.SelectSingleNode("/html/head");
                HtmlNode body = doc.DocumentNode.SelectSingleNode("/html/body");
                if (head == null || body == null)
                {
                    // We haven't sane HTML, just continue
                    continue;
                }

                // Gets all links containing text.
                HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a[not(node()[2])][text()]/@href");
                if (links != null)
                {
                    int ign;
                    foreach (HtmlNode link in links)
                    {
                        string relTarget = link.GetAttributeValue("href", "");
                        string target;
                        try
                        {
                            target = new Uri(new Uri(url), relTarget).ToString();
                        }
                        catch (UriFormatException)
                        {
                            continue;
                        }

                        if (LINK_ANCHOR_BLACKLIST.Contains(link.InnerText.ToLower())
                            || Int32.TryParse(link.InnerText, out ign) || url.ToLower().Equals(target.ToLower()))
                        {
                            // No "Here", ... links or number links
                            // No links to the same page! (LS_DEBUG)
                            continue;
                        }
                        string relFileName = CacheManager.GetRelativeCacheFileName(target, "GET");

                        if (!target.Equals("") && cm.IsCached(relFileName))
                        {
                            // Get anchor and surrounding text
                            string anchorText = link.InnerText;
                            string surroundingText = HtmlUtils.GetSurroundingText(link,
                                stopwords, false);

                            // Trigger LS
                            GetLinkSuggestions(target, url, anchorText, surroundingText,
                                3, proxy);
                        }
                    }
                }
            }
        }
Пример #10
0
        /// <summary>
        /// Injects tooltips for every link in the HTML with meaningful text.
        /// </summary>
        /// <param name="html">The original page.</param>
        /// <returns>The modified page.</returns>
        public static string IncludeTooltips(string html, string url, CacheManager cm)
        {
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);

            HtmlNode head = doc.DocumentNode.SelectSingleNode("/html/head");
            HtmlNode body = doc.DocumentNode.SelectSingleNode("/html/body");
            if (head == null || body == null)
            {
                // We haven't sane HTML, just return it as it is.
                return html;
            }
            // include style document
            HtmlNode opentipStyle = doc.CreateElement("link");
            opentipStyle.SetAttributeValue("type", "text/css");
            opentipStyle.SetAttributeValue("rel", "stylesheet");
            opentipStyle.SetAttributeValue("href", "http://www.ruralcafe.net/css/opentip.css");
            head.AppendChild(opentipStyle);
            // include opentip js document
            HtmlNode opentipJs = doc.CreateElement("script");
            opentipJs.SetAttributeValue("type", "text/javascript");
            opentipJs.SetAttributeValue("src", "http://www.ruralcafe.net/js/opentip-native.min.js");
            head.AppendChild(opentipJs);
            // include our js document
            HtmlNode ourJs = doc.CreateElement("script");
            ourJs.SetAttributeValue("type", "text/javascript");
            ourJs.SetAttributeValue("src", "http://www.ruralcafe.net/js/linkSuggestion.js");
            head.AppendChild(ourJs);
            // include our ajax js document (Opentip ajax does not like us...)
            HtmlNode ourAjaxJs = doc.CreateElement("script");
            ourAjaxJs.SetAttributeValue("type", "text/javascript");
            ourAjaxJs.SetAttributeValue("src", "http://www.ruralcafe.net/js/ajax.js");
            head.AppendChild(ourAjaxJs);
            // Include the invisible trigger element
            HtmlNode trigger = doc.CreateElement("div");
            trigger.SetAttributeValue("id", "rclink-trigger");
            body.AppendChild(trigger);

            // Gets all links containing text.
            HtmlNodeCollection links = doc.DocumentNode.SelectNodes("//a[not(node()[2])][text()]/@href");
            if (links != null)
            {
                // Modify all links
                int i = 0;
                int ign;
                foreach (HtmlNode link in links)
                {
                    string relTarget = link.GetAttributeValue("href", "");
                    string target;
                    try
                    {
                        target = new Uri(new Uri(url), relTarget).ToString();
                    }
                    catch (UriFormatException)
                    {
                        continue;
                    }

                    if (LINK_ANCHOR_BLACKLIST.Contains(link.InnerText.ToLower())
                        || Int32.TryParse(link.InnerText, out ign) || url.ToLower().Equals(target.ToLower()))
                    {
                        // No "Here", ... links or number links
                        // No links to the same page! (LS_DEBUG)
                        continue;
                    }

                    link.SetAttributeValue("id", "rclink-" + i);
                    link.SetAttributeValue("onmouseover", "showSuggestions(" + i + ")");
                    link.SetAttributeValue("onmouseout", "clearActiveLinkNumber()");
                    i++;

                    if (Properties.Network.Default.LS_DEBUG)
                    {
                        // Highlight links pointing to downloaded docs in LS_DEBUG mode
                        string relFileName = CacheManager.GetRelativeCacheFileName(target, "GET");

                        if (!target.Equals("") && cm.IsCached(relFileName))
                        {
                            link.SetAttributeValue("class", "highlightedCachedLink");
                        }
                    }
                }
            }

            return doc.DocumentNode.OuterHtml;
        }
Пример #11
0
 private void btnGo_Click(object sender, EventArgs args)
 {
     btnGo.Enabled = false;
     miSettings.Enabled = false;
     txtUrl.Enabled = false;
     txtLinks.Clear();
     new Thread(delegate()
     {
         try
         {
             ArrayList<string> includeList = new ArrayList<string>();
             int i = 0;
             foreach (ToolStripMenuItem item in miInclude.DropDownItems)
             {
                 if (item.Checked) { includeList.Add(mRegexList[i]); }
                 i++;
             }
             ArrayList<string> excludeList = new ArrayList<string>();
             i = 0;
             foreach (ToolStripMenuItem item in miExclude.DropDownItems)
             {
                 if (item.Checked) { excludeList.Add(mExcludeList[i]); }
                 i++;
             }
             Set<string> links = new Set<string>();
             Uri baseUrl = new Uri(txtUrl.Text);
             string html = WebUtils.GetWebPageDetectEncoding(txtUrl.Text);
             foreach (string regex in includeList)
             {
                 Regex r = new Regex(regex, RegexOptions.IgnoreCase);
                 Match m = r.Match(html);
                 while (m.Success)
                 {
                     string message = "RSS feed NOT detected.";
                     string url = m.Result("${rssUrl}").Trim();
                     url = new Uri(baseUrl, url).ToString();
                     string urlLower = url.ToLower();
                     // test whether to include link
                     bool ok = true;
                     foreach (string substr in excludeList)
                     {
                         if (urlLower.Contains(substr)) { ok = false; break; }
                     }
                     if (ok && !links.Contains(urlLower))
                     {
                         // test RSS file
                         if (miTestLinks.Checked)
                         {
                             string xml = null;
                             try { xml = WebUtils.GetWebPageDetectEncoding(url); } catch { }
                             bool rssXmlFound = xml != null && TestRssXml(xml);
                             if (rssXmlFound) { message = "RSS feed detected."; }
                             // convert Atom to RSS
                             if (xml != null && miConvertAtomToRss.Checked && !rssXmlFound && TestAtomXml(xml))
                             {
                                 url = "http://www.devtacular.com/utilities/atomtorss/?url=" + HttpUtility.HtmlEncode(url);
                                 xml = null;
                                 try { xml = WebUtils.GetWebPageDetectEncoding(url); }
                                 catch { }
                                 rssXmlFound = xml != null && TestRssXml(xml);
                                 if (rssXmlFound) { message = "RSS feed detected after converting from Atom."; }
                             }
                             else // try the format=xml trick
                             {
                                 if (miFeedburnerFormat.Checked && !rssXmlFound)
                                 {
                                     string newUrl = url + (url.Contains("?") ? "&" : "?") + "format=xml";
                                     try { xml = WebUtils.GetWebPageDetectEncoding(newUrl); } catch { }
                                     rssXmlFound = xml != null && TestRssXml(xml);
                                     if (rssXmlFound)
                                     {
                                         message = "RSS feed detected after applying the format=xml trick.";
                                         url = newUrl;
                                     }
                                 }
                             }
                             if (miRemoveNonRss.Checked && !rssXmlFound) { Invoke(delegate() { txtLinks.Text += "#"; }); }
                             Invoke(delegate() { txtLinks.Text += url + "\r\n"; });
                             if (miOutputTestResult.Checked)
                             {
                                 Invoke(delegate() { txtLinks.Text += "# " + message + "\r\n"; });
                             }
                         }
                         else
                         {
                             Invoke(delegate() { txtLinks.Text += url + "\r\n"; });
                         }
                         links.Add(urlLower);
                     }
                     m = m.NextMatch();
                 } // m.Success
             }
         }
         catch (Exception e)
         {
             TryInvoke(delegate() { txtLinks.Text += e.Message + "\r\n" + e.StackTrace; });
         }
         finally
         {
             TryInvoke(delegate() { btnGo.Enabled = txtUrl.Enabled = miSettings.Enabled = true; });
         }
     }).Start();
 }