/// <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); } }
/// <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; } }
/// <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); }
/// <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; }