Types/OpenPackage.Source/Nuget.ps1

<#
.SYNOPSIS
    Gets a Nuget package
.DESCRIPTION
    Gets a Nuget package, given a url.

    Nuget packages are already Open Packages
.EXAMPLE
    Get-OpenPackage
#>

param(
[Parameter(Mandatory)]
[uri]$Nuget,

# Any additional headers to pass into a web request.
[Alias('Header')]
[Collections.IDictionary]
$Headers
)

if ($nuget.Segments.Count -lt 2) {
    throw "Not enough information in $nuget"
}
if ($nuget.Segments[1] -notmatch 'api') {
    $nuSegments = $NuGet.Segments -replace 'packages', 'api/v2/package' -join ''
    $nuget = $nuget.Scheme + '://' + $NuGet.DnsSafeHost + $(
        if ($NuGet.Port -notin 80, 443) {
            ":$($NuGet.Port)"
        }
    ) + $nuSegments
}

if ($nuget.Segments[1] -match 'api') {
    if ($headers) {
        $downloadPackage = Invoke-WebRequest -Uri $nuget -Headers $Headers
    } else {
        $downloadPackage = Invoke-WebRequest -Uri $nuget
    }    

    if ($downloadPackage.Content -is [byte[]]) {
        $memoryStream = [IO.MemoryStream]::new($downloadPackage.Content)
        $nugetPackage = [IO.Packaging.Package]::Open($memoryStream, 'OpenOrCreate', 'ReadWrite')
        $nugetPackage | Add-Member NoteProperty MemoryStream $memoryStream -Force        
        $nugetPackage
    }
} else {
    throw "Could not convert $($NuGet) to a package URL"
    return
}