Exemplo n.º 1
0
        private static async Task Browse(IOwinContext context)
        {
            string redirectTo;

            var q    = context.Request.Query;
            var hash = q["hash"];

            if (string.IsNullOrEmpty(hash))
            {
                string       error        = null;
                var          source       = q["source"];
                var          packageId    = q["packageId"];
                var          version      = q["version"];
                NuGetVersion nugetVersion = null;

                if (string.IsNullOrWhiteSpace(packageId))
                {
                    error = "Package ID is required";
                }
                else if (!string.IsNullOrWhiteSpace(version) && !NuGetVersion.TryParse(version, out nugetVersion))
                {
                    error = "Version is not valid as NuGetVersion";
                }

                if (error != null)
                {
                    await context.Response.Error(400, new ErrorModel(error)).ConfigureAwait(false);

                    return;
                }

                var packageDir = await NuGetUtility.GetPackage(source, packageId, nugetVersion).ConfigureAwait(false);

                var s = packageDir.FullName.Split(Path.DirectorySeparatorChar);
                redirectTo = string.Format("repositories/{0}/{1}/",
                                           s[s.Length - 2], // repository hash
                                           s[s.Length - 1]  // package name and version
                                           );
            }
            else
            {
                redirectTo = string.Concat("upload/", hash, "/");
            }

            context.Response.StatusCode = 303;
            context.Response.Headers.Set("Location", string.Concat(
                                             context.Request.Uri.GetLeftPart(UriPartial.Path),
                                             "/",
                                             redirectTo
                                             ));
        }
Exemplo n.º 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);
        }