fix(cdn): resolve a pull zone when the API answers with a bare array #178

Merged
pat-s merged 1 commit from fix/purge-zone-lookup into main 2026-08-31 09:55:38 +00:00
Owner

Motivation

Every reindex reports failure at the purge step:

Purging BunnyCDN pull zone 3857050
Purged pull zone 3857050 (HTTP 204)
jq: error (at /tmp/tmp.eFPFmO:0): Cannot index array with string "Items"
Could not find BunnyCDN pull zone for hostname cran.allianceswisspass.devxy.io

cran.rpkgs.com purges fine. The Alliance zone never has, so it is still serving objects that rebuilds replaced, behind a ~370-day cache_expiration_time.

The defect

jq -r '(.Items // .)[] | ...'

This was meant to accept both response shapes. It accepts neither: indexing an array with a string is an error in jq, not a null, so // never gets the chance to substitute and the whole expression aborts. The listing endpoint answers with a bare array for this account, so the lookup has always failed.

Change

  • Select the array explicitly by type instead of relying on // to absorb an error.
  • Check the HTTP status of the listing call. It was previously used unconditionally, so an auth or rate-limit failure surfaced as "could not find hostname" — pointing at the wrong thing entirely.
  • Fail when a hostname matches multiple zones rather than silently purging whichever jq emitted first.
  • Request perPage=1000, so a paginated response cannot silently truncate the zone list.

Verification

Ran the current main script and the fixed one against a stubbed curl returning an array-shaped listing:

=== BEFORE (main) ===
Purged pull zone 3857050 (HTTP 204)
jq: error (at ...): Cannot index array with string ("Items")
Could not find BunnyCDN pull zone for hostname cran.allianceswisspass.devxy.io

=== AFTER ===
Purged pull zone 3857050 (HTTP 204)
Purging BunnyCDN pull zone 222
Purged pull zone 222 (HTTP 204)

The jq expression was also checked against both an array-shaped and an object-shaped (.Items) response; the old one fails the array case, the new one handles both. shellcheck clean.

## Motivation Every reindex reports `failure` at the purge step: ``` Purging BunnyCDN pull zone 3857050 Purged pull zone 3857050 (HTTP 204) jq: error (at /tmp/tmp.eFPFmO:0): Cannot index array with string "Items" Could not find BunnyCDN pull zone for hostname cran.allianceswisspass.devxy.io ``` `cran.rpkgs.com` purges fine. The Alliance zone never has, so it is still serving objects that rebuilds replaced, behind a ~370-day `cache_expiration_time`. ## The defect ```sh jq -r '(.Items // .)[] | ...' ``` This was meant to accept both response shapes. It accepts neither: indexing an array with a string is an **error** in jq, not a null, so `//` never gets the chance to substitute and the whole expression aborts. The listing endpoint answers with a bare array for this account, so the lookup has always failed. ## Change - Select the array explicitly by type instead of relying on `//` to absorb an error. - Check the HTTP status of the listing call. It was previously used unconditionally, so an auth or rate-limit failure surfaced as "could not find hostname" — pointing at the wrong thing entirely. - Fail when a hostname matches multiple zones rather than silently purging whichever jq emitted first. - Request `perPage=1000`, so a paginated response cannot silently truncate the zone list. ## Verification Ran the current `main` script and the fixed one against a stubbed `curl` returning an array-shaped listing: ``` === BEFORE (main) === Purged pull zone 3857050 (HTTP 204) jq: error (at ...): Cannot index array with string ("Items") Could not find BunnyCDN pull zone for hostname cran.allianceswisspass.devxy.io === AFTER === Purged pull zone 3857050 (HTTP 204) Purging BunnyCDN pull zone 222 Purged pull zone 222 (HTTP 204) ``` The jq expression was also checked against both an array-shaped and an object-shaped (`.Items`) response; the old one fails the array case, the new one handles both. `shellcheck` clean.
The zone lookup used `.Items // .` to accept both response shapes. It
accepts neither: indexing an array with a string is an error in jq, not a
null, so `//` never substitutes and the whole expression aborts with
"Cannot index array with string".

The listing endpoint answers with a bare array for this account, so every
purge of cran.allianceswisspass.devxy.io has been failing. Reindex
pipelines reported failure at the purge step while the reindex itself had
succeeded, and that zone kept serving objects the rebuild replaced.

Also surfaced by the same failure:

- The listing response was used without checking the HTTP status, so an
  auth or rate-limit error was reported as a missing hostname.
- A hostname matching several zones silently purged only the first.

Verified against stubbed array-shaped and object-shaped responses; the
previous script fails the array case.
pat-s merged commit 85295a9495 into main 2026-08-31 09:55:38 +00:00
pat-s deleted branch fix/purge-zone-lookup 2026-08-31 09:55:38 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
devxy/build-cran-binaries!178
No description provided.