public async Task GetListOfPackages(InterceptCallContext context) { context.Log("[V3 CALL] GetListOfPackages", ConsoleColor.Magenta); var index = await FetchJson(context, context.Args.IncludePrerelease?new Uri(_listAvailableLatestPrereleaseIndex) : new Uri(_listAvailableLatestStableIndex)); var data = GetListAvailableDataStart(context, index); // apply startswith if needed if (context.Args.PartialId != null) { data = data.Where(e => e["id"].ToString().StartsWith(context.Args.PartialId, StringComparison.OrdinalIgnoreCase)); data = data.TakeWhile(e => e["id"].ToString().StartsWith(context.Args.PartialId, StringComparison.OrdinalIgnoreCase)); } // take only 30 var ids = data.Take(30).Select(p => p["id"].ToString()).ToList(); ids.Sort(StringComparer.InvariantCultureIgnoreCase); JArray array = new JArray(); foreach (var id in ids) { array.Add(id); } await context.WriteResponse(array); }
public async Task GetListOfPackageVersions(InterceptCallContext context, string id) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetListOfPackageVersions: {0}", id), ConsoleColor.Magenta); JObject resolverBlob = await FetchJson(context, MakeResolverAddress(id)); JArray array = new JArray(); // the package may not exist, in that case return an empty array if (resolverBlob != null) { List <NuGetVersion> versions = new List <NuGetVersion>(); foreach (JToken package in resolverBlob["packages"]) { NuGetVersion version = NuGetVersion.Parse(package["version"].ToString()); // all versions are returned, filter to only stable if needed if (context.Args.IncludePrerelease || !version.IsPrerelease) { versions.Add(version); } } versions.Sort(); foreach (NuGetVersion version in versions) { array.Add(version.ToString()); } } await context.WriteResponse(array); }
public async Task GetUpdates(InterceptCallContext context, string[] packageIds, string[] versions, string[] versionConstraints, string[] targetFrameworks, bool includePrerelease, bool includeAllVersions, bool count = false) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetUpdates{1}: {0}", string.Join("|", packageIds), count ? "Count" : string.Empty), ConsoleColor.Magenta); var packages = await GetUpdatesCore(context, packageIds, versions, versionConstraints, targetFrameworks, includePrerelease, includeAllVersions); if (count) { await context.WriteResponse(packages.Count); } else { XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "GetUpdates", packages, packages.Select(p => p["id"].ToString()).ToArray()); await context.WriteResponse(feed); } }
public async Task DownloadPackage(InterceptCallContext context, string id, string version) { JToken package = await GetPackageCore(context, id, version); if (package == null) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "unable to find version {0} of package {1}", version, id)); } string address = package["nupkgUrl"].ToString(); context.Log(String.Format(CultureInfo.InvariantCulture, "[V3 PKG] {0}", address.ToString()), ConsoleColor.Cyan); Stopwatch timer = new Stopwatch(); timer.Start(); System.Net.Http.HttpClient client = new System.Net.Http.HttpClient(); HttpResponseMessage response = await client.GetAsync(address); byte[] data = await response.Content.ReadAsByteArrayAsync(); timer.Stop(); context.Log(String.Format(CultureInfo.InvariantCulture, "[V3 PKG] (status:{0}) (time:{1}ms) {2}", response.StatusCode, timer.ElapsedMilliseconds, address.ToString()), response.StatusCode == System.Net.HttpStatusCode.OK ? ConsoleColor.Cyan : ConsoleColor.Red); await context.WriteResponse(data, "application/zip"); }
public async Task Metadata(InterceptCallContext context, string feed = null) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] Metadata: {0}", feed ?? string.Empty), ConsoleColor.Magenta); Stream stream = GetResourceStream(feed == null ? "xml.Metadata.xml" : "xml.FeedMetadata.xml"); XElement xml = XElement.Load(stream); await context.WriteResponse(xml); }
public async Task ListAvailable(InterceptCallContext context) { string indexUrl = _listAvailableLatestStableIndex; if (!context.Args.IsLatestVersion) { indexUrl = _listAvailableAllIndex; } else if (context.Args.IncludePrerelease) { indexUrl = _listAvailableLatestPrereleaseIndex; } var index = await FetchJson(context, new Uri(indexUrl)); var data = GetListAvailableData(context, index); // all versions with no pre if (!context.Args.IsLatestVersion && !context.Args.IncludePrerelease) { data = data.Where(p => (new NuGetVersion(p["version"].ToString())).IsPrerelease == false); } string nextUrl = null; // Convert to a list after calling Take to avoid enumerating the list multiple times. if (context.Args.Top.HasValue && context.Args.Top.Value > 0) { data = data.Take(context.Args.Top.Value).ToList(); } else { data = data.Take(30).ToList(); if (data.Count() >= 30) { var last = data.LastOrDefault(); if (last != null) { string argsWithoutSkipToken = String.Join("&", context.Args.Arguments.Where(a => a.Key.ToLowerInvariant() != "$skiptoken") .Select(a => String.Format(CultureInfo.InvariantCulture, "{0}={1}", a.Key, a.Value))); nextUrl = String.Format(CultureInfo.InvariantCulture, "{0}?{1}&$skiptoken='{2}','{2}','{3}'", context.RequestUri.AbsoluteUri.Split('?')[0], argsWithoutSkipToken, last["id"], last["version"]); } } } XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", data, data.Select(e => e["id"].ToString()).ToArray(), nextUrl); await context.WriteResponse(feed); }
public async Task Root(InterceptCallContext context, string feedName = null) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] Root: {0}", feedName ?? string.Empty), ConsoleColor.Magenta); if (feedName == null) { Stream stream = GetResourceStream("xml.Root.xml"); XElement xml = XElement.Load(stream); await context.WriteResponse(xml); } else { Stream stream = GetResourceStream("xml.FeedRoot.xml"); string s = (new StreamReader(stream)).ReadToEnd(); string t = string.Format(s, feedName); XElement xml = XElement.Load(new StringReader(t), LoadOptions.SetBaseUri); await context.WriteResponse(xml); } }
public async Task SearchCount(InterceptCallContext context, string searchTerm, bool isLatestVersion, string targetFramework, bool includePrerelease, int skip, int take, string feedName) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] SearchCount: {0}", searchTerm), ConsoleColor.Magenta); JObject obj = await FetchJson(context, MakeSearchAddress(searchTerm, isLatestVersion, targetFramework, includePrerelease, skip, take, feedName)); string count = obj != null ? count = obj["totalHits"].ToString() : "0"; await context.WriteResponse(count); }
public async Task Search(InterceptCallContext context, string searchTerm, bool isLatestVersion, string targetFramework, bool includePrerelease, int skip, int take, string feedName) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] Search: {0} ({1},{2})", searchTerm, skip, take), ConsoleColor.Magenta); JObject obj = await FetchJson(context, MakeSearchAddress(searchTerm, isLatestVersion, targetFramework, includePrerelease, skip, take, feedName)); IEnumerable <JToken> data = (obj != null) ? data = obj["data"] : Enumerable.Empty <JToken>(); XElement feed = InterceptFormatting.MakeFeedFromSearch(_source, _passThroughAddress, "Packages", data, ""); await context.WriteResponse(feed); }
public async Task GetPackage(InterceptCallContext context, string id, string version, string feedName) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetPackage: {0} {1}", id, version), ConsoleColor.Magenta); var desiredPackage = await GetPackageCore(context, id, version); if (desiredPackage == null) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "unable to find version {0} of package {1}", version, id)); } XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", new List <JToken> { desiredPackage }, id); await context.WriteResponse(feed); }
public async Task GetAllPackageVersions(InterceptCallContext context, string id) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetAllPackageVersions: {0}", id), ConsoleColor.Magenta); var ids = id.Split(new string[] { " or " }, StringSplitOptions.RemoveEmptyEntries); List <JToken> packages = new List <JToken>(); foreach (var s in ids) { string curId = s.Trim('\''); if (curId.StartsWith("tolower(id) eq '")) { curId = curId.Split('\'')[1]; } // TODO: run in parallel JObject resolverBlob = await FetchJson(context, MakeResolverAddress(curId)); if (resolverBlob == null) { throw new InvalidOperationException(string.Format("package {0} not found", curId)); } foreach (var p in resolverBlob["packages"]) { NuGetVersion version = NuGetVersion.Parse(p["version"].ToString()); // all versions are returned, filter to only stable if needed if (context.Args.IncludePrerelease || !version.IsPrerelease) { p["id"] = resolverBlob["id"]; packages.Add(p); } } } var data = packages.OrderBy(p => p["id"].ToString()).ThenByDescending(p => NuGetVersion.Parse(p["version"].ToString()), VersionComparer.VersionRelease); XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", data, data.Select(p => p["id"].ToString()).ToArray()); await context.WriteResponse(feed); }
public async Task GetLatestVersionPackage(InterceptCallContext context, string id, bool includePrerelease) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetLatestVersionPackage: {0} {1}", id, includePrerelease ? "[include prerelease]" : ""), ConsoleColor.Magenta); JObject resolverBlob = await FetchJson(context, MakeResolverAddress(id)); if (resolverBlob == null) { throw new InvalidOperationException(string.Format("package {0} not found", id)); } JToken latest = ExtractLatestVersion(resolverBlob, includePrerelease); if (latest == null) { throw new InvalidOperationException(string.Format("package {0} not found", id)); } XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", new List <JToken> { latest }, id); await context.WriteResponse(feed); }
public async Task SearchCount(InterceptCallContext context, string searchTerm, bool isLatestVersion, string targetFramework, bool includePrerelease, int skip, int take, string feedName, string sortBy) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] SearchCount: {0}", searchTerm), ConsoleColor.Magenta); JObject obj = await FetchJson(context, MakeSearchAddress(searchTerm, isLatestVersion, targetFramework, includePrerelease, skip, take, feedName, sortBy)); string count = obj != null ? count = obj["totalHits"].ToString() : "0"; await context.WriteResponse(count); }
public async Task GetListOfPackageVersions(InterceptCallContext context, string id) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetListOfPackageVersions: {0}", id), ConsoleColor.Magenta); JObject resolverBlob = await FetchJson(context, MakeResolverAddress(id)); JArray array = new JArray(); // the package may not exist, in that case return an empty array if (resolverBlob != null) { List<NuGetVersion> versions = new List<NuGetVersion>(); foreach (JToken package in resolverBlob["packages"]) { NuGetVersion version = NuGetVersion.Parse(package["version"].ToString()); // all versions are returned, filter to only stable if needed if (context.Args.IncludePrerelease || !version.IsPrerelease) { versions.Add(version); } } versions.Sort(); foreach (NuGetVersion version in versions) { array.Add(version.ToString()); } } await context.WriteResponse(array); }
public async Task Search(InterceptCallContext context, string searchTerm, bool isLatestVersion, string targetFramework, bool includePrerelease, int skip, int take, string feedName, string sortBy) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] Search: {0} ({1},{2})", searchTerm, skip, take), ConsoleColor.Magenta); JObject obj = await FetchJson(context, MakeSearchAddress(searchTerm, isLatestVersion, targetFramework, includePrerelease, skip, take, feedName, sortBy)); IEnumerable<JToken> data = (obj != null) ? data = obj["data"] : Enumerable.Empty<JToken>(); XElement feed = InterceptFormatting.MakeFeedFromSearch(_source, _passThroughAddress, "Packages", data, ""); await context.WriteResponse(feed); }
public async Task GetPackage(InterceptCallContext context, string id, string version, string feedName) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetPackage: {0} {1}", id, version), ConsoleColor.Magenta); var desiredPackage = await GetPackageCore(context, id, version); if (desiredPackage == null) { throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "unable to find version {0} of package {1}", version, id)); } XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", new List<JToken> { desiredPackage }, id); await context.WriteResponse(feed); }
public async Task GetAllPackageVersions(InterceptCallContext context, string id) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetAllPackageVersions: {0}", id), ConsoleColor.Magenta); var ids = id.Split(new string[] { " or " }, StringSplitOptions.RemoveEmptyEntries); List<JToken> packages = new List<JToken>(); foreach (var s in ids) { string curId = s.Trim('\''); if (curId.StartsWith("tolower(id) eq '")) { curId = curId.Split('\'')[1]; } // TODO: run in parallel JObject resolverBlob = await FetchJson(context, MakeResolverAddress(curId)); if (resolverBlob == null) { throw new InvalidOperationException(string.Format("package {0} not found", curId)); } foreach (var p in resolverBlob["packages"]) { NuGetVersion version = NuGetVersion.Parse(p["version"].ToString()); // all versions are returned, filter to only stable if needed if (context.Args.IncludePrerelease || !version.IsPrerelease) { p["id"] = resolverBlob["id"]; packages.Add(p); } } } var data = packages.OrderBy(p => p["id"].ToString()).ThenByDescending(p => NuGetVersion.Parse(p["version"].ToString()), VersionComparer.VersionRelease); XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", data, data.Select(p => p["id"].ToString()).ToArray()); await context.WriteResponse(feed); }
public async Task GetListOfPackages(InterceptCallContext context) { context.Log("[V3 CALL] GetListOfPackages", ConsoleColor.Magenta); var index = await FetchJson(context, context.Args.IncludePrerelease ? new Uri(_listAvailableLatestPrereleaseIndex) : new Uri(_listAvailableLatestStableIndex)); var data = GetListAvailableDataStart(context, index); // apply startswith if needed if (context.Args.PartialId != null) { data = data.Where(e => e["id"].ToString().StartsWith(context.Args.PartialId, StringComparison.OrdinalIgnoreCase)); data = data.TakeWhile(e => e["id"].ToString().StartsWith(context.Args.PartialId, StringComparison.OrdinalIgnoreCase)); } // take only 30 var ids = data.Take(30).Select(p => p["id"].ToString()).ToList(); ids.Sort(StringComparer.InvariantCultureIgnoreCase); JArray array = new JArray(); foreach (var id in ids) { array.Add(id); } await context.WriteResponse(array); }
public async Task GetLatestVersionPackage(InterceptCallContext context, string id, bool includePrerelease) { context.Log(string.Format(CultureInfo.InvariantCulture, "[V3 CALL] GetLatestVersionPackage: {0} {1}", id, includePrerelease ? "[include prerelease]" : ""), ConsoleColor.Magenta); JObject resolverBlob = await FetchJson(context, MakeResolverAddress(id)); if (resolverBlob == null) { throw new InvalidOperationException(string.Format("package {0} not found", id)); } JToken latest = ExtractLatestVersion(resolverBlob, includePrerelease); if (latest == null) { throw new InvalidOperationException(string.Format("package {0} not found", id)); } XElement feed = InterceptFormatting.MakeFeed(_passThroughAddress, "Packages", new List<JToken> { latest }, id); await context.WriteResponse(feed); }