コード例 #1
0
        /// <summary>
        /// This method will check a url to see that it does not return server or protocol errors
        /// </summary>
        /// <param name="url">The path to check</param>
        /// <returns></returns>
        private BrokenLinkType ValidateByRequest(RequestValidationInfo rvi)
        {
            string url = rvi.Url;

            // Allowing only one request to the same hostname at a time. Along with cache also ensures that the same url won't be requested to twice
            //object hostNameSyncRoot = GetHostNameSyncObject(rvi.Hostname);

            // lock (hostNameSyncRoot)
            {
                BrokenLinkType cachedResult;
                if (_brokenLinks.TryGetValue(url, out cachedResult))
                {
                    return(cachedResult);
                }

                bool success = HttpRequestHelper.MakeHeadRequest(url);

                var result = success ? BrokenLinkType.None : rvi.LinkType;
                SaveLinkCheckResult(url, result);

                return(result);
            }
        }
コード例 #2
0
        /// <summary>
        /// This method will check a url to see that it does not return server or protocol errors
        /// </summary>
        /// <param name="url">The path to check</param>
        /// <returns></returns>
        private BrokenLinkType ValidateByRequest(RequestValidationInfo rvi)
        {
            string url = rvi.Url;

            // Allowing only one request to the same hostname at a time. Along with cache also ensures that the same url won't be requested to twice
            //object hostNameSyncRoot = GetHostNameSyncObject(rvi.Hostname);

            // lock (hostNameSyncRoot)
            {
                BrokenLinkType cachedResult;
                if (_brokenLinks.TryGetValue(url, out cachedResult)) return cachedResult;

                bool success = HttpRequestHelper.MakeHeadRequest(url);

                var result = success ? BrokenLinkType.None : rvi.LinkType;
                SaveLinkCheckResult(url, result);

                return result;
            }
        }
コード例 #3
0
        /// <summary>
        /// Pasres the url, and checks if the urls can be validated without making an http request (for internal urls=.
        /// </summary>
        private UrlPreprocessResult PreprocessUrl(
            string url,
            string pageUrl,
            string serverUrl,
            out BrokenLinkType brokenLinkType,
            out RequestValidationInfo requestValidationInfo)
        {
            BrokenLinkType cachedResult;

            requestValidationInfo = null;

            if (_brokenLinks.TryGetValue(url, out cachedResult))
            {
                brokenLinkType = cachedResult;
                return(brokenLinkType == BrokenLinkType.None ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken);
            }

            // Trying to parse as a page url first
            PageUrlData pageUrlData = null;

            try
            {
                if (IsKnownHostname(url)) // Workaround "if" for early vesrions of 4.0 beta
                {
                    pageUrlData = PageUrls.ParseUrl(url);
                }
            }
            catch (UriFormatException)
            {
            }

            if (pageUrlData != null)
            {
                Guid linkedPageId = pageUrlData.PageId;

                IPage page;

                using (new DataScope(pageUrlData.PublicationScope, pageUrlData.LocalizationScope))
                {
                    page = PageManager.GetPageById(linkedPageId);
                }

                if (page == null)
                {
                    if (pageUrlData.PublicationScope == PublicationScope.Published)
                    {
                        using (new DataScope(PublicationScope.Unpublished, pageUrlData.LocalizationScope))
                        {
                            if (PageManager.GetPageById(linkedPageId) != null)
                            {
                                brokenLinkType = BrokenLinkType.PageNotPublished;
                                return(SaveLinkCheckResult(url, brokenLinkType) ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken);
                            }
                        }
                    }

                    brokenLinkType = BrokenLinkType.Page;
                    return(SaveLinkCheckResult(url, brokenLinkType) ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken);
                }

                // If no PathInfo - page link is already valid
                if (string.IsNullOrEmpty(pageUrlData.PathInfo))
                {
                    brokenLinkType = BrokenLinkType.None;
                    return(UrlPreprocessResult.Valid);
                }

                // If there's pathInfo -> making a request to check whether the link is actually broken
                requestValidationInfo = GetRequestValidationInfo(url, pageUrl, serverUrl, BrokenLinkType.Page);
                if (requestValidationInfo == null)
                {
                    brokenLinkType = BrokenLinkType.Page;
                    return(UrlPreprocessResult.Broken);
                }

                brokenLinkType = BrokenLinkType.None;
                return(UrlPreprocessResult.NeedToBeValidatedByRequest);
            }

            MediaUrlData mediaUrlData = MediaUrls.ParseUrl(url);

            if (mediaUrlData != null)
            {
                Guid   mediaId    = mediaUrlData.MediaId;
                string mediastore = mediaUrlData.MediaStore;

                bool mediaExist = DataFacade.GetData <IMediaFile>().Any(f => f.StoreId == mediastore && f.Id == mediaId);

                brokenLinkType = mediaExist ? BrokenLinkType.None : BrokenLinkType.MediaLibrary;
                return(SaveLinkCheckResult(url, brokenLinkType) ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken);
            }

            var linkType = UrlHelper.IsAbsoluteLink(url) ? BrokenLinkType.External : BrokenLinkType.Relative;

            requestValidationInfo = GetRequestValidationInfo(url, pageUrl, serverUrl, linkType);
            if (requestValidationInfo == null)
            {
                brokenLinkType = linkType;
                return(UrlPreprocessResult.Broken);
            }

            brokenLinkType = BrokenLinkType.None;
            return(UrlPreprocessResult.NeedToBeValidatedByRequest);
        }
