fix: validate msteams error status codes · openclaw/openclaw@f7507fd
steipete
·
2026-05-29
·
via Recent Commits to openclaw:main
| Original file line number | Diff line number | Diff line change |
|---|
@@ -59,6 +59,14 @@ describe("msteams errors", () => {
|
59 | 59 | ).toBeUndefined(); |
60 | 60 | }); |
61 | 61 | |
| 62 | +it("does not parse partial or fractional status codes", () => { |
| 63 | +expect(classifyMSTeamsSendError({ statusCode: "429oops" }).kind).toBe("unknown"); |
| 64 | +expect(classifyMSTeamsSendError({ statusCode: 429.5 }).kind).toBe("unknown"); |
| 65 | +expect( |
| 66 | +classifyMSTeamsSendError({ response: { status: "503 temporarily unavailable" } }).kind, |
| 67 | +).toBe("unknown"); |
| 68 | +}); |
| 69 | + |
62 | 70 | it("classifies transient errors", () => { |
63 | 71 | const result = classifyMSTeamsSendError({ statusCode: 503 }); |
64 | 72 | expect(result.kind).toBe("transient"); |
|
| Original file line number | Diff line number | Diff line change |
|---|
@@ -33,28 +33,31 @@ function extractStatusCode(err: unknown): number | null {
|
33 | 33 | if (!isRecord(err)) { |
34 | 34 | return null; |
35 | 35 | } |
36 | | -const direct = err.statusCode ?? err.status; |
37 | | -if (typeof direct === "number" && Number.isFinite(direct)) { |
38 | | -return direct; |
39 | | -} |
40 | | -if (typeof direct === "string") { |
41 | | -const parsed = Number.parseInt(direct, 10); |
42 | | -if (Number.isFinite(parsed)) { |
43 | | -return parsed; |
| 36 | +const parseStatusCode = (value: unknown): number | null => { |
| 37 | +if (typeof value === "number") { |
| 38 | +return Number.isInteger(value) && value >= 100 && value <= 599 ? value : null; |
| 39 | +} |
| 40 | +if (typeof value === "string") { |
| 41 | +const trimmed = value.trim(); |
| 42 | +if (!/^\d{3}$/.test(trimmed)) { |
| 43 | +return null; |
| 44 | +} |
| 45 | +const parsed = Number(trimmed); |
| 46 | +return parsed >= 100 && parsed <= 599 ? parsed : null; |
44 | 47 | } |
| 48 | +return null; |
| 49 | +}; |
| 50 | +const direct = err.statusCode ?? err.status; |
| 51 | +const directStatus = parseStatusCode(direct); |
| 52 | +if (directStatus !== null) { |
| 53 | +return directStatus; |
45 | 54 | } |
46 | 55 | |
47 | 56 | const response = err.response; |
48 | 57 | if (isRecord(response)) { |
49 | | -const status = response.status; |
50 | | -if (typeof status === "number" && Number.isFinite(status)) { |
51 | | -return status; |
52 | | -} |
53 | | -if (typeof status === "string") { |
54 | | -const parsed = Number.parseInt(status, 10); |
55 | | -if (Number.isFinite(parsed)) { |
56 | | -return parsed; |
57 | | -} |
| 58 | +const responseStatus = parseStatusCode(response.status); |
| 59 | +if (responseStatus !== null) { |
| 60 | +return responseStatus; |
58 | 61 | } |
59 | 62 | } |
60 | 63 | |
|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。