补充 Agent HTTP 停止链路回归

验证客户端断开会 drop Axum handler 并释放会话锁

验证 Pingora 将下游断开传播到 api-server 上游
This commit is contained in:
2026-07-22 17:38:42 +08:00
parent 98daad90c0
commit fe3527ff30
2 changed files with 120 additions and 0 deletions
+33
View File
@@ -383,6 +383,8 @@ async function startApiMock() {
const state = {
requests: [],
releaseHold: undefined,
releaseAbortHold: undefined,
closedBeforeResponse: [],
};
const server = http.createServer(async (request, response) => {
let body;
@@ -406,11 +408,20 @@ async function startApiMock() {
headers: request.headers,
body,
});
response.on('close', () => {
if (!response.writableEnded) {
state.closedBeforeResponse.push(request.url || '');
}
});
if (request.url?.endsWith('/hold')) {
await new Promise((resolve) => {
state.releaseHold = resolve;
});
} else if (request.url?.endsWith('/abort-hold')) {
await new Promise((resolve) => {
state.releaseAbortHold = resolve;
});
} else if (request.url?.endsWith('/upstream-close')) {
request.socket.destroy();
return;
@@ -1006,6 +1017,7 @@ async function runSmokeCases(
await expectChunkedLimit(baseUrl, '/api/upload');
await expectConcurrencyLimit(baseUrl, api);
await expectDownstreamAbortCancelsUpstream(baseUrl, api);
const rateLimitHeaders = { 'X-Forwarded-For': '203.0.113.13' };
const beforeRateLimitRequestCount = api.state.requests.length;
@@ -1695,6 +1707,27 @@ async function expectConcurrencyLimit(baseUrl, api) {
}
}
async function expectDownstreamAbortCancelsUpstream(baseUrl, api) {
console.log('[pingora-gateway-smoke] 下游中断传播到 API 上游');
const route = '/api/abort-hold';
const hold = await openRawHttpRequest(`${baseUrl}${route}`, {
'X-Forwarded-For': '203.0.113.16',
});
try {
await waitForCondition(
() => typeof api.state.releaseAbortHold === 'function',
);
hold.socket.destroy();
await hold.done.catch(() => undefined);
await waitForCondition(() =>
api.state.closedBeforeResponse.includes(route),
);
} finally {
api.state.releaseAbortHold?.();
}
}
async function expectWebSocketUpgrade(baseUrl, route, spacetime) {
console.log('[pingora-gateway-smoke] SpacetimeDB WebSocket Upgrade');
const url = new URL(route, baseUrl);