コード例 #4
0
        /// <summary>
        /// Pasres the url, and checks if the urls can be validated without making an http request (for internal urls=.
        /// </summary>
        private UrlPreprocessResult PreprocessUrl(
            string url,
            string pageUrl,
            string serverUrl, 
            out BrokenLinkType brokenLinkType, 
            out RequestValidationInfo requestValidationInfo)
        {
            BrokenLinkType cachedResult;
            requestValidationInfo = null;

            if (_brokenLinks.TryGetValue(url, out cachedResult))
            {
                brokenLinkType = cachedResult;
                return brokenLinkType == BrokenLinkType.None ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken;
            }

            // Trying to parse as a page url first
            PageUrlData pageUrlData = null;
            try
            {
                if (IsKnownHostname(url)) // Workaround "if" for early vesrions of 4.0 beta
                {
                    pageUrlData = PageUrls.ParseUrl(url);
                }
            }
            catch (UriFormatException)
            {
            }

            if (pageUrlData != null)
            {
                Guid linkedPageId = pageUrlData.PageId;

                IPage page;

                using (new DataScope(pageUrlData.PublicationScope, pageUrlData.LocalizationScope))
                {
                    page = PageManager.GetPageById(linkedPageId);
                }

                if (page == null)
                {
                    if (pageUrlData.PublicationScope == PublicationScope.Published)
                    {
                        using (new DataScope(PublicationScope.Unpublished, pageUrlData.LocalizationScope))
                        {
                            if (PageManager.GetPageById(linkedPageId) != null)
                            {
                                brokenLinkType = BrokenLinkType.PageNotPublished;
                                return SaveLinkCheckResult(url, brokenLinkType) ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken;
                            }
                        }
                    }

                    brokenLinkType = BrokenLinkType.Page;
                    return SaveLinkCheckResult(url, brokenLinkType) ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken;
                }

                // If no PathInfo - page link is already valid
                if (string.IsNullOrEmpty(pageUrlData.PathInfo))
                {
                    brokenLinkType = BrokenLinkType.None;
                    return UrlPreprocessResult.Valid;
                }

                // If there's pathInfo -> making a request to check whether the link is actually broken
                requestValidationInfo = GetRequestValidationInfo(url, pageUrl, serverUrl, BrokenLinkType.Page);
                if (requestValidationInfo == null)
                {
                    brokenLinkType = BrokenLinkType.Page;
                    return UrlPreprocessResult.Broken;
                }

                brokenLinkType = BrokenLinkType.None;
                return UrlPreprocessResult.NeedToBeValidatedByRequest;
            }

            MediaUrlData mediaUrlData = MediaUrls.ParseUrl(url);

            if (mediaUrlData != null)
            {
                Guid mediaId = mediaUrlData.MediaId;
                string mediastore = mediaUrlData.MediaStore;

                bool mediaExist = DataFacade.GetData<IMediaFile>().Any(f => f.StoreId == mediastore && f.Id == mediaId);

                brokenLinkType = mediaExist ? BrokenLinkType.None : BrokenLinkType.MediaLibrary;
                return SaveLinkCheckResult(url, brokenLinkType) ? UrlPreprocessResult.Valid : UrlPreprocessResult.Broken;
            }

            var linkType = UrlHelper.IsAbsoluteLink(url) ? BrokenLinkType.External : BrokenLinkType.Relative;

            requestValidationInfo = GetRequestValidationInfo(url, pageUrl, serverUrl, linkType);
            if (requestValidationInfo == null)
            {
                brokenLinkType = linkType;
                return UrlPreprocessResult.Broken;
            }

            brokenLinkType = BrokenLinkType.None;
            return UrlPreprocessResult.NeedToBeValidatedByRequest;
        }