070959e133
landing-page-staging / Deploy landing page to staging (push) Has been skipped
landing-page-ci / Validate landing page (push) Failing after 4s
visual-baseline / Capture visual baselines (push) Has been cancelled
bake-plugin-previews / Bake plugin previews (push) Has been cancelled
80 lines
2.5 KiB
PowerShell
80 lines
2.5 KiB
PowerShell
param(
|
|
[string]$MetadataUrl = ""
|
|
)
|
|
|
|
$ErrorActionPreference = "Stop"
|
|
|
|
function Resolve-MetadataUrl {
|
|
if (-not [string]::IsNullOrWhiteSpace($MetadataUrl)) {
|
|
return $MetadataUrl
|
|
}
|
|
if (-not [string]::IsNullOrWhiteSpace($env:PUBLISHED_METADATA_URL)) {
|
|
return $env:PUBLISHED_METADATA_URL
|
|
}
|
|
throw "published metadata URL is required"
|
|
}
|
|
|
|
function Get-RequiredWebResponse([string]$Url) {
|
|
if ([string]::IsNullOrWhiteSpace($Url)) {
|
|
throw "missing required public URL"
|
|
}
|
|
return Invoke-WebRequest -UseBasicParsing -Uri $Url -Method Get
|
|
}
|
|
|
|
function Parse-JsonBody([string]$Body) {
|
|
if ([string]::IsNullOrWhiteSpace($Body)) {
|
|
throw "response body is empty"
|
|
}
|
|
$objectStart = $Body.IndexOf('{')
|
|
$arrayStart = $Body.IndexOf('[')
|
|
if ($objectStart -lt 0 -and $arrayStart -lt 0) {
|
|
throw "response body does not look like JSON"
|
|
}
|
|
if ($objectStart -ge 0 -and $arrayStart -ge 0) {
|
|
$start = [Math]::Min($objectStart, $arrayStart)
|
|
} elseif ($objectStart -ge 0) {
|
|
$start = $objectStart
|
|
} else {
|
|
$start = $arrayStart
|
|
}
|
|
return ($Body.Substring($start) | ConvertFrom-Json)
|
|
}
|
|
|
|
function Assert-PublicRangeReadable([string]$Url) {
|
|
if ([string]::IsNullOrWhiteSpace($Url)) {
|
|
throw "missing installer URL for public-read probe"
|
|
}
|
|
& curl.exe --ssl-no-revoke --fail --silent --show-error --location --range 0-0 --output NUL $Url
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "public artifact probe failed for $Url"
|
|
}
|
|
}
|
|
|
|
$resolvedMetadataUrl = Resolve-MetadataUrl
|
|
$metadataResponse = Get-RequiredWebResponse $resolvedMetadataUrl
|
|
$metadata = Parse-JsonBody $metadataResponse.Content
|
|
$win = $metadata.platforms.win
|
|
if ($null -eq $win) {
|
|
throw "published metadata is missing platforms.win"
|
|
}
|
|
|
|
$metadataLinks = if ($null -ne $metadata.storage) { $metadata.storage } else { $metadata.r2 }
|
|
$platformLinks = if ($null -ne $win.storage) { $win.storage } else { $win.r2 }
|
|
|
|
$smallUrls = @(
|
|
[string]$resolvedMetadataUrl,
|
|
[string]$metadataLinks.versionMetadataUrl,
|
|
[string]$win.feed.latestUrl,
|
|
[string]$platformLinks.latestManifestUrl,
|
|
[string]$platformLinks.versionManifestUrl,
|
|
[string]$win.artifacts.installer.sha256Url
|
|
) | Where-Object { -not [string]::IsNullOrWhiteSpace($_) } | Select-Object -Unique
|
|
|
|
foreach ($url in $smallUrls) {
|
|
$response = Get-RequiredWebResponse $url
|
|
Write-Host "public ok: $url ($($response.StatusCode))"
|
|
}
|
|
|
|
Assert-PublicRangeReadable ([string]$win.artifacts.installer.url)
|
|
Write-Host "public ok: $($win.artifacts.installer.url) (range GET)"
|