Exemple #1
0
 private Task BrowseUpload(IOwinContext context, string hash, string path)
 {
     return(this.BrowseImpl(context, NuGetUtility.GetUploadedPackage(hash), path));
 }
Exemple #2
0
        public override async Task Invoke(IOwinContext context)
        {
            if (context.RespondNotModified())
            {
                return;
            }

            var q               = context.Request.Query;
            var hash            = q["hash"];
            var source          = q["source"];
            var packageId       = q["packageId"];
            var version         = q["version"];
            var targetFramework = q["targetFramework"];

            var model = new CompatibilityModel
            {
                PackageSelector = new PackageSelectorModel
                {
                    DefaultSource          = source,
                    DefaultPackageId       = packageId,
                    DefaultVersion         = version,
                    DefaultTargetFramework = targetFramework
                }
            };
            var statusCode = 200;

            try
            {
                PackageFolderReader package;

                if (string.IsNullOrEmpty(hash))
                {
                    if (string.IsNullOrWhiteSpace(packageId))
                    {
                        // Homepage of NuGetCalc Online
                        await context.Response.View(new Views.CompatibilityStatic(), model.PackageSelector).ConfigureAwait(false);

                        return;
                    }
                    if (string.IsNullOrWhiteSpace(targetFramework))
                    {
                        statusCode  = 400;
                        model.Error = "Target Framework is required.";
                        goto RESPOND;
                    }

                    NuGetVersion nugetVersion = null;
                    if (!string.IsNullOrWhiteSpace(version) && !NuGetVersion.TryParse(version, out nugetVersion))
                    {
                        statusCode  = 400;
                        model.Error = "Version is not valid as NuGetVersion.";
                        goto RESPOND;
                    }

                    var packageDir = NuGetUtility.GetPackage(source, packageId, nugetVersion).Result; // avoid compile error on mono
                    package = new PackageFolderReader(packageDir);
                }
                else
                {
                    package = new PackageFolderReader(NuGetUtility.GetUploadedPackage(hash));
                    model.PackageSelector.UploadHash      = hash;
                    model.PackageSelector.UploadedPackage = package.GetIdentity();
                }

                using (package)
                {
                    context.Request.CallCancelled.ThrowIfCancellationRequested();

                    var identity = package.GetIdentity();
                    model.PackageSelector.DefaultPackageId = identity.Id;
                    model.PackageSelector.DefaultVersion   = identity.Version.ToString();
                    // NuGetFramework.Parse will throw only ArgumentNullException
                    var nugetFramework = NuGetFramework.Parse(targetFramework);

                    var referenceItems = NuGetUtility.FindMostCompatibleReferenceGroup(package, nugetFramework);
                    if (referenceItems != null)
                    {
                        model.ReferenceAssemblies = referenceItems.Items;
                    }

                    var depenencyItems = NuGetUtility.FindMostCompatibleDependencyGroup(package, nugetFramework);
                    if (depenencyItems != null)
                    {
                        model.Dependencies = depenencyItems.Packages;
                    }
                }

                GC.Collect(); // to release a handle of nuspec file
            }
            catch (NuGetUtilityException ex)
            {
                statusCode  = 500;
                model.Error = ex.Message;
                if (ex.InnerException != null)
                {
                    model.Exception = ex.InnerException;
                }
            }

RESPOND:
            context.Response.StatusCode = statusCode;
            await context.Response.View(new Views.Compatibility(), model).ConfigureAwait(false);
        }