mirror of
https://github.com/bilawalsidhu/gods-eye-view.git
synced 2026-11-06 03:14:00 +00:00
fix(live): cache the oversized-track 502 like other upstream errors (#722)
Keep the new 502, but store it in the 60 s cache as the proxy already does for 404/429: /tracks/all costs OpenSky credits, so an oversized track must not be re-downloaded on every reselect. Update the regression test and credit the fix in CHANGELOG. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
This commit is contained in:
1 parent
0d58d6e1c4
commit
3a23dc393d
3 files changed
+15
-19
No files matched your search
@@ -1,5 +1,11 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
- Aircraft track backfill (`/api/opensky-track`, `/api/adsblol/trace`) now
|
||||||
|
answers 502 when the upstream body exceeds the 5 MB cap, instead of a 200
|
||||||
|
whose error body the client read as an empty track. The failure is cached
|
||||||
|
like other upstream errors, so retries inside the 60 s window do not spend
|
||||||
|
OpenSky credits (Raushankumar0720, #720, #722).
|
||||||
|
|
||||||
- Saving a key from Provider Settings works again on Macs where Nix or
|
- Saving a key from Provider Settings works again on Macs where Nix or
|
||||||
Homebrew coreutils sit ahead of `/bin` on `PATH`. The credential hardener
|
Homebrew coreutils sit ahead of `/bin` on `PATH`. The credential hardener
|
||||||
now spawns Apple's `/bin/chmod -N` by absolute path; GNU `chmod` has no `-N`,
|
now spawns Apple's `/bin/chmod -N` by absolute path; GNU `chmod` has no `-N`,
|
||||||
|
|||||||
@@ -55,9 +55,9 @@ export function trackBackfillProxies() {
|
|||||||
} else {
|
} else {
|
||||||
body = text;
|
body = text;
|
||||||
}
|
}
|
||||||
if (!tooLarge) {
|
// Cache the 502 like any upstream error: /tracks/all costs OpenSky
|
||||||
cachePut(key, { at: Date.now(), status, body });
|
// credits, so a retry inside the window must not re-download the body.
|
||||||
}
|
cachePut(key, { at: Date.now(), status, body });
|
||||||
res.statusCode = status;
|
res.statusCode = status;
|
||||||
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
res.setHeader('Content-Type', 'application/json; charset=utf-8');
|
||||||
res.setHeader('Cache-Control', 'no-store');
|
res.setHeader('Cache-Control', 'no-store');
|
||||||
|
|||||||
@@ -354,27 +354,17 @@ test('military cooldown bounds untrusted Retry-After and defaults server errors'
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
test('track backfill proxy returns 502 and skips cache when upstream response exceeds body cap', async (t) => {
|
test('track backfill proxy returns 502 on an oversized upstream body and caches it as an error', async (t) => {
|
||||||
const tracks = install(providers.trackBackfillProxies(), true);
|
const tracks = install(providers.trackBackfillProxies(), true);
|
||||||
let callCount = 0;
|
let callCount = 0;
|
||||||
t.mock.method(globalThis, 'fetch', async () => {
|
t.mock.method(globalThis, 'fetch', async () => {
|
||||||
callCount++;
|
callCount++;
|
||||||
if (callCount === 1) {
|
|
||||||
return {
|
|
||||||
ok: true,
|
|
||||||
status: 200,
|
|
||||||
headers: new Map(),
|
|
||||||
body: (async function* () {
|
|
||||||
yield Buffer.alloc(6 * 1024 * 1024, 'x');
|
|
||||||
})(),
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return {
|
return {
|
||||||
ok: true,
|
ok: true,
|
||||||
status: 200,
|
status: 200,
|
||||||
headers: new Map(),
|
headers: new Map(),
|
||||||
body: (async function* () {
|
body: (async function* () {
|
||||||
yield Buffer.from(JSON.stringify({ path: [] }));
|
yield Buffer.alloc(6 * 1024 * 1024, 'x');
|
||||||
})(),
|
})(),
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
@@ -385,9 +375,9 @@ test('track backfill proxy returns 502 and skips cache when upstream response ex
|
|||||||
error: 'Upstream track response too large',
|
error: 'Upstream track response too large',
|
||||||
});
|
});
|
||||||
|
|
||||||
// Verify failure was NOT cached: second request invokes upstream again and succeeds
|
// Cached as a 502 (never a 200): a retry inside the window neither
|
||||||
|
// reads as an empty track nor spends OpenSky credits on another download.
|
||||||
const res2 = await tracks('/api/opensky-track', '?icao24=def456');
|
const res2 = await tracks('/api/opensky-track', '?icao24=def456');
|
||||||
assert.equal(res2.statusCode, 200);
|
assert.equal(res2.statusCode, 502);
|
||||||
assert.deepEqual(JSON.parse(res2.body), { path: [] });
|
assert.equal(callCount, 1);
|
||||||
assert.equal(callCount, 2);
|
|
||||||
});
|
});
|
||||||
Reference in new issue
Block a user