private static void AddReference(Resource resource, string url, ResourceReferenceTypes referenceType, int line, ReferenceSubType subType) { Uri uri; if (Uri.TryCreate(url, UriKind.RelativeOrAbsolute, out uri)) { resource.References.Add(referenceType, uri, subType); if (uri.IsAbsoluteUri && (referenceType == ResourceReferenceTypes.Script || referenceType == ResourceReferenceTypes.Link || referenceType == ResourceReferenceTypes.Image) && (resource.Url.Scheme == "https" && uri.Scheme == "http")) { resource.Errors.Add(new ResourceError { Type = ResourceErrorType.ResolveURL, Message = "Target URL is not secure", Value = url, Line = line, }); } } else { resource.Errors.Add(new ResourceError { Type = ResourceErrorType.ParseURL, Message = "Failed to parse URL", Value = url, Line = line, }); } }
public ResourceReference(Resource source, ResourceReferenceTypes type, ReferenceSubType subType, Uri url, int count = 1) { Source = source; Type = type; SubType = subType; Url = url; Count = count; }
public ResourceReference Add(ResourceReferenceTypes type, Uri url, ReferenceSubType subType, int count = 1) { foreach (ResourceReference resourceLink in this) { if (resourceLink.Type == type && url.OriginalString == resourceLink.Url.OriginalString) { resourceLink.Count += count; return(resourceLink); } } ResourceReference reference = new ResourceReference(Source, type, subType, url, count); Add(reference); return(reference); }
private static void FindAndAddResource(Resource resource, HtmlDocument document, string xpath, string propertyName, ResourceReferenceTypes referenceType, ReferenceSubType defaultSubType, params string[] exclusions) { HtmlNodeCollection nodeCollection = document.DocumentNode.SelectNodes(xpath); if (nodeCollection != null) { foreach (HtmlNode node in nodeCollection) { HtmlAttribute attribute = node.Attributes[propertyName]; if (attribute != null && !String.IsNullOrWhiteSpace(attribute.Value)) { ReferenceSubType subType = defaultSubType; if (referenceType == ResourceReferenceTypes.Image) { HtmlAttribute href = node.Attributes["xlink:href"]; if (href != null) { string hrefUrl = CleanUrl(href.Value); if (exclusions.All(x => !hrefUrl.StartsWith(x))) { AddReference(resource, hrefUrl, referenceType, node.Line, subType); subType = ReferenceSubType.Fallback; } } } string url = CleanUrl(node.Attributes[propertyName].Value); if (exclusions.All(x => !url.StartsWith(x))) { HtmlAttribute rel = node.Attributes["rel"]; if (rel != null) { defaultSubType = EnumHelper <ReferenceSubType> .TryParse(rel.Value.Replace(" ", ""), ReferenceSubType.None, true); } HtmlAttribute type = node.Attributes["type"]; if (defaultSubType == ReferenceSubType.None && type != null) { switch (type.Value.ToLower()) { case "text/javascript": defaultSubType = ReferenceSubType.JavaScript; break; case "text/css": defaultSubType = ReferenceSubType.StyleSheet; break; } } AddReference(resource, url, referenceType, node.Line, subType); } } } } }