public static Uri TryParseUrl(TraceContext trace, Uri documentRoot, JToken token) { Guard.NotNull(trace, "trace"); using (trace.EnterExit()) { if (token.Type == JTokenType.String) { string val = token.Value <string>(); if (!String.IsNullOrEmpty(val)) { Uri url; if (Uri.TryCreate(val, UriKind.RelativeOrAbsolute, out url)) { // Resolve the url if possible if (documentRoot != null && !url.IsAbsoluteUri) { url = new Uri(documentRoot, url); } return(url); } } } return(null); } }
public static IEnumerable <Uri> ParseUrlArray(IEnumerable <JToken> array, TraceContext trace, Uri documentRoot, string invalidUrlErrorFormat) { Guard.NotNull(trace, "trace"); using (trace.EnterExit()) { return(array == null? Enumerable.Empty <Uri>() : array.Select(token => { var url = TryParseUrl(trace, documentRoot, token); if (url == null) { trace.JsonParseWarning(token, String.Format(CultureInfo.CurrentCulture, invalidUrlErrorFormat, token.ToDisplayString())); } return url; }) .Where(url => url != null)); } }
public static IEnumerable <KeyValuePair <string, Uri> > ParseUrlDictionary(JObject obj, TraceContext trace, Uri documentRoot, string invalidUrlErrorFormat) { Guard.NotNull(trace, "trace"); using (trace.EnterExit()) { return(obj == null? Enumerable.Empty <KeyValuePair <string, Uri> >() : obj .Properties() .Select(prop => { var url = TryParseUrl(trace, documentRoot, prop.Value); if (url == null) { trace.JsonParseWarning(prop.Value, String.Format(CultureInfo.CurrentCulture, invalidUrlErrorFormat, prop.Value.ToDisplayString(), prop.Name)); } return new KeyValuePair <string, Uri>(prop.Name, url); }) .Where(pair => pair.Value != null)); } }
internal static RepositoryDescription FromJson(JObject json, TraceContext trace, Uri documentRoot) { Guard.NotNull(json, "json"); Guard.NotNull(trace, "trace"); using (trace.EnterExit()) { // Read the version field int majorVersion = 0; var majorVersionToken = json["version"]; if (majorVersionToken != null && majorVersionToken.Type != JTokenType.Null) { if (majorVersionToken.Type != JTokenType.Integer) { trace.JsonParseWarning( majorVersionToken, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_InvalidVersion, majorVersionToken.ToDisplayString())); } else { majorVersion = majorVersionToken.Value <int>(); if (majorVersion < 0) { trace.JsonParseWarning( majorVersionToken, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_InvalidVersion, majorVersion)); majorVersion = 0; } } } else { trace.JsonParseWarning( json, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_MissingExpectedProperty, "version")); } var version = new Version(majorVersion, 0); // Read mirrors/alternates // TODO: Remove old "alternates" name var mirrorsToken = json["mirrors"] ?? json["alternates"]; IEnumerable <Uri> mirrors; if (mirrorsToken != null && mirrorsToken.Type != JTokenType.Null) { if (mirrorsToken.Type != JTokenType.Array) { trace.JsonParseWarning( mirrorsToken, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_InvalidMirrors, mirrorsToken.ToDisplayString())); mirrors = Enumerable.Empty <Uri>(); } else { mirrors = JsonParsing.ParseUrlArray((JArray)mirrorsToken, trace, documentRoot, Strings.RepositoryDescription_InvalidMirrorUrl); } } else { trace.JsonParseWarning( json, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_MissingExpectedProperty, "mirrors")); mirrors = Enumerable.Empty <Uri>(); } // Read services var servicesToken = json["services"]; IEnumerable <ServiceDescription> services; if (servicesToken != null && servicesToken.Type != JTokenType.Null) { if (servicesToken.Type != JTokenType.Object) { trace.JsonParseWarning( mirrorsToken, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_InvalidServices, servicesToken.ToDisplayString())); services = Enumerable.Empty <ServiceDescription>(); } else { services = JsonParsing.ParseUrlDictionary(json.Value <JObject>("services"), trace, documentRoot, Strings.RepositoryDescription_InvalidServiceUrl).Select(pair => new ServiceDescription(pair.Key, pair.Value)); } } else { trace.JsonParseWarning( json, String.Format(CultureInfo.CurrentCulture, Strings.RepositoryDescription_MissingExpectedProperty, "services")); services = Enumerable.Empty <ServiceDescription>(); } // Create the object! return(new RepositoryDescription(version, mirrors, services)); } }