fix: accept compressed Robot revision ETags

This commit is contained in:
2026-08-15 20:48:54 +08:00
parent a26a53a7f4
commit ea75b0618a
3 changed files with 154 additions and 9 deletions

View File

@@ -11,7 +11,7 @@ const MAX_RESPONSE_BYTES = 256 * 1024;
const DEFAULT_TIMEOUT_MS = 15_000;
const LOCAL_ROOT = '/api/works/ai-hardware';
const UPSTREAM_ROOT = '/api/ai-hardware';
const STRONG_REVISION = /^"(0|[1-9]\d*)"$/;
const REVISION_ETAG = /^(?:W\/)?"(0|[1-9]\d*)"$/;
const LOCAL_ID = /^[A-Za-z0-9][A-Za-z0-9_-]{0,35}$/;
const OPERATION_ID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const MAX_RETRY_AFTER_SECONDS = 2;
@@ -285,9 +285,9 @@ function validateConfigUpdate(body: Record<string, unknown>): Record<string, unk
return output;
}
function strongRevisionFrom(response: Response): number {
function revisionFromEtag(response: Response): number {
const etag = response.headers.get('etag');
const match = etag?.match(STRONG_REVISION);
const match = etag?.match(REVISION_ETAG);
if (!match) throw new SafeRouteError(502, 'AI_HARDWARE_INVALID_ETAG', 'AI hardware service returned an invalid revision', true);
const revision = Number(match[1]);
if (!Number.isSafeInteger(revision)) throw new SafeRouteError(502, 'AI_HARDWARE_INVALID_ETAG', 'AI hardware service returned an invalid revision', true);
@@ -559,7 +559,7 @@ export function createAiHardwareRouteHandler(dependencies: AiHardwareRouteDepend
}
let revision: number | undefined;
try {
revision = requireEtag ? strongRevisionFrom(response) : undefined;
revision = requireEtag ? revisionFromEtag(response) : undefined;
} catch (error) {
await cancelTimedResponse(activeCall);
throw error;